2009-07-31 3 views
1

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

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

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

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

ответ

1

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

Но даже не надо называть CMDIChildWnd :: OnSysCommand метод.

Смежные вопросы