【问题标题】:How can I simulate an Alt+Tab using Win32 hooks?如何使用 Win32 挂钩模拟 Alt+Tab?
【发布时间】: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 所以你是说不能在控制台模式应用程序中使用高级鼠标挂钩?
  • 不,我从来没有说过那样的话。只有低级鼠标钩子需要消息循环。

标签: c++ windows winapi hook


【解决方案1】:

如果钩子不只用作通知,那么它们是邪恶的。 MSDN 强烈建议致电CallNextHookEx() 是有原因的。您无法知道您在调用链中的哪个位置。这会使您的代码变得脆弱,即使它一开始似乎可以工作。

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

无需进一步详细说明您的代码中断的位置,我认为这并不奇怪

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多