jaenicke hat folgendes geschrieben : |
mandras hat folgendes geschrieben : | Ich denke es liegt am Mapping eines Windows-Menüs auf die VCL-Ebene. | Nein, es liegt wohl eher am Windows-Menü selbst.  |
Das meinte ich mit "Mapping".
Immerhin werden "WMMenuSelect"-Nachrichten gesendet. Damit kann ich festellen welcher Menüeintrag von der Maus gerade geärgert wird. Das kann ich abfangen und auch somit die HelpContext der jeweiligen Einträge feststellen. Und in Variablen speichern.
Aber: Solange Windows die Oberhoheit hat (also die Darstellung des Menüs erfolgt etc) reagiert die Applikation nicht auf F1.. Ich würde gerne auf Global Key Hooks verzichten.
Wüßte jemand wie ich auf möglichst einfache Art das Drücken der Taste F1 für die aktuelle Applikation abfangen kann WÄHREND Windows die Menüs handled?
Ja, ich weiß.. esoterische Frage.. Andererseits wäre mir eine konsistente Online-Hilfe auch ganz lieb. "Intiutiv" wäre das richtige Wort.
Moderiert von
Narses: Beiträge zusammengefasstIch denke ich habe das Problem gelöst.
Falls jemand anderes auch darüber stolpert hier der Code incl. Erläuterungen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
|
procedure Tmainform.WMMenuSelect(var Message: TWMMenuSelect); begin ActiveMenu := Message.Menu; ActiveMenuItem := Message.IDItem; ActiveMenuFlag := Message.MenuFlag; end;
function TMainForm.CheckContextHelp:integer; var MenuItem: TMenuItem; ID: Integer; FindKind: TFindItemKind; begin Result := 0; if Menu <> nil then begin MenuItem := nil; if (ActiveMenuFlag <> $FFFF) or (ActiveMenuItem <> 0) then begin FindKind := fkCommand; ID := ActiveMenuItem; if ActiveMenuFlag and MF_POPUP <> 0 then begin FindKind := fkHandle; ID := GetSubMenu(ActiveMenu, ID); end; MenuItem := Menu.FindItem(ID, FindKind); end; if (MenuItem <> nil) and (MenuItem.Count > 0) then begin if MenuItem.HelpContext <> 0 then Application.HelpContext(MenuItem.HelpContext); Result := 1; end; end; end;
function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt) : LongInt; begin case WordParam of vk_F1: begin result := Mainform.CheckContextHelp; exit; end; end; result:=0; end; |