簡體   English   中英

窗口大小時窗口消息WM_SIZING不斷發送

[英]Window message WM_SIZING sending incessantly when window resizing

我制作小游戲並且在低優先級窗口消息方面存在一些問題,這些消息不斷地從系統發送並阻止運行游戲邏輯的代碼。

我創建了這樣的消息循環:

bool Window::SystemRoutineAndCheckQuit() {
    ::MSG msg;
    while( ::PeekMessage( &msg, nullptr, 0, 0, PM_REMOVE ) ) {
        if( msg.message == WM_QUIT ) {
            ::UnregisterClass( registeredClassName, ::GetModuleHandle( nullptr ) );
            DLOG( lg ) << "Exit from system loop" << DLOG_END;
            return false;
        }

        ::TranslateMessage( &msg );
        ::DispatchMessage( &msg );
    }

    return true;
}
//....
    while( window.SystemRoutineAndCheckQuit() ) {
        // do all render and logic
    }

即在每一幀之前,我想處理來自windows的所有消息,然后,當隊列將為空時,執行所有邏輯。 我注意到當窗口調整大小時我一次又一次地得到相同的消息WM_SIZING並且當鼠標按鈕仍然按下時隊列永遠不會為空(即使當窗口的大小沒有從previos調用改變時我收到具有相同窗口坐標的消息)。 所以它阻止執行我的代碼。

是否有任何其他消息,保持Windows消息隊列不空,什么是處理沒有一些低優先級的所有消息的最佳方法,如WM_SIZING?

我在Windows 8上測試它。

PS:我需要調整大小窗口,所以我不想通過改變風格來禁止它。

編輯:抱歉不正確的描述問題,但發現了真正發生的事情(以及為什么我之前嘗試通過限制處理的消息數來修復它,或者當按順序獲取相同消息兩次時通過中斷消息處理將不會成功)。 從PeekMessage我得到消息WM_NCLBUTTONDOWN並且在此消息程序之后不從:: DispatchMessage返回並阻止繼續執行線程直到鼠標將被釋放。 當在DispatchMessage中編程時,我的處理程序重復WM_SIZING或WM_MOVING(獨立於消息處理函數返回的內容(DefWindowProc的結果,TRUE(處理消息)或0)。

您可以在每個幀之前處理N個消息..其中N是您在1-10之間設置的限制。 這樣你就可以處理合理數量的事件,然后進入你的實際游戲邏輯。

可以想象,當隊列為空時,Windows可能會不斷生成“窗口大小調整”消息,以確保應用程序知道窗口正在調整大小。

(也許MS認為應用程序可能不知道,也許用戶無法做任何事情......所以MS想要敲擊那條消息。)

當DefWindowProc在wParam中使用SC_MOVE或SC_SIZE處理WM_SYSCOMMAND時,它會進入一個循環,直到用戶通過釋放鼠標按鈕或按Enter或escape來停止它。 這樣做是因為它允許程序通過處理WM_PAINT和WM_NCPAINT消息來呈現客戶區(您的小部件或游戲或其他任何內容)以及邊框和標題區域(您仍應在Window Procedure中接收這些事件)。

它適用於普通的Windows應用程序,這些應用程序由於接收消息而在其Window Procedure中進行大部分處理。 它只會影響在窗口過程之外進行處理的程序,例如游戲(通常是全屏但不受影響)。

但是,有一種解決方法:自己處理WM_SYSCOMMAND,調整大小或移動自己。 這需要付出很多努力,但可能證明是值得的。 或者,您可以使用setjmp / longjmp在發送WM_SIZING時從Window Procedure中逃脫,或者沿着相同的行使用Windows Fibers; 這些都是黑客的解決方案。

我在上周末解決了它(使用第一種方法),如果您感興趣我已經將代碼發布到sourceforge上的公共域。 只需確保閱讀README,特別是警告部分。 這是: https//sourceforge.net/projects/win32loopl/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM