Systemmenü verkleinern
Aus dem Systemmenü können Menüpunkte problemlos gelöscht werden. Die entscheidene Funktion ist DeleteMenu, die als zweiten Parameter die Nummer des Menüpunkts erwartet. Die Menüpunkte sind von oben nach unten beginnend bei 0 durchnummeriert. Löscht man beispielsweise den obersten Menüpunkt (Nummer: 0) rutschen die unteren Menüpunkte auch mit der Nummerierung nach oben.
Folgende Prozedur löscht den Schließen-Eintrag (Nummer: 6) und den Menütrennstrich (Nummer: 5) aus dem Systemmenü einer Anwendung:
procedure TForm1.Button1Click(Sender: TObject); var Handle: THandle; begin Handle := GetSystemMenu(Self.Handle, False); if Handle0 then begin if not DeleteMenu(Handle, 6, MF_BYPOSITION) then RaiseLastOSError; if not DeleteMenu(Handle, 5, MF_BYPOSITION) then RaiseLastOSError; end; end;
Da sich die Reihenfolge durch das Löschen und Hinzufügen von Einträgen während des Programmablaufs ändern kann, gibt es auch die Möglichkeit die Menüeintrage anhand ihrer ID-Nummer zu identifizieren.Die IDs der Menüeinträge sind bereits in der Windows.pas als Konstanten deklariert. Hier die wichtigsten Konstanten:
SC_RESTORE = Wiederherstellen SC_MOVE = Verschieben SC_SIZE = Größe ändern SC_MINIMIZE = Minimieren SC_MAXIMIZE = Maximieren SC_CLOSE = Schließen
Der Menüteiler hat die ID 0.
Mithilfe des Parameters MF_BYCOMMAND werden die Menüeinträge über ihre ID gelöscht. Dazu muss die entsprechende Konstante dem zweiten Parameter übergeben werden:
procedure TForm1.Button1Click(Sender: TObject); var Handle: THandle; begin Handle := GetSystemMenu(Self.Handle, False); if Handle0 then begin if not DeleteMenu(Handle, SC_CLOSE, MF_BYCOMMAND) then RaiseLastOSError; end; end;
RaiseLastOSError ist erst ab Delphi 6 verfügbar. Programmierer, die mit älteren Versionen arbeiten müssen an dieser Stelle RaiseLastWin32Error verwenden.Wie sie das Systemmenü erweitern, können Sie unter den Verweisen lesen.