告诉窗口处理除一条消息外的所有消息
Tell windows to process all but one message
我有一个由消息(我定义的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结构体(这样事情就会异常安全并且稍微不那么冗长)
当然可以-收到后查看消息号即可。
相关文章:
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在 Win32 中用一条线连接 2 个文本框?
- C++ 如何在同一行中和在一条线上?
- 如何在SDL2窗口上使用Cairo绘制一条白色直线
- 在Opengl中绘制一条不显示C++的线
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- x86 - 为什么编译器在下一条指令中插入看似毫无意义的JMP?
- CMake似乎忽略了一条线
- 如何在OMNET++中收到来自前一个模块的所有消息后将一条消息发送到下一个模块
- 如何在另一条消息(M1)之前调用带有消息(M2)的lambda函数,但输出要"M2 M1"?
- 为什么 protobuf 只读取最后一条消息作为输入结果
- Win32 中是否有一条消息或通知来检测用户何时更改区域设置?
- 在C++,我收到一条消息"error: 'void*' is not a pointer-to-object type"
- C++ 有没有办法循环遍历一个向量,只有在完全搜索后才返回一条消息
- 我收到一条错误消息,显示"<<"标志"no operator matches these operands"
- 如果引发异常,则使外部C++函数返回一条消息
- 在一条UDP消息中发送两个数据块,而不复制数据块
- 我想在qt中单击(左或右)小部件时显示一条消息
- 如何确保在关闭连接之前成功发布最后一条AMQP消息
- 告诉窗口处理除一条消息外的所有消息