告诉窗口处理除一条消息外的所有消息

Tell windows to process all but one message

本文关键字:消息 一条 窗口 处理      更新时间:2023-10-16

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

MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
{
    if( !AfxGetApp()->PumpMessage() )
    { 
        ::PostQuitMessage(0); 
        return 0; 
    } 
}
return 1;

问题是消息队列中可能有另一条消息可以触发该函数。

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

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

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

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

 class MyDlg : ...
 {
       MyDlg(...) : m_inOnData(false), ... { .... }
       ...
     private:
        BOOL m_inOnData;
 };

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

您可以使用一个有作用域的RIIA结构体(这样事情就会异常安全并且稍微不那么冗长)

当然可以-收到后查看消息号即可。