我如何使用Win32钩子模拟Alt+Tab

How can I simulate an Alt+Tab using Win32 hooks?

本文关键字:模拟 Alt+Tab Win32 何使用      更新时间:2023-10-16

我使用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中保持工作)。我做错了什么?

钩子是邪恶的,如果它们不被用作通知。MSDN强烈建议调用CallNextHookEx()是有原因的。您无法知道您处于调用链的哪一点。这使得你的代码很脆弱,即使它一开始看起来可以工作。

你依赖于钩子API的其他用户对你友好,即调用你。如果有人(比如你)不这样做,你的代码就会崩溃。

在不深入讨论代码中断的细节的情况下,我认为

鼠标在大多数应用程序中停止工作

如果您通过返回TRUE来关闭鼠标钩子的其他用户,是吗?