我试图在此页面中测试“检查消息队列”示例:

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

为了对其进行测试,我创建了一个带有编辑控件和一些按钮的简单窗口,

但它没有按我预期的那样工作,它应该在EditControl中反复显示字符串“Some Text”,直到

我按下一个按钮...但是问题是它只在第一次显示字符串,然后似乎在PeekMessage循环中阻塞了。

我注意到,之后放置DispatchMessage(&msg)调用似乎可以正常工作。

我该如何解决???我是否必须致电DispatchMessage(&msg)???

谢谢!

HWND hwnd;
BOOL fDone;
味精味精;

fDone = FALSE;
同时(!fDone)
{
SetFocus(EditControl);
SendMessage(EditControl,EM_REPLACESEL,(WPARAM)FALSE,(LPARAM)TEXT(“Some Text \ r \ n”));;

while(PeekMessage(&msg,hwnd,0,0,PM_REMOVE))//在这里阻止,如果我按下任何按钮,它总是将fDone设置为TRUE而不会退出循环
{

// DispatchMessage(&msg);取消注释,它起作用

开关(msg.message)
{
案例WM_LBUTTONDOWN:
案例WM_RBUTTONDOWN:
案例WM_KEYDOWN:
{
fDone = TRUE;
SetFocus(EditControl);
SendMessage(EditControl,EM_REPLACESEL,(WPARAM)FALSE,(LPARAM)TEXT(“fDone设置为TRUE \ r \ n”));
}
}
}
}

最佳答案

好吧,这当然没有任何意义。如果fDone标志设置为TRUE,则它无法停留在循环内并继续调用PeekMessage()。 PeekMessage()也不能阻止。吹动堆栈框架可能会产生类似的效果,但是此处未指出,并且始终是最后的解释。

更有可能的解释是,此代码从顶部开始反复执行。也许您是从窗口过程中调用它的。是的,如果您不调用DispatchMessage(),那很容易使您陷入无限循环。 WM_PAINT消息是很明显的候选者,如果您不调用Begin / EndPaint(),它将一直触发而不会松懈。当然这只是一个理论,如果不知道如何调用此代码就无法确定。

10-04 13:57