Почему я не могу получить сообщение WM_DESTROY или WM_CLOSE вне оконной процедуры?

Я хотел прочитать сообщения в моем цикле сообщений прямо перед отправкой их в мою оконную процедуру. Большинство сообщений, которые я пытался прочитать, были прочитаны правильно, но когда я закрывал окно, WM_CLOSE или же WM_DESTROY сообщение не может быть прочитано, так как кажется, что оно никогда не было получено. Вот что я делаю:

void Framework::Run(){
while(running){

MSG msg;
while(PeakMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
switch(msg.message){
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_QUIT:
running = false;
break;
//...other cases...
}
DispatchMessage(&msg);
}
//...
}
}

Я ставлю точку останова в первом случае, но даже когда я закрываю окно (нажав «X»), точка останова никогда не срабатывает. Хотя, когда я проверяю WM_DESTROY в процедуре окна это читается, и все идет хорошо. Почему не снаружи?

Такие сообщения отправляются напрямую в окно proc? Как?

-1

Решение

Цикл сообщений видит только те сообщения, которые размещены в очереди сообщений. Не все сообщения проходят через очередь сообщений. WM_DESTROY это одно из таких сообщений. Вместо этого вы должны обрабатывать сообщения в оконной процедуре, чтобы вы видели каждое сообщение, которое получает окно, независимо от того, прошло сообщение через очередь сообщений или нет.

Если вам нужно просмотреть сообщения для окна, которое вы не создаете сами, или для стандартного окна, в котором предусмотрена системная оконная процедура, вы можете подкласс окна с помощью SetWindowSubclass().

2

Другие решения


По вопросам рекламы [email protected]