Żadna z podanych odpowiedzi nie pomogła mi rozwiązać mojego problemu, ale sam znalazłem odpowiedź. Oto jest.
Używanie SetWindowsHookEx()
z WH_KEYBOARD_LL
było prawidłowym podejściem. Jednak pozostałe parametry do SetWindowsHookEx()
są nieintuicyjne:
- Ostatnim parametrem,
dwThreadId
, musi być 0.
- przedostatnią parametr,
hMod
, musi wskazywać na jakiś DLL. Użyłem User32
, która jest biblioteką DLL, która jest zawsze wczytywana i jest używana przez wszystkie procesy z GUI. Mam pomysł od a CodeProject post about this.
Zatem kod wygląda trochę tak:
instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
Dokumentacja jest jasne, o przedostatnią parametru. Jest napisane:
Parametr hMod musi być ustawiony na NULL [...], jeśli procedura haka mieści się w kodzie powiązanym z bieżącym procesem.
Nie stwierdza, że dotyczy to tylko niektórych typów haczyków, ale nie dotyczy to WH_KEYBOARD_LL
i WH_MOUSE_LL
.
Tak, to właśnie mają na myśli - dla niskiego poziomu myszy lub haka klawiatury (lub dowolnego innego lokalnego haka) hMod powinien być IntPtr.Zero. –
Hmmm, mówisz, że inne posty nie były pomocne, następnie opublikuj tę samą odpowiedź, którą już podał nobugz, i oznacz swoją jako poprawną odpowiedź. –
Nobugz nie mówi w ogóle o tym, co zrobić z hModem, a w przeciwieństwie do pierwszego komentarza, ta odpowiedź sugeruje, że hMod ma być ustawiony na coś ** innego ** niż IntPtr.Zero. –