Windows 11下SendInput发送VK_MEDIA_PLAY_PAUSE虚拟键无效问题
问题原因
这是Windows 11对媒体按键模拟的兼容性规则变更导致的:音量调整类按键的权限限制更宽松,但是播放暂停类媒体按键的触发需要满足额外的条件,系统会过滤不符合规则的模拟输入事件。
解决方法
- 增加按键按下和抬起的时间间隔
你当前的代码是按下按键后立刻触发抬起,Win11输入栈大概率会把这种极短的按键事件判定为误触发直接过滤,可在两次SendInput调用之间加10~50毫秒的延时:input.ki.dwFlags = 0; // 0 for key press auto x = SendInput(1, &input, sizeof(INPUT)); Sleep(20); // 新增20ms延时 input.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release x = SendInput(1, &input, sizeof(INPUT)); - 改用扫描码模式发送输入
部分Win11版本对虚拟键模式的媒体按键模拟拦截更严格,可切换为扫描码模式发送输入,修改KEYBDINPUT初始化逻辑即可:
各类媒体按键对应的扫描码参考:KEYBDINPUT kbi; kbi.wVk = 0; // 虚拟键值设为0 kbi.dwFlags = KEYEVENTF_SCANCODE; // 开启扫描码模式 kbi.time = 0; kbi.dwExtraInfo = (ULONG_PTR)GetMessageExtraInfo();- 播放暂停:0xE2
- 下一曲:0x99
- 上一曲:0x90
- 音量加:0x80
- 音量减:0x81
- 排查系统侧设置问题
先手动按物理键盘上的播放暂停按键,确认系统可以正常响应,排除没有设置默认媒体应用、没有正在运行的支持媒体控制的程序这类系统设置问题。 - 调整程序运行权限
如果你的程序是用管理员权限运行的,部分UWP应用的媒体控制接口不会响应高权限进程发送的模拟输入,可尝试不加管理员权限直接运行程序测试。
内容的提问来源于stack exchange,提问作者Enes
相关产品推荐
相关产品推荐

