Скажите Windows, чтобы обработать все, кроме одного сообщения - PullRequest
0 голосов
/ 06 июля 2011

У меня есть функция, вызванная сообщением (определено мной WM_ONDATA), функция выполнит этот код:

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

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

Проблема в том, что в очереди сообщений может быть другое сообщение, которое может вызвать функцию.

Мне интересно, смогу ли я заставить его обрабатывать все сообщения, кроме WM_ONDATA?

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Напомним, что третий и четвертый параметры PeekMessage позволяют вам указать диапазон значений сообщения. Сообщения за пределами этого диапазона не будут обрабатываться.

while (PeekMessage(&msg, NULL, 0, WM_ONDATA - 1, PM_NOREMOVE)
    || PeekMessage(&msg, NULL, WM_ONDATA + 1, 0xffff, PM_NOREMOVE))
0 голосов
/ 06 июля 2011

Вы могли бы заставить оконную процедуру игнорировать сообщение или ставить в очередь его выполнение.Если вы просто хотите избежать рекурсии, установите блокировку входа

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

       ...
     private:
        BOOL m_inOnData;
 };

....

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

      m_inOnData = FALSE;
 }

Вы можете получить фантазию со структурой RIIA с определенной областью (так что все будетисключение безопасно и немного менее многословно)

0 голосов
/ 06 июля 2011

Конечно - просто проверьте номер сообщения в сообщении после получения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...