一台电脑连接俩键盘,一个键盘正常使用,另一个键盘试试自定义一下吧!
一、获取键盘的硬件 ID(Windows 系统)
- 按下
Win + X,选择设备管理器。 - 在设备管理器中展开键盘选项,会看到已连接的键盘设备(可能显示为 "标准键盘""HID 键盘设备" 等)。
- 右键点击其中一个键盘,选择属性 → 切换到详细信息 选项卡 → 在 "属性" 下拉菜单中选择硬件 ID。
- 此时会显示该键盘的硬件 ID(格式通常为
HID\VID_XXXX&PID_XXXX&REV_XXXX或USB\VID_XXXX&PID_XXXX),复制该 ID(可右键选择 "复制值")。 - 对另一个键盘重复上述操作,分别记录两个键盘的硬件 ID(记为 ID1 和 ID2,对应键盘 A 和键盘 B)。
二、编写 AutoHotkey 脚本
AutoHotkey 的RawInput功能可实现按设备 ID 区分输入设备,以下是具体脚本模板及说明:
- 先确保已安装 AutoHotkey(建议下载最新版,官网:https://www.autohotkey.com/)。
- 新建文本文档,将后缀改为
.ahk(如DoubleKeyboard.ahk),用记事本打开并写入以下脚本:
bash
#Persistent
#SingleInstance Force
; 定义两个键盘的硬件ID(替换为你实际获取的ID,可只保留VID和PID部分,简化匹配)
KeyBoardID1 := "VID_1234&PID_5678" ; 键盘A的硬件ID(可截取VID和PID部分,无需完整)
KeyBoardID2 := "VID_9ABC&PID_DEF0" ; 键盘B的硬件ID
; 初始化RawInput
RawInput_Init()
; 监听键盘输入事件
OnMessage(0x00FF, "RawInput_Event") ; 0x00FF是自定义消息,也可使用其他未占用消息号
return
; RawInput初始化函数
RawInput_Init() {
global hRawInput
VarSetCapacity(RAWINPUTDEVICE, 8)
NumPut(1, RAWINPUTDEVICE, 0, "UShort") ; USHORT usUsagePage; 1=通用桌面控件
NumPut(6, RAWINPUTDEVICE, 2, "UShort") ; USHORT usUsage; 6=键盘
NumPut(0x100, RAWINPUTDEVICE, 4, "UInt") ; DWORD dwFlags; 0x100=RIDEV_INPUTSINK
NumPut(WinExist("A"), RAWINPUTDEVICE, 8, "Ptr") ; HWND hWndTarget; 绑定到当前脚本窗口
if (!RegisterRawInputDevices(&RAWINPUTDEVICE, 1, 8)) {
MsgBox, 注册RawInput失败!
ExitApp
}
}
; RawInput事件处理函数
RawInput_Event(wParam, lParam) {
global KeyBoardID1, KeyBoardID2
VarSetCapacity(RAWINPUTHEADER, 16)
nSize := VarSetCapacity(RAWINPUT, 0)
if (GetRawInputData(lParam, 0x10000003, &RAWINPUT, &nSize, 16) = -1) ; 0x10000003=RID_INPUT
return
hDevice := NumGet(RAWINPUTHEADER, 0, "Ptr")
if (!hDevice)
return
; 获取设备名称(包含硬件ID信息)
VarSetCapacity(szDevice, 256)
if (GetRawInputDeviceInfo(hDevice, 0x20000000, &szDevice, &nSize) = -1) ; 0x20000000=RIDI_DEVICENAME
return
DeviceName := StrGet(&szDevice, nSize, "UTF-16")
; 匹配硬件ID
if (InStr(DeviceName, KeyBoardID1)) {
; 处理键盘A的按键
ProcessKey(RAWINPUT, "A")
} else if (InStr(DeviceName, KeyBoardID2)) {
; 处理键盘B的按键
ProcessKey(RAWINPUT, "B")
}
}
; 按键处理函数
ProcessKey(RAWINPUT, KeyBoardType) {
if (NumGet(RAWINPUT, 0, "UShort") = 1) { ; 确认是键盘输入
KeyFlags := NumGet(RAWINPUT, 10, "UShort") ; 按键状态(0=按下,1=释放,2=重复)
KeyCode := NumGet(RAWINPUT, 12, "UShort") ; 虚拟键码
if (KeyFlags = 0) { ; 仅处理按键按下事件
if (KeyCode = 0x70) { ; F1键的虚拟键码为0x70
if (KeyBoardType = "A") {
Run, explorer.exe "https://www.baidu.com" ; 键盘A的F1打开浏览器(百度)
} else if (KeyBoardType = "B") {
Run, notepad.exe ; 键盘B的F1打开记事本
}
}
; 可添加其他按键处理,例如:
; if (KeyCode = 0x71) { ; F2键
; if (KeyBoardType = "A") {
; ; 键盘A的F2功能
; }
; }
}
}
}
; 调用系统API的声明(需放在脚本开头或函数外)
RegisterRawInputDevices(pRawInputDevice, nNumDevices, cbSize) {
return DllCall("User32.dll\RegisterRawInputDevices", "Ptr", pRawInputDevice, "UInt", nNumDevices, "UInt", cbSize)
}
GetRawInputData(hRawInput, uiCommand, pData, pcbSize, cbSizeHeader) {
return DllCall("User32.dll\GetRawInputData", "Ptr", hRawInput, "UInt", uiCommand, "Ptr", pData, "Ptr", pcbSize, "UInt", cbSizeHeader)
}
GetRawInputDeviceInfo(hDevice, uiCommand, pData, pcbSize) {
return DllCall("User32.dll\GetRawInputDeviceInfoW", "Ptr", hDevice, "UInt", uiCommand, "Ptr", pData, "Ptr", pcbSize)
}
三、脚本修改说明
- 硬件 ID 简化 :脚本中
KeyBoardID1和KeyBoardID2可只保留VID_XXXX&PID_XXXX部分(例如设备管理器中硬件 ID 为HID\VID_04F3&PID_0103&REV_0100,则截取VID_04F3&PID_0103),避免因完整 ID 过长导致匹配失败。 - 按键虚拟键码 :脚本中
0x70是 F1 键的虚拟键码,其他按键的虚拟键码可参考 AutoHotkey 官方文档(虚拟键码表),例如 F2 为0x71、Enter 为0x0D、Ctrl 为0x11等。 - 功能自定义 :将
Run, explorer.exe "https://www.baidu.com"和Run, notepad.exe替换为你需要的功能,例如:- 打开软件:
Run, "C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE"(打开 Word)。 - 快捷键操作:
Send, ^c(模拟 Ctrl+C 复制)。 - 执行命令:
Run, cmd /c echo "Hello World"(执行 CMD 命令)。
- 打开软件:
四、运行与测试脚本
- 保存
.ahk脚本文件后,双击运行(需已安装 AutoHotkey,脚本图标会出现在系统托盘)。 - 分别用键盘 A 和键盘 B 按下 F1 键,测试是否分别打开浏览器和记事本。
- 若脚本未生效,可检查:
- 硬件 ID 是否正确(可尝试在脚本中保留完整硬件 ID,或调整匹配的字符串片段)。
- AutoHotkey 是否为管理员权限运行(右键脚本→"以管理员身份运行")。
- 键盘是否为 USB/HID 标准键盘(部分特殊键盘可能不支持 RawInput 直接识别,可尝试更换 USB 端口)。
五、进阶优化
- 多按键扩展 :在
ProcessKey函数中添加更多KeyCode判断,实现多个按键的自定义功能。 - 按键释放处理 :若需处理按键释放事件,可将
KeyFlags = 1的条件加入判断。 - 脚本暂停 / 退出 :在脚本中添加热键(如
Esc::ExitApp),按下 Esc 键退出脚本,方便调试。
