C++ 告诉windows处理除一条消息外的所有消息
我有一个由消息触发的函数(由我定义的WM_ONDATA),该函数将执行以下代码:C++ 告诉windows处理除一条消息外的所有消息,c++,windows,winapi,mfc,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; 问题是消息队列上可能存在另一条消息,该消息可
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if( !AfxGetApp()->PumpMessage() )
{
::PostQuitMessage(0);
return 0;
}
}
return 1;
问题是消息队列上可能存在另一条消息,该消息可能会触发该函数
我想知道我是否可以让它处理除WM_ONDATA之外的所有消息?当然-只需在收到消息后检查消息中的消息编号。当然-只需在收到消息后检查消息中的消息编号。您可以让窗口程序忽略消息或将其执行排队。如果您只是想避免递归,请使用重入锁
class MyDlg : ...
{
MyDlg(...) : m_inOnData(false), ... { .... }
...
private:
BOOL m_inOnData;
};
您可以使用作用域为RIIA的结构(这样事情将是异常安全的,稍微不那么冗长)您可以让窗口进程忽略消息或将其执行排队。如果您只是想避免递归,请使用重入锁
class MyDlg : ...
{
MyDlg(...) : m_inOnData(false), ... { .... }
...
private:
BOOL m_inOnData;
};
您可能会喜欢使用作用域RIIA结构(这样事情将是异常安全的,并且稍微不那么冗长)回想一下,PeekMessage的第三个和第四个参数允许您指定消息值的范围。超出该范围的邮件将不会被处理
while (PeekMessage(&msg, NULL, 0, WM_ONDATA - 1, PM_NOREMOVE)
|| PeekMessage(&msg, NULL, WM_ONDATA + 1, 0xffff, PM_NOREMOVE))
回想一下,PeekMessage的第三个和第四个参数允许您指定消息值的范围。超出该范围的邮件将不会被处理
while (PeekMessage(&msg, NULL, 0, WM_ONDATA - 1, PM_NOREMOVE)
|| PeekMessage(&msg, NULL, WM_ONDATA + 1, 0xffff, PM_NOREMOVE))
这样做的一个可能问题是,它将无序处理消息。将首先执行所有0..WM_ONDATA-1消息,然后处理所有WM_ONDATA+1..0xffff。这可能无关紧要。这样做的一个可能问题是,它将无序处理消息。将首先执行所有0..WM_ONDATA-1消息,然后处理所有WM_ONDATA+1..0xffff。这可能无关紧要。听起来您的设计可能有问题。这是一种让PostMessage像SendMessage一样工作的非常精细的方法。只需使用SendMessage。听起来您的设计可能有问题。这是一种让PostMessage像SendMessage一样工作的非常精细的方法。只需使用SendMessage。