AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Event bei Fokusverlust (an Menü)

Event bei Fokusverlust (an Menü)

Ein Thema von himitsu · begonnen am 18. Aug 2014 · letzter Beitrag vom 19. Aug 2014
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.479 Beiträge
 
Delphi 11 Alexandria
 
#1

Event bei Fokusverlust (an Menü)

  Alt 18. Aug 2014, 11:09
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Event bei Fokusverlust (an Menü)

  Alt 18. Aug 2014, 16:38
Hallo,

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

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.479 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Event bei Fokusverlust (an Menü)

  Alt 18. Aug 2014, 16:45
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu (18. Aug 2014 um 16:57 Uhr)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#4

AW: Event bei Fokusverlust (an Menü)

  Alt 18. Aug 2014, 17:00
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ß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.479 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Event bei Fokusverlust (an Menü)

  Alt 18. Aug 2014, 17:08
Ich glaub die dort genannten Messages sind alle schon in dem CASE, da oben, enthalten.


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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu (18. Aug 2014 um 17:16 Uhr)
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
431 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Event bei Fokusverlust (an Menü)

  Alt 18. Aug 2014, 17:37
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...
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.479 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Event bei Fokusverlust (an Menü)

  Alt 19. Aug 2014, 10:10
WM_SYSKEYUP klang gut, aber das funktioniert auch nicht.

Eventuell liegt es auch an dem kranken Tastaturhookhack vom DevExpress-Ribbon.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf