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

发布于 2024-12-19 06:30:40 字数 932 浏览 1 评论 0原文

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

I've written this C++ program using VS2010 to detect when the user is making a double middle mouse button click, switch to the next window (as Alt+Tab does) and stop the hook chain. Here's my code:

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);

I launch the program and set the hook, then the program hangs and mouse stops working in most apps (keeps working in Chrome though). What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

真心难拥有 2024-12-26 06:30:40

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

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

在不进一步详细说明代码损坏的地方的情况下,我认为这并不奇怪

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

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

Hooks are evil if they are not used as notifications only. The MSDN highly recommends calling CallNextHookEx() for a reason. You cannot know at which point in the calling chain you are. This makes your code fragile even though it might appear to work at first.

You depend on other users of the hook API to be nice to you, i.e. to call you. If someone (like you) does not do it, your code breaks.

Without going into further detail where your code breaks, I think that it is not very surprising that

the mouse stops working in most apps

if you shut up the other users of the mouse hook by returning TRUE, is it?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文