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_KEYFIRST
和WM_KEYDOWN
都与相同的值0x0100
相关?将两个名称设为相同值的目的是什么?为什么它是 4 个十六进制数字长?请告诉我这个魔法!
【问题讨论】:
WM_KEYFIRST
可能是这样您可以很容易地找到第一个键,或者在数学中使用它来获取数组索引 (arr[key_read - WM_KEYFIRST]
) 或用于其他邪恶目的。
关于另一个问题“为什么它是 4 个十六进制数字”,这是因为应用程序使用的消息标识符是 WORD
(16 位)大小的。来自MSG
文档:“消息 - 类型:UINT - 消息标识符。应用程序只能使用低位字;高位字由系统保留。”。
【参考方案1】:
WM_KEYFIRST
到 WM_KEYLAST
定义了与键盘相关的消息的范围。这比将范围硬编码为WM_KEYDOWN
到WM_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 个十六进制数字长? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何创建 SendMessage WM_KEYDOWN 的 lParam