So es gibt kein SysMenu mehr überprüfe das einfach anhand der GWL_STYLE
Weder Unsichtbar noch sonst was.
Du kannst aber das Window nun trotzdem verschieben.
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
Menu: HMENU;
MenuItems: Integer;
i: Integer;
Style: DWord;
begin
Menu := GetSystemMenu(
Handle, false);
if Menu <> 0
then
begin
MenuItems := GetMenuItemCount(Menu);
if MenuItems <> 0
Then
for i := MenuItems - 1
DownTo 0
do
RemoveMenu(Menu, i, MF_BYPOSITION);
end;
Style := GetWindowLong(
Handle, GWL_STYLE);
Style := Style
and not WS_SYSMENU;
SetWindowLong(
Handle, GWL_STYLE, GetWindowLong(
Handle, Style)
or WS_BORDER
or WS_SIZEBOX
or WS_DLGFRAME
or WS_OVERLAPPED);
end;
Danke für den Tipp aber leider kommt das auf das selbe raus wenn ich in der Option BorderIcons das Systemmenü abschalten, es verschwindet der X-Button, den ich aus Design Gründen ganz gerne behalten würde. Alles nicht so das ware, es läuft wohl auf einen Kompromiss hinaus.
Wobei meine erste Lösung zumindest die ALT+Leertaste Problematik behebt, danach war mir auf gefallen das schon das alleinige drücken von ALT das Menü aufruft, auch wenn es nicht sichtbar ist.
Delphi-Quellcode:
private
procedure WMInitMenuPopup(var Msg: TWMInitMenuPopup); message WM_INITMENUPOPUP;
procedure TForm1.WMInitMenuPopup(var Msg: TWMInitMenuPopup);
begin
inherited;
if Msg.SystemMenu then
begin
//Beendet das Menü sofort wieder
EndMenu;
//Einträge können gelöscht werden, da aber eh nicht sichtbar also auch nicht nötig.
//Außerdem sorgt dafür das löschen des "Schließen" Eintrags dafür das das "Rote X" deaktiviert wird und gräulich dargestellt wird
DeleteMenu(msg.MenuPopUp, SC_MOVE, MF_BYCOMMAND);
DeleteMenu(msg.MenuPopUp, SC_CLOSE, MF_BYCOMMAND);
end;{if}
end;