我试图挂钩键盘消息没有任何成功。使用SetWindowsHookEx钩住键盘消息的问题
我创建一个测试控制台的Win32应用程序:
int _tmain(int argc, _TCHAR* argv[])
{
HOOKPROC hHookProc;
HINSTANCE hinstDLL;
HHOOK hHook;
hinstDLL = LoadLibrary(TEXT("pathtodll\\KeyHook.dll"));
hHookProc= (HOOKPROC)GetProcAddress(hinstDLL, "HookProc");
hHook = SetWindowsHookEx(
WH_KEYBOARD,
hHookProc,
hinstDLL,
0);
while (1) {}
return 0;
}
我还创建了与HOOKPROC功能测试的Win32 DLL:
extern __declspec(dllexport) LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
// process event
//...
MessageBox(NULL,
TEXT("OK"),
TEXT("OK"),
MB_OK);
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
一切编译罚款,但是当我试图调试,似乎HookProc永远不会被调用。实际上,在Win 7中,当我按任意键时,应用程序会挂起,而在Win Xp中,HookProc不会被调用。我确实没有得到NULL hinstDLL,hHookProc,hHook。
我在误解什么?
它的工作原理:P但我不能完全理解为什么:( – Blim
就像我说过的,一些钩子在安装它们的线程的上下文中运行,当调用这样一个钩子时,为了切换到正确的线程上下文,操作系统使用线程的消息队列,因此线程必须定期为新消息抽取消息队列,以便钩子可以运行。 –
问题在于GetMessage()永远不会返回,但就我而言,它会创建我试图找到一些解释所有这些东西的文档,但我找不到具体的东西,关于钩子的msdn文档的部分没有提到需要消息队列的东西。 – Blim