我正在开发一种工具,用于显示我们在工作中使用的系统上各种硬件组件的状态。目前,我们有 16 个触摸屏显示器(全部由 3M 提供)插入 Windows 10 盒子。我需要验证任何给定的显示器是否具有 Windows 识别的关联触摸屏。这是为了评估系统是否存在任何硬件故障,即电缆损坏、USB 端口损坏、显示器损坏等。我们看到这种情况的次数比我们愿意承认的要多,通常情况下显示器的显示屏可以正常工作,但两端的 USB Controller 退出并需要通过拔出/重新插入来重置
不幸的是,由于工作限制,我的代码发布将受到限制。
我可以通过 winapi 的 EnumDisplayDevices 枚举所有插入系统的监视器。和 EnumerateDisplayMonitors .我能够使用 HIDApi 构建所有 HID 触摸屏设备的列表。 .
从这里开始,我不知道去哪里将这两件事联系在一起,如果可能的话。我的第一个想法是 HID 设备信息应该具有某种由调用 EnumDisplayDevices 和 EnumerateDisplayMonitors 的结果共享的标识符,但我没有发现这种情况。另一种可能性是将监视器的坐标/大小与其中一个触摸 Controller 负责的区域进行比较。同样,不确定这是否可能。
简而言之,有没有办法通过 C++ 将 Touch 设备与其对应的显示器相关联?
最佳答案
我认为您很幸运,该驱动程序后缀与您的显示器配置相匹配。在我的 Windows 10 多显示器设置中,当我按照您的描述在驱动程序条目中使用此编号查找它们时,显示错误。
将 HID 设备与显示器相关联的可靠方法似乎是:
- 调用
GetRawInputDeviceList()
获取HID设备 - 使用
RIDI_DEVICEINFO
调用GetRawInputDeviceInfo()
以确定Usage
和UsagePage
- 使用
RIDI_DEVICENAME
调用GetRawInputDeviceInfo()
以获取\\\\?\\HID#VID_0EEF&PID_7200&Col01#6&152cc7f9&1&0000#{4d1e55b2- 形式的设备字符串f16f-11cf-88cb-001111000030}
- 在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wisp\Pen\Digimon
查询映射表的注册表并查找显示设备名称。在我的例子中,HID 名称都以20-
为前缀,但其余部分似乎与GetRawInputDeviceInfo()
查询的名称完全匹配。作为万一没有匹配项的后备方法,我还按照 Clay Brooks 在他的回答中描述的那样解析中间部分。 - 在循环中调用
EnumDisplayDevices()
,lpDevice
为空指针,dwFlags
为 0,直到函数返回零。 - 在每次循环迭代中,再次调用
EnumDisplayDevices()
并将当前设备作为lpDevice
并为dwFlags
调用EDD_GET_DEVICE_INTERFACE_NAME
> 并观察它以\\\\?\\DISPLAY#ELO2243#5&607b301&0&UID24833#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
形式返回DeviceID
/li> - 循环直到找到 HID <-> 显示匹配,然后获取“外部”
EnumDisplayDevices()
调用返回的DeviceName
,它应该类似于\\.\DISPLAY3
关于c++ - 将 HID 触摸设备与 Pnp 监视器相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42215120/