如何像识别游戏控制器一样区分多键盘,实现单Windows应用分编辑器输入?
Windows多键盘独立识别实现方案
基于Electron + Node.js的实现方案
Windows系统默认会合并所有外接键盘的输入事件,标准Web API和Node.js内置模块都无法获取输入对应的设备来源,需要调用Windows原生的Raw Input API实现区分:
- 依赖封装了Raw Input接口的Node.js原生模块,比如
node-rawinput,无需自己手写C++扩展 - 主进程中调用接口完成以下逻辑:
- 枚举所有接入的HID键盘设备,使用
VID(厂商ID)+ PID(产品ID)+ 实例ID作为每个键盘的唯一标识,和对应玩家身份做绑定 - 监听Raw Input的全局输入回调,根据事件携带的设备ID判断输入来源
- 通过IPC将输入内容分发到渲染进程对应玩家的编辑器组件
- 枚举所有接入的HID键盘设备,使用
- 需要额外处理的边界情况:
- 应用启动后新接入的键盘热插拔识别
- 同型号键盘的实例ID区分,部分廉价键盘可能没有唯一实例ID,需要做首次接入的绑定引导
- 禁用渲染进程默认的键盘输入监听,避免输入重复触发
更适配的替代技术栈
如果仅需支持Windows平台,推荐使用C# + WPF/WinForm技术栈,开发和维护成本更低:
- .NET框架内置了Raw Input相关封装,无需处理Node原生扩展的跨版本编译、兼容性问题
- 输入分发、多编辑器焦点管理的实现更简单,输入延迟远低于Electron方案
- 系统权限申请、设备异常处理的官方文档更完善
不要尝试用普通的
keydown、keypress事件实现设备区分,这类事件已经是系统合并所有输入后的统一事件,不会携带任何输入设备的标识信息
内容的提问来源于stack exchange,提问作者강대원
相关产品推荐
相关产品推荐

