2010-08-06 55 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循环代替。