【发布时间】:2011-12-03 15:15:45
【问题描述】:
我使用 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 中继续工作)。我做错了什么?
【问题讨论】:
-
很难说。支持 WM_MOUSE_LL,因为它不需要注入 DLL,所以更容易上手。您确实必须泵送消息循环,不能使用控制台模式应用程序。
-
如果您描述的是目标,我会使用 AutoHotKey。它已经为你处理了所有的钩子,并允许将 Alt-Tab 发送到系统。
-
@7vies 实际上我只是想了解钩子的工作原理,而且我已经在使用 AutoHotkey :)
-
@Hans 所以你是说不能在控制台模式应用程序中使用高级鼠标挂钩?
-
不,我从来没有说过那样的话。只有低级鼠标钩子需要消息循环。