C++:全局鼠标挂钩并重置 window 的位置

C++: Global Mouse hook and reset the position of window

现在,我正在开发应用程序来重置 window 的位置。 需要注意的一件事是我使用了全局鼠标钩子来监听桌面鼠标事件。 全局鼠标挂钩运行良好。 我的问题是 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;

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

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

Moving/resizing a window 导致 DefWindowProc 执行内部移动或调整大小模态循环。在操作完成之前,控件不会 return 到应用程序,并且没有记录它的确切行为和消息处理。

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

作为 hack,您可以尝试延迟对 SetWindowPos 的调用,直到您的挂钩 returned(post 给自己的消息或使用工作线程)。

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