Twoje pytanie wzbudziło moje zainteresowanie, więc trochę poszperałem i chociaż, niestety, nie mam dla ciebie właściwej odpowiedzi, pomyślałem, że podzielę się tym, co mam.
Znalazłem ten przykład tworzenia haka klawiatury (w Delphi) napisany w 1998 roku, ale można go kompilować w Delphi 2007 z kilkoma poprawkami.
To biblioteka DLL z wywołaniem SetWindowsHookEx
które przechodzi przez funkcję zwrotną, która może następnie przechwytywać naciśnięcia klawiszy: w tym przypadku majstruje przy nich dla zabawy, zmieniając lewy kursor w prawo itd. Następnie prosta aplikacja wywołuje bibliotekę DLL i raportuje z powrotem jego wyniki oparte na zdarzeniu TTimer. Jeśli jesteś zainteresowany, mogę wysłać kod oparty na Delphi 2007.
Jest dobrze udokumentowany i skomentowany i potencjalnie możesz go użyć jako podstawy do ustalenia, dokąd zmierza naciśnięcie klawisza. Gdybyś mógł uzyskać uchwyt aplikacji, która wysłała naciśnięcia klawiszy, możesz to prześledzić w ten sposób. Dzięki temu uchwytowi będziesz w stanie łatwo uzyskać potrzebne informacje.
Inne aplikacje próbowały określić skróty klawiszowe, przechodząc przez swoje skróty, ponieważ mogą zawierać klawisz skrótu, który jest po prostu kolejnym określeniem skrótu klawiszowego. Jednak większość aplikacji nie ustawia tej właściwości, więc może nie zwracać dużo. Jeśli jesteś zainteresowany tą trasą, Delphi ma dostęp do IShellLink
interfejsu COM, z którego możesz wczytać skrót i uzyskać jego skrót:
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;
Jeśli masz dostęp do Safari Books Online , w przewodniku Borland Delphi 6 Developer's Guide Steve Teixeira i Xavier Pacheco znajduje się dobra sekcja dotycząca pracy ze skrótami / linkami powłoki . Mój przykład powyżej jest zmasakrowaną wersją stamtąd i tej strony .
Mam nadzieję, że to pomoże!
WM_HOTKEY
wiadomości w dzienniku wiadomości po naciśnięciu klawisza skrótu, może być konieczne uruchomienie 32-bitowej wersji Spy ++ .