Что может привести к тому, что DefWindowProc остановит обработку сообщений? - PullRequest
1 голос
/ 31 июля 2009

Я столкнулся со странным поведением моего приложения. Я хотел бы закрыть окно фрейма в приложении MDI, поэтому я посылаю WM_SYSCOMMAND (SC_CLOSE) в это окно. После этого я получаю OnSysCommand. Затем я вызываю CMDIChildWnd :: OnSysCommand для продолжения обработки.

Проблема в том, что иногда базовая реализация OnSysCommand вызывает OnClose и мой фрейм разрушается, а иногда нет. Я провел расследование, и кажется, что различия появляются в _NtUserMessageCall (на самом деле этот метод вызывает некоторую функцию режима ядра, которая не работает). Когда WS_SYSCOMMAND завершается успешно, _NtUserMessageCall вызывает DispatchHook и целую кучу методов user32.dll, и мое сообщение достигает целевого окна. Если это не удается, окно фрейма не закрывается и OnClose не вызывается.

У меня заканчиваются идеи, что может вызвать такое странное поведение. Я проверил приложение с Application Verifier, и все, кажется, в порядке. Еще одна вещь, проблема появляется только если мое приложение запускается через COM.

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

1 Ответ

1 голос
/ 16 сентября 2009

Я бы посоветовал, чтобы в вашем обработчике OnSysCommand просто отправили сообщение WM_CLOSE в главное окно кадра, прежде чем вызывать обработку по умолчанию.

Но даже не беспокойтесь о вызове метода CMDIChildWnd :: OnSysCommand .

...