You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:45:42