![]() |
Aufruf des Systemmenü eines Fensters verhindern
Hi,
ich versuche gerade einen Weg zu finden wie ich verhindern kann das das Systemmenü eines Fensters aufgerufen werden kann. Ohne in der Option 'BorderIcons' das Menü zu deaktivieren, dann verschwindet das "Rote X" und BorderStyle bsToolWindow ist auch keine Option. Mein erster weg war einfach im OnCreate() von TForm die Einträge aus dem Menü zu löschen was auch funktioniert und das Menü scheint auch weg zu sein. Mir ist dann aber aufgefallen das man das Menü trotzdem noch mit der Tastenkombination ALT + Leertaste aufrufen kann, es ist zwar nicht sichtbar aber der Fokus liegt dann trotzdem im Menü und nicht mehr auf der Form selbst. Das möchte ich gerne unterbinden. Bei meiner Recherche bin ich auf zwei Windows Botschaften gestoßen WM_INITMENU und WM_INITMENUPOPUP jedoch finde ich keine wirkliche Lösung wie ich diese Botschaften abfangen und quasi verwerfen kann so das das Systemmenü einfach nicht aufgerufen wird. Ich habe es mal mit WndProc versucht und ja die Botschaften werden abgefangen, aber wie verwerfe ich diese nun?
Delphi-Quellcode:
.
. . private procedure WndProc(var msg: TMessage); override; procedure TForm1.WndProc(var msg: TMessage); begin if (msg.Msg = WM_INITMENU) or (msg.Msg = WM_INITMENUPOPUP) then begin ShowMessage('Bla Bla Mr. Freeman'); end else inherited; end; |
AW: Aufruf des Systemmenü eines Fensters verhindern
Für den Fall das es noch jemanden interessiert, ich habe inzwischen eine Akzeptable Lösung gefunden. Das Menü erscheint nicht mehr beim drücken der Tastenkombination ALT + Leertaste und der Focus hängt auch nicht mehr im unsichtbaren Menü fest.
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; |
AW: Aufruf des Systemmenü eines Fensters verhindern
Ich kenne mich mit den Windows-Messages nicht so aus, aber weshalb in jedem Fall das
Delphi-Quellcode:
? Würde man das eben gerade nicht den Standard-Handler ranlassen wollen und einfach nur das LRESULT der Message auf Null sezten?
inherited
Ich rede nur vor so mich hin, ausprobiert habe ich nichts... |
AW: Aufruf des Systemmenü eines Fensters verhindern
Zitat:
Delphi-Quellcode:
procedure TfrmDlgIdent.WMInitMenuPopup(var Msg: TWMInitMenuPopup);
begin Msg.Result := 0; end; |
AW: Aufruf des Systemmenü eines Fensters verhindern
1. GetSystemMenu
2. GetMenuItemCount 3. RemoveMenu gruss |
AW: Aufruf des Systemmenü eines Fensters verhindern
Zitat:
Wenn ich die Eintrage aus dem Systemmenü lösche ist es trotzdem noch da, zwar unsichtbar, aber durch drücken der Tastenkombination ALT+Leertaste bekommt das Menü trotzdem den Focus und das will ich grade nicht. |
AW: Aufruf des Systemmenü eines Fensters verhindern
Zitat:
Bei mir geht kein Menu mehr auf auch nicht mit ALT-SPACE Dir sollte aber eins klar sein das durch die Manipulation und des kompletten entfernen des System Menüs der X-Button deaktiviert und das Window sich nicht mehr verschieben lässt. Also man sollte schon wissen was man da tut. gruss |
AW: Aufruf des Systemmenü eines Fensters verhindern
Zitat:
Ja ich weiß das der X-Button deaktiviert wird das ist aber nicht wichtig und verschieben soll sowieso nicht gemacht werden. Die Anwendung soll nur über die Tastatur zu bedienen sein. |
AW: Aufruf des Systemmenü eines Fensters verhindern
Na gut dann bitte..
Delphi-Quellcode:
Wenn du das Window trotzden verschieben möchtest dann ändere einfach die
procedure TForm1.FormShow(Sender: TObject);
var Menu: HMENU; MenuItems: Integer; i: Integer; 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; end; DownTo 0 zu 2 Dann geht zwar das Menu wieder auf aber nur mit zwei Einträgen. Wiederherstellen / Verschieben. Nebenbei ich musste auch des Öfteren MS in Anspruch nehmen ;) Man bekommt nicht überall alles umsonst und muss es sich erarbeiten. Aber sei's drum. gruss |
AW: Aufruf des Systemmenü eines Fensters verhindern
Zitat:
Ist das Menü weg: JA Bekommt das UNSICHTBARE Menü immer noch den Focus: JA Muss ich immer noch ZWEIMAL die ESC-Taste drücken um das Formular zu schließen: JA Ist es das was ich will: NEIN Es tut mir leid das das vielleicht etwas harsch wirkt, aber das ist doch genau das wo von ich die ganze Zeit spreche das es zwar Funktioniert aber nicht so wie ich das will. Vielleicht reden wir auch an einander vorbei. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz