【问题标题】:Message id's in the main application loop主应用程序循环中的消息 ID
【发布时间】:2021-08-07 22:53:50
【问题描述】:

我在 Win 10 上的 Visual Studio 2019 中编写了一个简单的Win32 App。在WinMain 函数内的主消息循环中,我有:

while (Msg.message != WM_QUIT) {

    if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) > 0) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);

        swprintf_s(msgbuf, _T("In the PeekMessage loop cnt: %d, msg: %d\n"), loop_cnt++, Msg.message);
        OutputDebugString(msgbuf);
    }
...
}

我得到以下输出:

In the PeekMessage loop cnt: 0, msg: 799
In the PeekMessage loop cnt: 1, msg: 49300
In the PeekMessage loop cnt: 2, msg: 96
In the PeekMessage loop cnt: 3, msg: 96
In the PeekMessage loop cnt: 4, msg: 275
In the PeekMessage loop cnt: 5, msg: 275
...

奇怪的是,像 79949300 这样返回到输出的消息 ID 在 WinUser.h 中不存在!所以我的问题是这些消息是什么以及它来自哪里?

【问题讨论】:

    标签: c++ visual-studio winapi


    【解决方案1】:

    799 是WM_DWMNCRENDERINGCHANGED

    49300 是一个registered message(即它的值在 0xC000-0xFFFF 范围内)。

    【讨论】:

    • 我知道注册消息,所以很简单。对于我没有立即识别的其他所有常量,我只需转到 MagNumDB 并从那里获取。
    • 96 是未记录的系统消息。但是275WM_TIMER (0x113)。如果您以十六进制而不是十进制打印消息 ID,这会有所帮助,因为 winuser.h(和其他定义消息 ID 的 Win32 标头)使用十六进制文字。
    • 或者,您可以在调试器中添加带有消息格式 (Msg.message,wm) 的监视,并让调试器帮助您查找符号常量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多