Servus,
ich versuche die Inhalte eines Menüs auszulesen. Die Ermittlung der Menüeinträge sollte möglichst mit API-Befehlen erfolgen, um das Ganze auch auf Fremdanwendungen auszudehnen. Mit der Taste [Alt] wechselt man ja in den ersten Menüeintrag einer Anwendung. Danach kann dann mit den Cursortasten innerhalb der Menüs gewechselt werden.
Meine Frage ist, wie bekomme ich mit, wann die entsprechenden Cursortasten gedrückt werden, da diese keine entsprechenden Events an das Formular liefern, sofern dieses Menüs, Buttons oder andere Steuerelemente enthält, auch wenn KeyPreview des Formulars auf True gesetzt ist?
Mein bisheriger Ansatz:
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:
| var WindowHandle : HWND; MenuHandle : HMENU; MenuInfo : MENUITEMINFO; pMenuInfo : PMENUITEMINFO; iMenupos : Cardinal; bByMenuPos : Boolean; bReturn : Boolean; Buffer : Cardinal; MenuString : ShortString; strMenu : PChar;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_MENU then begin WindowHandle := GetForegroundWindow; MenuHandle := GetMenu(WindowHandle); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin MenuInfo.cbSize := sizeof(MenuInfo); MenuInfo.cch := SizeOf(MenuString); MenuInfo.fMask := MIIM_TYPE; MenuInfo.dwTypeData := PChar(@MenuString); GetMenuItemInfo(MenuHandle, iMenupos, true, MenuInfo); strMenu := MenuInfo.dwTypeData; MessageDlg(strMenu, mtInformation, [mbOK], 0); end; |
Wenn ich nun wüsste, wie ich den Druck auf die Cursortasten ermittle, wär glaube ich der Rest kein großes Problem, da man dann in fast identischer Weise, wie oben verfahren könnte.
Gruß
Leo
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt