将HID触控设备与Pnp监控器关联

时间:2017-02-13 23:04:24

标签: c++ windows hid touchscreen

我正在开发一个工具,显示我们在工作中使用的系统上各种硬件组件的状态。目前,我们有16个触摸屏显示器(全部由3M)插入Windows 10盒。我需要验证任何给定的监视器是否具有Windows识别的关联触摸屏。这是为了评估系统是否存在任何硬件故障,即电缆损坏,USB端口坏,显示器坏等等。我们认为这比我们想要承认的更多,通常显示器的显示器工作正常但是USB任何一端的控制器都会掉出来,需要通过拔出/插回来重置

不幸的是,由于工作限制,我的代码发布会受到限制。

我可以通过winapi的EnumDisplayDevicesEnumerateDisplayMonitors枚举插入系统的所有监视器。我可以使用HIDApi构建所有HID触摸屏设备的列表。

从这里开始,我没有指示将这两件事联系在一起的地方,如果有可能的话。我首先想到的是HID设备信息应该有一些由调用EnumDisplayDevices和EnumerateDisplayMonitors的结果共享的标识符,但我没有发现这种情况。另一种可能性是将监视器的坐标/大小与其中一个触摸控制器负责的区域进行比较。再次,不确定这是否可能。

简而言之,有没有办法通过c ++将Touch设备与相应的显示器相关联?

2 个答案:

答案 0 :(得分:3)

我认为您很幸运,此驱动程序后缀与您的显示器配置相匹配。在我的Windows 10多显示器设置中,当我在您所描述的驱动程序条目中使用此编号查找它时,显示错误。

将HID设备与显示器关联的可靠方法似乎是:

  1. 致电GetRawInputDeviceList()以获取HID设备
  2. 使用GetRawInputDeviceInfo()致电RIDI_DEVICEINFO以确定UsageUsagePage
  3. 使用GetRawInputDeviceInfo()致电RIDI_DEVICENAME以获取\\\\?\\HID#VID_0EEF&PID_7200&Col01#6&152cc7f9&1&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
  4. 形式的设备字符串
  5. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wisp\Pen\Digimon查询注册表以查找映射表,然后查找显示设备名称。在我的情况下,HID名称都以20-为前缀,但其余部分似乎与GetRawInputDeviceInfo()所查询的名称完全匹配。作为一种后备方法,如果没有匹配,我也会解析中间部分,就像Clay Brooks在他的回答中所描述的那样。
  6. 在循环中使用空指针EnumDisplayDevices()lpDevice调用dwFlags,直到函数返回零。
  7. 在每次循环迭代中,再次使用当前设备EnumDisplayDevices()lpDevice EDD_GET_DEVICE_INTERFACE_NAME调用dwFlags,并观察它在DeviceID中返回\\\\?\\DISPLAY#ELO2243#5&607b301&0&UID24833#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}表格DeviceName
  8. 循环直到HID< - >找到显示匹配并获取"外部"返回的EnumDisplayDevices() \\.\DISPLAY3调用应该是 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { File file = new File("C:\\Users\\sramya\\Desktop\\bfolder\\2014\\52063.pdf")‌​; response.setHeader("Content-Type", getServletContext().getMimeType(file.getName())); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "inline; filename=\"52063.pdf\""); Files.copy(file.toPath(), response.getOutputStream()); } }
  9. 之类的内容

答案 1 :(得分:2)

根据评论中的建议并深入了解注册表,我找到了将Touch控制器链接到显示器的方法。

使用HIDApi,您可以轮询系统并查找需要监控的所有Touch Controller的列表。我按照我们正在使用的监视器的VID进行过滤。路径的示例返回值如下所示:

" \\?\藏#vid_0596&安培; pid_0520&安培; col02#的 8和; 33d9e616 &安培0安培; 0001#{4d1e55b2-F16F-11CF-88cb-001111000030}"

粗体部分可用于链接HKLM / Software / Microsoft / Wisp / Pen / Digimon中的条目。一个示例条目是:

&#34; \\?\ HID#VID_0596&安培; PID_0520&安培; Col03#的 8和; 33d9e616 &安培0安培; 0002#{4d1e55b2-F16F-11CF-88cb-001111000030}&#34; &#34; \\?\ DISPLAY#的 MSY1C2B #的 7和; 1083071f&安培0安培; UID524 #{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}&#34; < / p>

第一个粗体与通过HIDApi找到的数据匹配,第二组粗体,监视器名称和UID列在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY中。在此处,您可以使用监视器名称和UID的组合来查找驱动程序条目。下面是一个示例驱动程序条目:

{4d36e96e-E325-11CE-BFC1-08002BE10318} \的 0010

然后可以使用最后一个粗体数字来匹配从EnumDisplayDevices()返回的DeviceID。以下是DeviceID示例:

&#34; MONITOR \ MSY1C2B \ {4d36e96e-E325-11CE-BFC1-08002BE10318} \的 0010 &#34;

然后,您可以使用此粗体部分匹配从EnumDisplayMonitors()返回的监视器的名称。