Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Event bei Fokusverlust (an Menü) (https://www.delphipraxis.net/181463-event-bei-fokusverlust-menue.html)

himitsu 18. Aug 2014 10:09

Event bei Fokusverlust (an Menü)
 
Moin Moin,

ich bin auf der Suche nach einer Windows-Message, wenn meine Komponente den Fokus verliert, allerdings geht es hierbei darum, wenn der Fokus zu Menüs übergeht, also kein OnEnter, OnExit, oder Dergleichen, denn sowas wird dabei nicht ausgelöst.

Wenn ein Popupmenü aufgeht, egal ob über Maus oder Tastatur, dann erhält man ja WM_CONTEXTMENU, aber was ist es bei einem Hauptmenü?

Sowas wie WM_INITMENU, WM_MENUCOMMAND, WM_COMMAND kommt jedenfalls nicht vorbei, im Application-OnMessage.
Es geht vorallem um die Alt-Taste, also wenn man die Drückt, bzw. erst dann, wenn man sie wieder loslässt, ohne zwischendurch eine andere Taste gedrückt zu haben, dann landet der Fokus ja im Menü.


Und dann natürlich noch das ein Ereignis, wenn der Fokus irgendwie wieder zur Komponente zurückkommt.


Vielen Dank für's Lesen
Frank

Volker Z. 18. Aug 2014 15:38

AW: Event bei Fokusverlust (an Menü)
 
Hallo,

Zitat:

[...] aber was ist es bei einem Hauptmenü?
Vielleicht hilft Dir das Einfangen von WM_ENTERMENULOOP bzw. WM_EXITMENULOOP weiter

Gruß

himitsu 18. Aug 2014 15:45

AW: Event bei Fokusverlust (an Menü)
 
Delphi-Quellcode:
  case Msg.message of
    WM_CONTEXTMENU:
      Beep;
    WM_INITMENU:
      Beep;
    WM_INITMENUPOPUP:
      Beep;
    WM_MENUSELECT:
      Beep;
    WM_MENUCHAR:
      Beep;
    WM_MENUCOMMAND:
      Beep;
    WM_COMMAND:
      Beep;
    WM_ENTERMENULOOP:
      Beep;
    WM_EXITMENULOOP:
      Beep;
    WM_GETTITLEBARINFOEX:
      Beep;
    WM_MENUDRAG:
      Beep;
    WM_MENUGETOBJECT:
      Beep;
    WM_MENURBUTTONUP:
      Beep;
    WM_NEXTMENU:
      Beep;
    else
      Beep;
  end;
Überall ein Haltepunkt rein (außer beim Else, denn aufgrund der Masse hatte ich jetzt noch keine Zeit mich da reinzukämpfen, da dort ja nahezu alles von der Anwendung vorbei kommt)
und das Einzige, wo es bisher anhielt, war das WM_CONTEXTMENU.

Hängt am TApplicationEvents.OnMessage

[edit] Auch im DefaultHandler der Komponente, mit dem Einkabefokus (ActiveControl), kommt nur das CONTEXTMENU vorbeigehoppelt.

Mikkey 18. Aug 2014 16:00

AW: Event bei Fokusverlust (an Menü)
 
Ich habe mir vor längerer Zeit auch schon mal die Zähne an Menüs ausgebissen.

Hier http://msdn.microsoft.com/en-us/libr...#menu_messages findest Du vielleicht etwas, oder ...

was ich damals versucht habe:

Speichere sämtliche unterschiedlichen Windows-Messages, die im Else-Zweig ankommen. Dann kannst Du in Ruhe durchsehen, welche davon evtl. nützlich sein können.

Viel Spaß ;-)

himitsu 18. Aug 2014 16:08

AW: Event bei Fokusverlust (an Menü)
 
Ich glaub die dort genannten Messages sind alle schon in dem CASE, da oben, enthalten. :?


Zitat:

Zitat von Mikkey (Beitrag 1269003)
Speichere sämtliche unterschiedlichen Windows-Messages, die im Else-Zweig ankommen. Dann kannst Du in Ruhe durchsehen, welche davon evtl. nützlich sein können.

"in Ruhe durchsehen" erstmal die Zeit finden beim Debuggen und ständigen Neukompilieren die Messages zu sammeln, dann noch die Nummern in die Namen WM_xyz übersetzen und dann hoffen es findet sich was passendes ... aber erstmal Zeit dafür finden.

Ich glaub ich hab daheim noch irgendwo eine Debugfunktion, welche Message/LPARAM/WPARAM in diese Namen übersetzt, um das nicht alles neu/manuell zu lachen ... nja, mal sehn ob ich's dann finde.



Ach ja, mein Hauptproblem liegt übrigens darin, daß meine Komponente das Loslassen der Alt-Taste nicht mitbekommt, wenn man Alt drückt und loslässt, ohne zwischendurch was Anderes zu drücken, da das Loslassen dann ans Menü übergeht.

Und am Besten wäre es noch, wenn beim Fokusverlust (auch an ein Menü) etwas in der Komponente ausgeblendet wird, was natürlich wieder aktivert werden soll, wenn der Fokus zurück ist.
Aber es würde auch schon reichen, wenn ich wenigstens das Loslassen mitbekommen würde, ohne gleich mit Timer und Co. der Taste versuchen muß ständig pollend hinterherzurennen.
> Grund, über Strg/Alt/Shift kann der Anzeigemodus umgrstellt werden, solange man die Taste(n) drückt.

Whookie 18. Aug 2014 16:37

AW: Event bei Fokusverlust (an Menü)
 
Bei einem kurzen Test mit einem TEdit und überschriebener WindowProc krieg ich folgendes raus, wenn ich mal Alt- drücke:

000025117408: CN_SYSKEYDOWN ($BD04) [wParam: 18, lParam 540540929]
000025117408: CM_CHILDKEY ($B02E) [wParam: 18, lParam 18440288]
000025117408: CM_DIALOGKEY ($B005) [wParam: 18, lParam 540540929]
000025117424: WM_SYSKEYDOWN ($0104) [wParam: 18, lParam 540540929]
000025117424: WM_NCHITTEST ($0084) [wParam: 0, lParam 21037326]
000025117518: unknown (48389) ($BD05) [wParam: 18, lParam -1070071807]
000025117518: WM_SYSKEYUP ($0105) [wParam: 18, lParam -1070071807]
000025117518: CM_CANCELMODE ($B004) [wParam: 0, lParam 0]


Ausgabe ist hier in ein kleines eigenes Tool mit einer debug unit die mir (die meisten) Messages dekodiert...

himitsu 19. Aug 2014 09:10

AW: Event bei Fokusverlust (an Menü)
 
WM_SYSKEYUP klang gut, aber das funktioniert auch nicht. :cry:

Eventuell liegt es auch an dem kranken Tastaturhookhack vom DevExpress-Ribbon.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz