Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 14:12
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;
  Mit Zitat antworten Zitat