WM_KEYFIRST 和 WM_KEYDOWN(都是 0x0100)是啥意思?为啥它是 4 个十六进制数字长? [复制]

Posted

技术标签:

【中文标题】WM_KEYFIRST 和 WM_KEYDOWN(都是 0x0100)是啥意思?为啥它是 4 个十六进制数字长? [复制]【英文标题】:What's the meaning of WM_KEYFIRST and WM_KEYDOWN (both 0x0100)? And why it's 4 hex digits long? [duplicate]WM_KEYFIRST 和 WM_KEYDOWN(都是 0x0100)是什么意思?为什么它是 4 个十六进制数字长? [复制] 【发布时间】:2021-05-04 15:39:18 【问题描述】:

什么意思

#define WM_KEYFIRST 0x0100
#define WM_KEYDOWN  0x0100
#define WM_KEYUP 0x0101

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

【问题讨论】:

WM_KEYFIRST 可能是这样您可以很容易地找到第一个键,或者在数学中使用它来获取数组索引 (arr[key_read - WM_KEYFIRST]) 或用于其他邪恶目的。 关于另一个问题“为什么它是 4 个十六进制数字”,这是因为应用程序使用的消息标识符是 WORD(16 位)大小的。来自MSG 文档:“消息 - 类型:UINT - 消息标识符。应用程序只能使用低位字;高位字由系统保留。”。 【参考方案1】:

WM_KEYFIRSTWM_KEYLAST 定义了与键盘相关的消息的范围。这比将范围硬编码为WM_KEYDOWNWM_UNICHAR 更容易记住,而且更便携,因为例如WM_KEYLAST 在Windows XP 之前不是 WM_UNICHAR

例如,以下将过滤键盘相关消息。

for(MSG msg; PeekMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE); )  ... 

这实际上在PeekMessage 文档中特别注明。

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

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

【讨论】:

以上是关于WM_KEYFIRST 和 WM_KEYDOWN(都是 0x0100)是啥意思?为啥它是 4 个十六进制数字长? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

WM_KEYDOWN 如何处理不同的键?

如何检测子窗口上的 WM_KEYDOWN?

如何创建 SendMessage WM_KEYDOWN 的 lParam

对话框捕获WM_KEYDOWN消息

MFC:对话框 PreTranslateMessage() WM_KEYDOWN 没有看到 VK_DELETE?

键盘消息捕获