基于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
相关产品推荐
相关产品推荐

