Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 告诉windows处理除一条消息外的所有消息_C++_Windows_Winapi_Mfc - Fatal编程技术网

C++ 告诉windows处理除一条消息外的所有消息

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; 问题是消息队列上可能存在另一条消息,该消息可

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

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。