PeekMessage问题

时间:2010-08-06 13:43:12

标签: c++ c winapi

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

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"));
 }
 } 
 } 
}

3 个答案:

答案 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)
     }
 }