Ни один из предоставленных ответов не помог мне решить мою проблему, но я сам нашел ответ. Вот оно.
Использование SetWindowsHookEx()
с WH_KEYBOARD_LL
было правильным подходом. Однако другие параметры SetWindowsHookEx()
не интуитивны:
- Последний параметр
dwThreadId
должен быть равен 0.
- Второй-последний параметр,
hMod
, должен указывать на некоторую DLL. я использовал
User32
, которая является DLL, которая всегда загружается и используется всеми
процессы с графическим интерфейсом. Я получил эту идею из сообщения CodeProject об этом .
Таким образом, код выглядит примерно так:
instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
В документации по второму последнему параметру неясно. Там написано:
Параметр hMod должен быть установлен в NULL [...], если подключаемая процедура находится в коде, связанном с текущим процессом.
Не говорится, что это относится только к некоторым типам крючков, но не к WH_KEYBOARD_LL
и WH_MOUSE_LL
.