2012-06-11 180 views
2

我遇到了問題WM_SIZE。我想用PeekMessage(而不是WndProc)捕獲它。 PeekMessage從不接收WM_SIZE,所以後額外的用戶消息給窗口PeekMessage捕獲像這樣(代碼從WnProc):WM_SIZE不按預期方式工作

case WM_SIZE: 
    PostMessageW(hwnd, WM_USER + 1, wParam, lParam); 
    break; 

問題是我使用PeekMessage僅當被最大化或恢復窗口接收WM_USER + 1。當窗口被其粗框架調整大小時沒有消息(儘管我在WndProc中收到WM_SIZE)。

+0

用spy ++看了嗎? – bmargulies

+0

你從WndProc發佈了你的'WM_USER + 1'消息嗎? – Benlitz

+0

是的,我從我的WndProc發佈WM_USER + 1,因爲PeekMessage本身永遠不會收到WM_SIZE。我檢查了PostMessageW,並且每次調整窗口大小時都會調用返回成功。但是PeekMessage只有在窗口被創建,最大化,恢復時纔會收到它(不是當它被粗框架調整大小時)。 – Demion

回答

4

的PeekMessage()只可以看到,被張貼到消息隊列中的消息。這不包括WM_SIZE,它被髮送,而不是發佈。換句話說,它由SendMessage()傳遞,它直接調用窗口過程並繞過消息隊列。所以是的,你的代碼開始工作,因爲你現在用PostMessage重新發布消息,它被放在消息隊列中,所以PeekMessage可以看到它。

當用戶調整窗口大小時會發生不同的情況。那是由報告的另一個消息:WM_SIZING。當Windows啓動一個模態消息循環來實現調整大小操作時,它會以相當高的速度生成。它給出了適當的通知,當模式循環開始時(用戶單擊一個窗口角落),WM_EXITSIZEMOVE完成時(用戶釋放按鈕),您將獲得WM_ENTERSIZEMOVE。你會得到一堆WM_SIZING消息,發送到你的窗口過程。沒有發佈。和一個WM_SIZE給最終的大小。到而不是的一種方式是在您自己的消息循環中調用PeekMessage()時看到這些消息的這些反射版本。當Windows模式調整大小循環處於活動狀態時,它不會被調用。

很難給出更好的建議,真的不清楚爲什麼你這樣做。 「醫生,它傷害,不這樣做」醫療答案很可能是相關的。我懷疑你也可能想反映WM_SIZING消息。最大的問題是,當你從隊列中檢索這些消息時,窗口大小已經改變,通知只是簡單陳舊。這就是爲什麼該消息被髮送並未被髮布。

+2

用於調整大小的模態消息循環大概是爲什麼主要頂級消息循環從未看到這些排隊的消息。 –

1

我相信這是適用的:

PeekMessage not getting the message?

你需要你的類指針傳遞給您的來電 到CreateWindowEx的最後一個參數,然後檢索從傳遞給你的LPCREATESTRUCT 該指針在WM_CREATE的LPARAM中,你的類指針將在結構體的lpCreateParmas字段中爲 。將你的類指針設置爲 您窗口的GWLP_USERDATA,並在其他任何消息調用上調用GetWindowsLong,檢索您的類指針,然後將 消息,wparam和lparam全部關閉到您的內部類消息 處理程序。

http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx

+0

我見過這個問題。這不是我的問題的實際答案。這可能是另一種解決方案,但不是按照我的要求(使用PeekMessage接收每個WM_SIZE或WM_USER + 1)。 – Demion

+1

@Demion:但這個答案消除了你的工作需求。如果你能解決真正的問題,爲什麼試圖解決這個問題? –