#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
发布于 2011-03-14 00:53:51
这些钩子中的大多数(如果不是全部)必须注入到目标应用程序中,因此它们必须在DLL中实现。
发布于 2011-03-14 00:56:46
来自KeyboardProc回调函数的文档:
只要应用程序调用GetMessage或PeekMessage函数,并且有键盘消息(WM_KEYUP或WM_KEYDOWN)需要处理,系统就会调用此函数。
控制台应用程序不使用消息队列来处理输入,因此您的钩子永远不会被调用。
您可以尝试使用低级键盘挂钩(WH_KEYBOARD_LL)。即使这是一个全局钩子,您也不需要使用DLL:正如documentation的备注部分所提到的,钩子代码不会被注入到其他进程中。当然,这种方法的问题是,您将获得系统中所有关键事件的通知(不仅仅是程序中的事件)。
https://stackoverflow.com/questions/5290718
复制相似问题