AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Aufruf des Systemmenü eines Fensters verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Aufruf des Systemmenü eines Fensters verhindern

Ein Thema von TUX_der_Pinguin · begonnen am 17. Feb 2017 · letzter Beitrag vom 17. Feb 2017
Antwort Antwort
TUX_der_Pinguin

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

Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 08:40
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;
  Mit Zitat antworten Zitat
TUX_der_Pinguin

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

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 11:11
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;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 11:22
Ich kenne mich mit den Windows-Messages nicht so aus, aber weshalb in jedem Fall das inherited ? Würde man das eben gerade nicht den Standard-Handler ranlassen wollen und einfach nur das LRESULT der Message auf Null sezten?

Ich rede nur vor so mich hin, ausprobiert habe ich nichts...
  Mit Zitat antworten Zitat
TUX_der_Pinguin

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

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 11:29
Ich kenne mich mit den Windows-Messages nicht so aus, aber weshalb in jedem Fall das inherited ? Würde man das eben gerade nicht den Standard-Handler ranlassen wollen und einfach nur das LRESULT der Message auf Null sezten?

Ich rede nur vor so mich hin, ausprobiert habe ich nichts...
Wenn ich dich jetzt richtig verstehe, du meinst das Ergebnis einfach auf Null setzten und nichts weiteres. Das klappt nicht, das Systemmenu wird trotzdem angezeigt.

Delphi-Quellcode:
procedure TfrmDlgIdent.WMInitMenuPopup(var Msg: TWMInitMenuPopup);
begin
  Msg.Result := 0;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 12:35
1. GetSystemMenu
2. GetMenuItemCount
3. RemoveMenu

gruss
  Mit Zitat antworten Zitat
TUX_der_Pinguin

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

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 12:48
1. GetSystemMenu
2. GetMenuItemCount
3. RemoveMenu

gruss
Und das hilft mir jetzt wie weiter?

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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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