WM_KEYFIRST 和 WM_KEYDOWN(均为 0x0100)的含义是什么?为什么它是 4 个十六进制数字?

Smi*_*use 1 c++ winapi msdn

什么意思

#define WM_KEYFIRST 0x0100
#define WM_KEYDOWN  0x0100
#define WM_KEYUP 0x0101
Run Code Online (Sandbox Code Playgroud)

? 这些是winuser.h库中的第1038、1039 和 1040 行。为什么这些值以及为什么WM_KEYFIRSTWM_KEYDOWN两者都与相同的值有关0x0100?将两个名称设为相同值的目的是什么?为什么它是 4 个十六进制数字?请告诉我这个魔法!

dxi*_*xiv 5

WM_KEYFIRSTWM_KEYLAST键盘相关的消息的定义的范围内。这比硬编码的范围像更容易记住WM_KEYDOWNWM_UNICHAR,也更便于携带,因为例如WM_KEYLAST没有 WM_UNICHAR的Windows XP之前。

例如,下面将过滤与键盘相关的消息。

for(MSG msg; PeekMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE); ) { ... }
Run Code Online (Sandbox Code Playgroud)

这实际上在PeekMessage文档中特别指出。

wMsgFilterMin - 类型:UINT - 要检查的消息范围中的第一条消息的值。使用 WM_KEYFIRST (0x0100) 指定第一条键盘消息或使用 WM_MOUSEFIRST (0x0200) 指定第一条鼠标消息。

wMsgFilterMax - 类型:UINT - 要检查的消息范围中的最后一条消息的值。使用 WM_KEYLAST 指定最后一个键盘消息或使用 WM_MOUSELAST 指定最后一个鼠标消息。