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

时间:2011-12-03 15:15:46

标签: c++ windows winapi hook

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

1 个答案:

答案 0 :(得分:3)

如果钩子不仅仅用作通知,则它们是邪恶的。 MSDN强烈建议您调用CallNextHookEx()。您无法知道您所在的主叫链中的哪一点。这使得您的代码很脆弱,即使它最初可能起作用。

你依赖钩子API的其他用户对你很好,即打电话给你。如果某人(像你一样)没有这样做,你的代码会中断。

如果没有进一步详细说明代码中断的地方,我认为

并不奇怪
  

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

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