我尝试在此页面中测试“检查消息队列”示例:
http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx
为了测试它,我创建了一个带编辑控件和一些按钮的简单窗口,
但是它没有按照我的预期工作,它应该在EditControl中反复显示字符串“Some Text”,直到
我按下一个按钮......但问题是它只是第一次显示字符串,然后它似乎在PeekMessage循环中阻塞。
我注意到之后放置了DispatchMessage(& msg)调用,它似乎正常工作。
我该如何解决?我是否必须调用DispatchMessage(& msg)???
谢谢!
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")); } } } }
答案 0 :(得分:1)
嗯,这当然没有任何意义。如果fDone标志设置为TRUE,则它无法保持在循环内并继续调用PeekMessage()。 PeekMessage()也无法阻止。吹制堆栈框架可能会产生类似的效果,但这里没有说明,并且始终是最后的解释。
更可能的解释是此代码从顶部重复执行。也许是你从窗口程序中调用它。是的,如果您不调用DispatchMessage(),那么可以轻松地让您无限循环。 WM_PAINT消息是一个明显的候选者,如果你不调用Begin / EndPaint(),它将继续不用放松。这当然只是一种理论,在不知道如何调用此代码的情况下无法确定。
答案 1 :(得分:0)
您需要来自该文章的GetMessage
循环。
答案 2 :(得分:0)
您遇到的问题与我刚才有的相同:Basic window creation
您缺少开关的“默认”情况,否则窗口无法处理所有其他情况,但无效。
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"));
}
default:
{
DispatchMessage(&msg)
}
}