Почему SetWindowsHookEx не работает в CLI (какие коды в main () вместо dllmain и т. Д.)? - PullRequest
0 голосов
/ 13 марта 2011
#include <stdio.h>
#include <windows.h>

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
 printf("Keyboard event, nCode = %d, wParam = %d, lParam = 0x%.8X\n", nCode, wParam, lParam);
 return (LRESULT)NULL;
} 

void main() { 
 HHOOK HookHandle = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, (HINSTANCE) NULL, GetCurrentThreadId());
 printf("Hook handle = 0x%.8X\n", HookHandle);

 MSG message;
 while (GetMessage(&message,NULL,0,0)) {
 TranslateMessage(&message);
 DispatchMessage(&message);
 }

 UnhookWindowsHookEx(HookHandle);
}

Ожидается, что он выдаст что-то вроде «события клавиатуры ...», но он не работает, он всегда хранит молчание, независимо от того, что я набираю.

Опции компиляции просты: gcc -o test.exe test.c

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Большинство (если не все) из этих хуков должны быть внедрены в целевые приложения, поэтому они должны быть реализованы в DLL.

0 голосов
/ 13 марта 2011

Из документации функции обратного вызова KeyboardProc :

Система вызывает эту функцию всякий раз, когда приложение вызывает Функция GetMessage или PeekMessage и появляется сообщение клавиатуры (WM_KEYUP или WM_KEYDOWN) для обработки.

Консольные приложения не используют очередь сообщений для обработки ввода, поэтому ваша ловушка никогда не будет вызываться.

Вы можете попробовать использовать низкоуровневую клавиатуру (WH_KEYBOARD_LL). Несмотря на то, что это глобальный хук, вам не нужно использовать DLL: как уже упоминалось в разделе «Примечания» документации , код хука не внедряется в другие процессы. Конечно, проблема такого подхода заключается в том, что вы будете получать уведомления обо всех ключевых событиях в системе (а не только в вашей программе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...