如何用AutoHotkey精准检测KVM切换器的激活状态?
检测KVM切换器激活的AutoHotkey方案
你当前用的OnMessage(0x219, "notify_change")监听的是WM_DEVICECHANGE消息,这个消息会在所有设备状态变动时触发(比如USB设备插拔、外设连接断开等),所以需要通过解析消息参数来过滤出KVM切换相关的事件。
1. 核心思路:过滤WM_DEVICECHANGE的事件参数
WM_DEVICECHANGE的wParam参数标识事件类型,lParam指向的结构体包含设备类型信息,我们可以通过这两个参数精准筛选KVM触发的键鼠/显示器切换事件:
- 关键事件类型:
0x0007(设备节点变更,KVM切换时大概率触发)、0x8000(设备连接)、0x8004(设备断开) - 目标设备类型:键鼠(设备接口类型
5)、显示器(设备类型8)
2. 基础过滤代码示例
下面的代码只响应键鼠或显示器的设备变动事件,大幅减少误触发:
OnMessage(0x219, "HandleKVMChange") HandleKVMChange(wParam, lParam) { ; 跳过非目标事件类型 if (wParam != 0x0007 && wParam != 0x8000 && wParam != 0x8004) return ; 读取设备广播结构体的类型 VarSetCapacity(DEV_BROADCAST_HDR, A_PtrSize*2, 0) NumPut(lParam, DEV_BROADCAST_HDR, 0, "Ptr") deviceType := NumGet(DEV_BROADCAST_HDR, A_PtrSize, "UInt") ; 只处理键鼠或显示器事件 if (deviceType = 5 || deviceType = 8) { ; 这里替换为你的KVM切换处理逻辑 ToolTip, KVM切换事件已触发 SetTimer, ToolTip, -1500 } }
3. 精准识别KVM设备(进阶)
如果基础过滤仍有误触发,可以通过设备GUID进一步锁定键鼠/显示器:
- 键盘GUID:
{884B96C3-56EF-11D1-BC8C-00A0C91405DD} - 鼠标GUID:
{4D36E96F-E325-11CE-BFC1-08002BE10318} - 显示器GUID:
{E6F07B5F-EE97-4a90-B076-33F57BF4EAA7}
以下是带GUID匹配的进阶代码:
OnMessage(0x219, "HandleKVMChange") HandleKVMChange(wParam, lParam) { if (wParam != 0x0007 && wParam != 0x8000 && wParam != 0x8004) return VarSetCapacity(DEV_BROADCAST_HDR, A_PtrSize*2, 0) NumPut(lParam, DEV_BROADCAST_HDR, 0, "Ptr") deviceType := NumGet(DEV_BROADCAST_HDR, A_PtrSize, "UInt") if (deviceType = 5) { ; 处理键鼠设备接口 VarSetCapacity(DEV_BROADCAST_DEVICEINTERFACE, 32 + A_PtrSize*2, 0) NumPut(lParam, DEV_BROADCAST_DEVICEINTERFACE, 0, "Ptr") VarSetCapacity(GUID, 16, 0) NumGet(DEV_BROADCAST_DEVICEINTERFACE, A_PtrSize*2 + 8, "Int64") NumGet(DEV_BROADCAST_DEVICEINTERFACE, A_PtrSize*2 + 16, "Int64") ; 匹配键鼠GUID keyboardGUID := "{884B96C3-56EF-11D1-BC8C-00A0C91405DD}" mouseGUID := "{4D36E96F-E325-11CE-BFC1-08002BE10318}" if (DllCall("ole32.dll\StringFromGUID2", "Ptr", &GUID, "Str", "", "Int", 39) && (StrGet(&GUID) = keyboardGUID || StrGet(&GUID) = mouseGUID)) { ToolTip, KVM键鼠切换触发 SetTimer, ToolTip, -1500 } } elseif (deviceType = 8) { ; 处理显示器设备 ToolTip, KVM显示器切换触发 SetTimer, ToolTip, -1500 } }
额外提示
不同品牌KVM触发的事件参数可能略有差异,你可以在函数里添加日志写入(比如FileAppend),记录所有触发的wParam和deviceType,手动切换KVM后找到专属特征参数,再针对性优化过滤逻辑。
内容的提问来源于stack exchange,提问作者catquas
相关产品推荐
相关产品推荐

