La tua domanda ha suscitato il mio interesse, quindi ho scavato un po 'e mentre, purtroppo, non ho una risposta adeguata per te, ho pensato di condividere ciò che ho.
Ho trovato questo esempio di creazione di hook da tastiera (in Delphi) scritto nel 1998, ma è compilabile in Delphi 2007 con un paio di modifiche.
È una DLL con una chiamata a SetWindowsHookEx
che passa attraverso una funzione di callback, che può quindi intercettare i tasti premuti: in questo caso, sta armeggiando con loro per divertimento, cambiando il cursore da sinistra a destra, ecc. Una semplice app quindi chiama la DLL e riporta indietro i suoi risultati sono basati su un evento TTimer. Se sei interessato, posso pubblicare il codice basato su Delphi 2007.
È ben documentato e commentato e potenzialmente potresti usarlo come base per capire dove sta andando la pressione di un tasto. Se riuscissi a ottenere l'handle dell'applicazione che ha inviato i tasti, potresti rintracciarlo in quel modo. Con quella maniglia sarai in grado di ottenere le informazioni di cui hai bisogno abbastanza facilmente.
Altre app hanno provato a determinare i tasti di scelta rapida passando attraverso le scorciatoie poiché possono contenere un tasto di scelta rapida, che è solo un altro termine per tasto di scelta rapida. Tuttavia, la maggior parte delle applicazioni non tende a impostare questa proprietà, quindi potrebbe non restituire molto. Se sei interessato a quel percorso, Delphi ha accesso all'interfaccia IShellLink
COM che potresti usare per caricare un collegamento e ottenere il suo tasto di scelta rapida:
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;
Se hai accesso a Safari Books Online , c'è una buona sezione su come lavorare con scorciatoie / collegamenti shell nella Borland Delphi 6 Developer's Guide di Steve Teixeira e Xavier Pacheco. Il mio esempio sopra è una versione macellata da lì e da questo sito .
Spero che aiuti!
WM_HOTKEY
messaggio nel registro dei messaggi dopo aver premuto il tasto di scelta rapida, potresti dover eseguire la versione a 32 bit di Spy ++ .