我使用VS2010编写了这个C ++程序来检测用户何时点击鼠标中键,切换到下一个窗口(如Alt + Tab所示)并停止钩链。这是我的代码:
DLL:
extern "C"__declspec (dllexport)
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode<0)
return CallNextHookEx(NULL,nCode,wParam,lParam);
if (wParam == WM_MBUTTONDBLCLK)
{
PostMessage(GetActiveWindow(),WM_SYSCOMMAND,SC_NEXTWINDOW,0);
}
else
return CallNextHookEx(NULL,nCode,wParam,lParam);
// if EVERYTHING_IS_OK
return TRUE;
}
EXE:
do{
nMenu = choose();
switch (nMenu)
{
case 1:
hLib = LoadLibrary(cLibName);
hProc = (HOOKPROC) GetProcAddress(hLib, "HookProc");
hHook = SetWindowsHookEx(WH_MOUSE, hProc, hLib, NULL);
break;
case 2:
UnhookWindowsHookEx(hHook);
break;
case 0:
;
}
} while (nMenu);
我启动程序并设置挂钩,然后程序挂起,鼠标停止在大多数应用程序中工作(尽管仍在Chrome中工作)。我做错了什么?
答案 0 :(得分:3)
如果钩子不仅仅用作通知,则它们是邪恶的。 MSDN强烈建议您调用CallNextHookEx()
。您无法知道您所在的主叫链中的哪一点。这使得您的代码很脆弱,即使它最初可能起作用。
你依赖钩子API的其他用户对你很好,即打电话给你。如果某人(像你一样)没有这样做,你的代码会中断。
如果没有进一步详细说明代码中断的地方,我认为
并不奇怪鼠标停止在大多数应用中工作
如果你通过返回TRUE
来关闭鼠标挂钩的其他用户,不是吗?