我有一个由消息触发的函数(由我定义的WM_ONDATA),该函数将执行此代码:
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if( !AfxGetApp()->PumpMessage() )
{
::PostQuitMessage(0);
return 0;
}
}
return 1;
问题是消息队列中可能存在另一条可能触发该功能的消息。
我想知道我是否可以让它处理所有消息但WM_ONDATA?
答案 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结构(因此事情将是异常安全且稍微冗长)