Nessuna delle risposte fornite mi ha aiutato a risolvere il mio problema, ma ho trovato la risposta da solo. Ecco qui.
Utilizzare SetWindowsHookEx()
con WH_KEYBOARD_LL
era l'approccio corretto. Tuttavia, gli altri parametri SetWindowsHookEx()
sono poco intuitivo:
- L'ultimo parametro,
dwThreadId
, deve essere 0.
- Il secondo-ultimo parametro,
hMod
, ha bisogno di puntare a qualche DLL. Ho usato User32
, che è una DLL che viene sempre caricata comunque ed è utilizzata da tutti i processi con una GUI. Ho avuto questa idea da a CodeProject post about this.
Così, il codice è un po 'come questo:
instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
La documentazione non è chiara circa la penultima parametro. Dice:
Il parametro hMod deve essere impostato su NULL [...] se la procedura di hook si trova all'interno del codice associato al processo corrente.
Esso non indica che questo vale solo per alcuni tipi di ganci, ma non WH_KEYBOARD_LL
e WH_MOUSE_LL
.
Sì, è quello che intendono dire: per un mouse di livello basso o un hook per tastiera (o qualsiasi altro hook locale) hMod dovrebbe essere IntPtr.Zero. –
Hmmm, dici che gli altri post non sono stati utili, quindi procedi a pubblicare la stessa risposta che nobugz ha già fornito e contrassegna la tua come risposta corretta. –
Nobugz non dice affatto cosa fare su hMod, e contrariamente al tuo primo commento, questa risposta suggerisce che hMod sia impostato su qualcosa ** altro ** rispetto a IntPtr.Zero. –