Ihre Frage hat mein Interesse geweckt, also habe ich ein bisschen gegraben und obwohl ich leider keine richtige Antwort für Sie habe, dachte ich, ich würde teilen, was ich habe.
Ich fand dieses Beispiel für Tastatur - Hook zu schaffen (in Delphi) im Jahr 1998 geschrieben, aber ist übersetzbar in Delphi 2007 mit ein paar Verbesserungen.
Es ist eine DLL mit einem Aufruf SetWindowsHookEx
, der eine Rückruffunktion durchläuft, die dann Tastenanschläge abfangen kann: In diesem Fall wird zum Spaß daran herumgebastelt, der linke Cursor wird nach rechts geändert usw. Eine einfache App ruft dann die DLL auf und meldet sich zurück seine Ergebnisse basieren auf einem TTimer-Ereignis. Wenn Sie interessiert sind, kann ich den Delphi 2007-basierten Code veröffentlichen.
Es ist gut dokumentiert und kommentiert, und Sie können es möglicherweise als Grundlage verwenden, um herauszufinden, wohin ein Tastendruck führt. Wenn Sie das Handle der Anwendung erhalten könnten, die die Tastenanschläge gesendet hat, könnten Sie es auf diese Weise zurückverfolgen. Mit diesem Handle können Sie ganz einfach die Informationen abrufen, die Sie benötigen.
Andere Apps haben versucht, Hotkeys anhand ihrer Verknüpfungen zu ermitteln, da sie eine Verknüpfungstaste enthalten können, die nur ein weiterer Begriff für Hotkey ist. Die meisten Anwendungen neigen jedoch nicht dazu, diese Eigenschaft festzulegen, sodass sie möglicherweise nicht viel zurückgibt. Wenn Sie an dieser Route interessiert sind, hat Delphi Zugriff auf die IShellLink
COM-Schnittstelle, über die Sie eine Verknüpfung laden und deren Hotkey abrufen können:
uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;
procedure GetShellLinkHotKey;
var
LinkFile : WideString;
SL: IShellLink;
PF: IPersistFile;
HotKey : Word;
HotKeyMod: Byte;
HotKeyText : string;
begin
LinkFile := 'C:\Temp\Temp.lnk';
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));
// The IShellLink implementer must also support the IPersistFile
// interface. Get an interface pointer to it.
PF := SL as IPersistFile;
// Load file into IPersistFile object
OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));
// Resolve the link by calling the Resolve interface function.
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
// Get hotkey info
OleCheck(SL.GetHotKey(HotKey));
// Extract the HotKey and Modifier properties.
HotKeyText := '';
HotKeyMod := Hi(HotKey);
if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
HotKeyText := 'ALT+';
if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
HotKeyText := HotKeyText + 'CTRL+';
if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
HotKeyText := HotKeyText + 'SHIFT+';
if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
HotKeyText := HotKeyText + 'Extended+';
HotKeyText := HotKeyText + Char(Lo(HotKey));
if (HotKeyText = '') or (HotKeyText = #0) then
HotKeyText := 'None';
ShowMessage('Shortcut Key - ' + HotKeyText);
end;
Wenn Sie Zugriff auf Safari Books Online haben , finden Sie im Borland Delphi 6-Entwicklerhandbuch von Steve Teixeira und Xavier Pacheco einen guten Abschnitt zum Arbeiten mit Verknüpfungen / Shell-Links . Mein Beispiel oben ist eine geschlachtete Version von dort und dieser Seite .
Hoffentlich hilft das!
WM_HOTKEY
die Nachricht nach dem Drücken des Hotkeys nicht im Nachrichtenprotokoll sehen , müssen Sie möglicherweise die 32-Bit-Version von Spy ++ ausführen .