2017-08-29 134 views
-3

現在,我正在開發應用程序來重置窗口的位置。 需要注意的一件事是我使用全局鼠標鉤來收聽桌面鼠標事件。 Global Mouse掛鉤運行良好。 我的問題是SetWindowPos()方法奇怪地工作。 以下是我的代碼:C++:全局鼠標掛鉤並重置窗口的位置

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; 

當我構建應用程序,窗口進入桌面的左上角,但突然,它回來到原來的位置。

你想幫我解決這個問題嗎?

回答

0

移動/調整窗口大小會導致DefWindowProc執行內部移動或調整模式循環。在操作完成之前,控件不會返回到應用程序,並且它的確切行爲和消息處理沒有記錄。

您是否嘗試過在SetWindowPos之前致電CallNextHookEx

當一個黑客,你可以嘗試耽誤您到SetWindowPos調用,直到你的鉤子返回之後(發佈一條消息給自己或使用工作線程)。

您也可以嘗試使用不同的鉤子搭上移動操作的結束:

+0

嘿,安德斯 我有問題,你的答案。 當你說「你有沒有試過在SetwindowPos之前調用CallNextHookEx」,你能給我更多的細節嗎? –

+0

還有一點需要注意的是,當我將SetWindowPos方法添加到WM_LBUTTONUP的情況下,而不是在If情況下,它運行良好。 你想解釋爲什麼會發生這種情況嗎? –

+0

鉤子通常應該調用CallNextHookEx,以便其他鉤子也可以獲得消息。如果另一個鉤子也做了類似的事情,那麼如果你在其他鉤子之後執行了你的動作,那麼你只會「贏」。如果因爲尚未發佈所有代碼而無法回答您的其他問題。 – Anders