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

发布于 2024-11-18 20:01:04 字数 335 浏览 2 评论 0原文

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

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

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

问题是消息队列上可能存在另一条可以触发该函数的消息。

我想知道是否可以让它处理除 WM_ONDATA 之外的所有消息?

I have a function triggered by a message(WM_ONDATA defined by me) the function will execute this code :

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

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

The problem is that there could be on the message queue another message that could trigger the function.

I'm wondering if I can make it process all the message but WM_ONDATA?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

扭转时空 2024-11-25 20:01:04

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

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

Recall that the third and fourth parameters to PeekMessage let you specify a range of message values. Messages outside that range won't be processed.

while (PeekMessage(&msg, NULL, 0, WM_ONDATA - 1, PM_NOREMOVE)
    || PeekMessage(&msg, NULL, WM_ONDATA + 1, 0xffff, PM_NOREMOVE))
尝蛊 2024-11-25 20:01:04

您可以让窗口过程忽略该消息或将其执行排队。如果你只是想避免递归,那么有一个重入锁

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

       ...
     private:
        BOOL m_inOnData;
 };

......

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

      m_inOnData = FALSE;
 }

你可能会喜欢一个作用域 RIIA 结构(这样事情就会异常安全并且稍微不那么冗长)

You could get the window proc to ignore the message or to queue it's execution. If you're just looking to avoid recursion, have a reentrance lock

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

       ...
     private:
        BOOL m_inOnData;
 };

....

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

      m_inOnData = FALSE;
 }

You could get fancy with a scoped RIIA struct (so things will be exception safe and slightly less verbose)

自由如风 2024-11-25 20:01:04

当然可以 - 只需在收到后检查 msg 中的消息编号即可。

Sure - just check the message number in msg after receipt.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文