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

基于VHF的多显示器虚拟数位笔跨屏输入映射问题求助

求助:基于VHF内核驱动实现数位笔跨双显示器输入映射

之前我用Wacom Intuos数位笔,通过InjectSyntheticPointerInput接口模拟数位笔输入,借助EnumDisplayMonitors获取虚拟工作区尺寸,能将数位笔输入归一化后映射到单显示器或跨双显示器工作区,效果正常。但这套方案无法操作Session 0中的UAC提示和登录界面,用PSExec提升到Session 0的方式稳定性差,还容易受Windows更新影响。

于是我改用VHF(Virtual HID Framework)内核驱动,通过IOCTL向驱动发送输入,目前鼠标、键盘及数位笔输入都能正常工作(驱动处于测试模式安装状态),但遇到一个问题:数位笔输入始终被限制在主显示器内,X/Y值范围固定为(0,0)至(65535,65535),对应主显示器的右上角到左下角,而之前的方案可以基于EnumDisplayMonitors获取的像素工作区做归一化处理。

现在想请教如何实现数位笔输入的跨双显示器映射,我基于微软HIDInjector Sample开发驱动,已经尝试了两个排查方向:

  • 检查VHF驱动的HID报告描述符:查阅了HID 1.11、1.4文档及VHF相关资料,均未提及多显示器映射相关内容,推测此方向可能无解;
  • 调整Windows系统设置或注册表项:尝试将数位笔输入从单显示器切换为多显示器模式,但参考资料中的注册表项在我的系统中不存在。

附当前使用的VHF HID报告描述符:

0x05, 0x0D,                    // Usage Page (Digitizer)
0x09, 0x02,                    // Usage (Pen)
0xA1, 0x01,                    // Collection (Application)
0x09, 0x20,                    //   Usage (Stylus)
0x85, HID_PEN_ID,              //   Report ID (3)
0xA1, 0x00,                    //   Collection (Physical)
0x09, 0x32,                    //     Usage (In Range)
0x09, 0x42,                    //     Usage (Tip Switch)
0x09, 0x44,                    //     Usage (Barrel Switch)
0x15, 0x00,                    //     Logical Minimum (0)
0x25, 0x01,                    //     Logical Maximum (1)
0x95, 0x03,                    //     Report Count (3)
0x75, 0x01,                    //     Report Size (1)
0x81, 0x02,                    //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01,                    //     Report Count (1)
0x75, 0x05,                    //     Report Size (5)
0x81, 0x03,                    //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

0x05, 0x01,                    //     Usage Page (Generic Desktop Ctrls)
0x09, 0x30,                    //     Usage (X)
0x09, 0x31,                    //     Usage (Y)
0x15, 0x00,                    //     Logical Minimum (0)
0x27, 0xFF, 0xFF, 0x00, 0x00,  //     Logical Maximum (65535)
0x75, 0x10,                    //     Report Size (16)
0x95, 0x02,                    //     Report Count (2)
0x81, 0x02,                    //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

0x05, 0x0D,                    // Usage Page (Digitizer)
0x09, 0x30,                    //     Usage (Tip Pressure)
0x15, 0x00,                    //     Logical Minimum (0)
0x26, 0x00, 0x04,              //     Logical Maximum (1024)
0x35, 0x00,                    //     Physical Minimum (0)
0x46, 0x00, 0x04,              //     Physical Maximum (1024)
0x75, 0x10,                    //     Report Size (16)
0x95, 0x01,                    //     Report Count (1)
0x81, 0x02,                    //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

对应的C结构体:

typedef struct _HIDINJECTOR_INPUT_REPORT {
    unsigned char ReportId;
    struct {
        UCHAR Flags; // In Range, Tip Switch, Barrel Switch
        USHORT AbsoluteX;
        USHORT AbsoluteY;
        USHORT Pressure;
    } Pen;
} HIDINJECTOR_INPUT_REPORT, *PHIDINJECTOR_INPUT_REPORT;

内容的提问来源于stack exchange,提问作者vulkur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:47:07