告诉windows处理除一条消息之外的所有消息

时间:2011-07-06 11:02:04

标签: c++ windows winapi mfc

我有一个由消息触发的函数(由我定义的WM_ONDATA),该函数将执行此代码:

MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
{

    if( !AfxGetApp()->PumpMessage() )
    { 
        ::PostQuitMessage(0); 
        return 0; 
    } 
}
return 1;

问题是消息队列中可能存在另一条可能触发该功能的消息。

我想知道我是否可以让它处理所有消息但WM_ONDATA?

3 个答案:

答案 0 :(得分:3)

回想一下,PeekMessage的第三个和第四个参数允许您指定一系列消息值。超出该范围的邮件将不会被处理。

while (PeekMessage(&msg, NULL, 0, WM_ONDATA - 1, PM_NOREMOVE)
    || PeekMessage(&msg, NULL, WM_ONDATA + 1, 0xffff, PM_NOREMOVE))

答案 1 :(得分:0)

当然 - 收到邮件后,请以msg格式查看邮件编号。

答案 2 :(得分:0)

您可以让窗口proc忽略该消息或对其执行进行排队。如果您只是想避免递归,请进行重入锁定

 class MyDlg : ...
 {
       MyDlg(...) : m_inOnData(false), ... { .... }

       ...
     private:
        BOOL m_inOnData;
 };

....

 void MyDlg::OnOnData(...)
 {
      if (m_inOnData)
          return;
      m_inOnData = TRUE;
      ....

      m_inOnData = FALSE;
 }

您可以使用范围内的RIIA结构(因此事情将是异常安全且稍微冗长)