我遇到了应用程序的奇怪行为。我想在MDI应用程序中关闭框架窗口,因此我将WM_SYSCOMMAND(SC_CLOSE)发送到该窗口。之后,我收到OnSysCommand。然后,我调用CMDIChildWnd::OnSysCommand进行处理。
问题是,有时OnSysCommand的基本实现会调用OnClose,而我的框架却被破坏了,而有时却没有。我进行了调查,似乎_NtUserMessageCall中出现了差异(实际上此方法调用了一些失败的内核模式函数)。
当WS_SYSCOMMAND成功时,_NtUserMessageCall调用DispatchHook和整个user32.dll方法,我的消息到达目标窗口。如果失败,则不会关闭框架窗口,并且不会调用OnClose。
我没想到什么会导致这种奇怪的行为。我使用Application Verifier检查了应用程序,一切似乎都很好。还有一件事,仅当我的应用程序通过COM启动时,问题才会出现。
我正在为这个问题奋斗了两天,我需要一些新的线索来继续挖掘。
最佳答案
我建议在您的OnSysCommand处理程序中,仅在继续调用默认处理之前,将 WM_CLOSE 消息发送到主框架窗口。
但是,甚至不必打扰 CMDIChildWnd::OnSysCommand 方法。