WinAPI - цикл сообщений с собственным обратным вызовом - PullRequest
3 голосов
/ 18 марта 2012

Обычный цикл сообщений WinAPI выглядит примерно так:

MSG msg;
while (GetMessage(&msg, hwnd, 0, 0))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

Разрешено ли вызывать не DispatchMessage (), а обрабатывать сообщение самостоятельно?Если нет, то как я мог бы подходить к этому поведению, избегая глобальных переменных и проблем с потоками?

Редактировать: Я в основном хочу использовать свою собственную функцию обратного вызова, которая не имеет сигнатуры WndProc.Но я не могу придумать, как вызвать эту функцию из WndProc без использования статических или глобальных переменных.[Что потребует блокировки, что, я думаю, не самое лучшее, что вы можете сделать с помощью функции обратного вызова, которая, вероятно, вызывается очень часто.]

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 19 марта 2012

Разрешено ли не вызывать DispatchMessage (), а обрабатывать сообщение самостоятельно?Если нет, то как я мог бы подходить к этому поведению, избегая глобальных переменных и проблем с потоками?

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

С этой страницы: http://msdn.microsoft.com/en-us/library/ms810439.aspx

Изменения в цикле сообщений

Приложения с несколькими потоками должны включать цикл сообщений вкаждый поток, который создает окно.Цикл сообщений и оконная процедура для окна должны обрабатываться потоком, создавшим окно.Если цикл обработки сообщений не находится в том же потоке, который создал окно, функция DispatchMessage не будет получать сообщения для окна.В результате появится окно, но оно не будет отображать активацию и не будет перекрашиваться, перемещаться, получать сообщения мыши или вообще работать так, как вы ожидаете.

2 голосов
/ 18 марта 2012

Вы можете отреагировать на сообщение там, но вам все еще нужно / хотите позвонить DispatchMessage и фактически обработать сообщение в вашем обычном wndproc. Я был бы рад рассказать больше о том, как избежать глобальных и / или многопоточных проблем, но трудно комментировать без более подробной информации о том, чего вы хотите избежать.

1 голос
/ 18 марта 2012

Да, вы можете обработать сообщение самостоятельно, если хотите.Я обычно устанавливаю в поле результата значение 0, но Windows использует это поле только для нескольких сообщений.

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