You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Get/SetKeyboardState()配合PostMessage()修改键盘状态及相关疑问

关于模拟按键时键盘状态操作的问题解答

1. |= 0x80是否表示“按键按下”?

是的。Windows的GetKeyboardState/SetKeyboardState操作的256字节数组中,每个字节的**最高位(第7位,对应十六进制0x80)**用来标记对应虚拟按键是否处于按下状态。使用|= 0x80是将该位设置为1,以此告诉系统“此按键当前被按下”。

2. 按键抬起对应的值是不是KeybState[...] = 0?

不完全准确。正确的做法是将对应字节的最高位清零,也就是执行KeybState[...] &= ~0x80。因为有些按键(比如Caps Lock、Num Lock这类切换键)的第0位用来标记锁定状态,如果直接赋值为0,会同时清除锁定状态,导致意外的行为。只有当你确定不需要保留锁定状态时,直接赋值0才可行,但更严谨的方式是仅清除按下位。

3. 发送#字符时是否需要添加KeybState[0x33] |= 0x80?

需要。#是通过Shift + 数字3输入的,所以你需要同时标记Shift和数字3键的按下状态,并且配合对应的消息发送,修正后的代码示例如下:

BYTE KeybState[256] = { '\0' };
GetKeyboardState(KeybState);

// 标记Shift和3键按下
KeybState[VK_SHIFT] |= 0x80;
KeybState[0x33] |= 0x80;
SetKeyboardState(KeybState);

// 发送按键按下消息
PostMessage(hWnd, WM_KEYDOWN, VK_SHIFT, lParam);
PostMessage(hWnd, WM_KEYDOWN, 0x33, lParam);

// 标记按键抬起并发送抬起消息
KeybState[VK_SHIFT] &= ~0x80;
KeybState[0x33] &= ~0x80;
SetKeyboardState(KeybState);

PostMessage(hWnd, WM_KEYUP, 0x33, lParam);
PostMessage(hWnd, WM_KEYUP, VK_SHIFT, lParam);

另外要注意,你的原代码中只发送了VK_SHIFT的WM_KEYDOWN和0x33的WM_KEYUP,消息序列不完整,会导致系统状态异常,必须保证每个WM_KEYDOWN对应一个WM_KEYUP,且顺序要正确。


内容的提问来源于stack exchange,提问作者Cesar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:36:21