【问题标题】:C++: Global Mouse hook and reset the position of windowC++:全局鼠标钩子并重置窗口的位置
【发布时间】:2017-08-29 13:37:54
【问题描述】:

现在,我正在开发应用程序来重置窗口的位置。 需要注意的一件事是,我使用了全局鼠标挂钩来监听桌面鼠标事件。 全局鼠标挂钩运行良好。 我的问题是 SetWindowPos() 方法工作异常。 以下是我的代码:

case WM_LBUTTONUP:
    mouselbut_clicked = false;

    if (mousewnd_drag)
    {
        TRACE("mouse - lbutton release\n");

        if ( window_moved )
        {
            ::SetWindowPos(hWnd, 0, 0, 0, 500, 500, SWP_ASYNCWINDOWPOS | SWP_NOZORDER);
            window_moved = false;
        }
     }
  break;

当我构建应用程序时,窗口进入桌面的左上角,但突然又回到原来的位置。

您愿意帮我解决这个问题吗?

【问题讨论】:

    标签: c++ winapi mouse-hook window-position


    【解决方案1】:

    移动/调整窗口大小会导致DefWindowProc 执行内部移动或调整大小模式循环。在操作完成之前,控制权不会返回给应用程序,并且它的确切行为和消息处理没有记录。

    您是否尝试在SetWindowPos 之前调用CallNextHookEx

    作为一种技巧,您可以尝试延迟对SetWindowPos 的调用,直到您的钩子返回后(向自己发布消息或使用工作线程)。

    您也可以尝试使用不同的钩子来捕捉移动操作的结束:

    【讨论】:

    • 嘿,安德斯,我对你的回答有疑问。当你说“你有没有尝试在 SetwindowPos 之前调用 CallNextHookEx”时,你能告诉我更多细节吗?
    • 还有一件事要注入的是,当我将 SetWindowPos 方法添加到 WM_LBUTTONUP 情况下,而不是在 If 情况下,它运行良好。您想解释一下为什么会这样吗?
    • 钩子通常应该调用 CallNextHookEx 以便其他钩子也能收到消息。如果另一个钩子也做了类似的事情,那么只有在其他钩子之后执行您的操作,您才会“获胜”。如果由于您没有发布所有代码而无法回答您的其他问题。
    • 嗨,安德斯,我有一件事要问。我可以同时使用两个钩子程序吗?比如 MouseProc 和 CBTProc?
    • 嘿,安德斯,你能再帮我一次吗?我想知道系统原始鼠标事件和全局鼠标钩子(如鼠标移动或左键向上)之间是否存在崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2018-10-26
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多