-3

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

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

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

4

1 回答 1

0

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

CallNextHookEx以前试过打电话SetWindowPos吗?

作为一个黑客,您可以尝试将您的呼叫延迟SetWindowPos到您的钩子返回之后(向自己发布消息或使用工作线程)。

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

于 2017-08-29T14:01:16.753 回答