0

一个简单的问题:那是什么信息?它来自哪里?

症状:

我在关闭我的应用程序时遇到了CWnd::WalkPreTranslateMessage崩溃。这是由 CWinApp::PreTranslateMessage在主框架被销毁并且其 C++ 对象被销毁以及在 MFC 内部处理 WM_QUIT 消息之前处理的消息引起的 - 我不调用(Afx)PostQuitMessage

我重载了CWinApp::PreTranslateMessage来跟踪通过的消息。

这发生在 VS2005(32 位)和 VS2010(64 位)以及调试和发布模式下。

时间线:

  1. CWinThread::m_pMainWnd为 NULL(已正确销毁)
  2. 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;

请帮我识别这些消息,谢谢!

4

1 回答 1

0

该范围内的消息(高于 0xC000 的任何消息)从RegisterWindowMessage. 我怀疑你做错了什么,因为这种事情不应该发生——而且在正确编写的 MFC 应用程序中也不应该发生。

于 2013-01-23T01:19:28.013 回答