Windows远程桌面连接时本地监听键盘+按键的实现方案咨询
远程桌面焦点下本地捕获"+"按键的解决办法
为什么pynput抓不到?
Windows远程桌面(RDP)会直接独占键盘输入流,把按键事件全转发给远程会话,pynput这类普通用户态的监听工具根本抢不到事件。
能用的解决方法
1. 写系统级底层钩子(C++/C#)
底层键盘钩子(LowLevelKeyboardProc)是系统级别的,优先级比RDP的钩子高,能在事件被转发前截下来。
- 可以写个轻量的C++ DLL,注册这个钩子,抓到"+"键后直接发MQTT消息,或者调用你已有的Python脚本。
- 核心逻辑示例(伪代码):
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { KBDLLHOOKSTRUCT* keyInfo = (KBDLLHOOKSTRUCT*)lParam; // 捕获"+"键按下事件 if (wParam == WM_KEYDOWN && keyInfo->vkCode == VK_OEM_PLUS) { // 执行发送MQTT的逻辑,比如调用本地Python脚本 system("python C:/your_script_path/mqtt_sender.py"); } return CallNextHookEx(NULL, nCode, wParam, lParam); } - 注意:这个程序得用管理员权限运行,不然钩子注册不成功。
2. 用AutoHotkey的底层钩子
AutoHotkey自带底层键盘钩子功能,能绕过RDP的独占限制:
- 写个简单的AHK脚本,监听"+"键,触发时调用你的Python脚本发MQTT:
; 启用底层键盘钩子 #InstallKeybdHook ; 监听"+"键按下 +:: Run, python "C:\你的脚本路径\mqtt_send.py" return - 右键以管理员权限运行这个AHK脚本就行,大部分场景下能在RDP焦点时抓到按键。
3. 改RDP的键盘捕获设置
Windows RDP有隐藏配置可以让本地保留部分按键控制权:
- 打开远程桌面连接的「显示选项」→「本地资源」→「键盘」,选「当我使用全屏模式时,仅使用本地键盘」;或者直接编辑rdp配置文件,加一行:
keyboardhook:i:2,窗口模式下本地就能抓按键了。 - 要是想全屏也生效,试试把值改成
keyboardhook:i:1,不过这个可能受服务器端组策略限制,不一定管用。
4. 硬件层面截获(如果是硬件模拟器)
如果你的模拟器是USB硬件设备,可以直接从USB端口抓HID报告,绕过Windows的输入系统,RDP根本碰不到这个层面的事件:
- 用libusb这类库写个工具,读取USB设备的按键数据,解析出"+"键按下的事件,再发MQTT消息就行。
内容的提问来源于stack exchange,提问作者Deesak
相关产品推荐
相关产品推荐

