2010-08-06 57 views
2

我試圖檢驗該「檢查消息隊列」在當前頁例如:的PeekMessage問題

http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx

爲了測試它我創建與編輯控件和一些按鈕的簡單窗口,

但如我所料,它應該重複顯示字符串「某些文本」在EditControl直到

我按下一個按鈕,它不工作......但問題是,它顯示的字符串僅在第一次然後它似乎阻止PeekMessage循環。

我注意到放置一個DispatchMessage(&味精)後來調用,它似乎工作正常。

我該如何解決?我是否必須打電話給DispatchMessage(&味精)?

謝謝!

HWND hwnd; 
BOOL fDone; 
MSG msg; 

fDone = FALSE; 
while (!fDone) 
{ 
SetFocus(EditControl); 
SendMessage(EditControl, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)TEXT("Some Text\r\n")); 

while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) // It blocks here, if I press any button it always sets fDone to TRUE without exiting the loop 
{ 

// DispatchMessage(&msg); uncomment this and it works 

switch(msg.message) 
{ 
case WM_LBUTTONDOWN: 
case WM_RBUTTONDOWN: 
case WM_KEYDOWN: 
{ 
fDone = TRUE; 
SetFocus(EditControl); 
SendMessage(EditControl, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)TEXT("fDone set to TRUE\r\n")); 
} 
} 
} 
}

回答

1

那麼,這當然沒有任何意義。如果fDone標誌被設置爲TRUE,那麼它就沒有辦法留在循環中並繼續調用PeekMessage()。 PeekMessage()塊也不可以。吹堆棧可能會有這樣的效果,但這並不是在這裏指出的,而且總是對最後的解決方案做出解釋。

更可能的解釋是該代碼從頂部反覆執行。也許你可以通過窗口過程調用它。是的,如果您不調用DispatchMessage(),那可以輕鬆地使您處於無限循環狀態。 WM_PAINT消息是一個明顯的候選對象,如果您不調用Begin/EndPaint(),它將繼續保持激活狀態。這當然只是一個理論,如果不知道如何調用這些代碼,肯定無法知道。

+0

是的,它從窗口過程調用, 因此,如果我明白:每次我調用PeekMessage()我必須調用DispatchMessage()? 但PeekMessage不自動調度消息?來自MSDN的 :「調度傳入的已發送消息」 – Mario 2010-08-06 16:36:08

+0

調度*已發送*消息。與*發佈*消息不同。 WM_PAINT已發佈,未發送。你玩的例子是*不是很棒,沒有人會這樣做。 – 2010-08-06 16:47:23

+0

好的謝謝你的回覆,最後一件事:爲什麼沒有人這樣做?什麼是替代方案? – Mario 2010-08-06 16:55:05

0

您需要使用該文章中的GetMessage循環代替。