一个简单的问题:那是什么信息?它来自哪里?
症状:
我在关闭我的应用程序时遇到了CWnd::WalkPreTranslateMessage崩溃。这是由 CWinApp::PreTranslateMessage在主框架被销毁并且其 C++ 对象被销毁以及在 MFC 内部处理 WM_QUIT 消息之前处理的消息引起的 - 我不调用(Afx)PostQuitMessage。
我重载了CWinApp::PreTranslateMessage来跟踪通过的消息。
这发生在 VS2005(32 位)和 VS2010(64 位)以及调试和发布模式下。
时间线:
- CWinThread::m_pMainWnd为 NULL(已正确销毁)
CWinApp::PreTranslateMessage被调用
其参数MSG* 消息如下所示:
hwnd: NULL message: varies from 49390 to 49401 wParam: 17 lParam: looks random
=> 在CWnd::WalkPreTranslateMessage中崩溃
在运行时,我看到带有该 ID 的消息通过 CWinApp::PreTranslateMessage传递。有一种有趣的消息可能有助于确定这些消息的来源:
MSG* 消息如下所示:
hwnd: NULL
message: 49390
wParam: 17
lParam: looks random at first, though ...
lParam hiword: is incremented by 1 each time the message passes through
lParam loword: is constant
这些消息似乎是其中 hwnd 明确为 NULL 的线程消息。我仍然想知道它们有什么用,如何阻止它们填充消息队列或如何处理它们以在关闭时不使应用程序崩溃。
好吧,现在我这样处理它是不对的。
if (m_pMainWnd)
return CWinApp::PreTranslateMessage(pMsg);
else
return FALSE;
请帮我识别这些消息,谢谢!