我正在开发一个工具,显示我们在工作中使用的系统上各种硬件组件的状态。目前,我们有16个触摸屏显示器(全部由3M)插入Windows 10盒。我需要验证任何给定的监视器是否具有Windows识别的关联触摸屏。这是为了评估系统是否存在任何硬件故障,即电缆损坏,USB端口坏,显示器坏等等。我们认为这比我们想要承认的更多,通常显示器的显示器工作正常但是USB任何一端的控制器都会掉出来,需要通过拔出/插回来重置
不幸的是,由于工作限制,我的代码发布会受到限制。
我可以通过winapi的EnumDisplayDevices和EnumerateDisplayMonitors枚举插入系统的所有监视器。我可以使用HIDApi构建所有HID触摸屏设备的列表。
从这里开始,我没有指示将这两件事联系在一起的地方,如果有可能的话。我首先想到的是HID设备信息应该有一些由调用EnumDisplayDevices和EnumerateDisplayMonitors的结果共享的标识符,但我没有发现这种情况。另一种可能性是将监视器的坐标/大小与其中一个触摸控制器负责的区域进行比较。再次,不确定这是否可能。
简而言之,有没有办法通过c ++将Touch设备与相应的显示器相关联?
答案 0 :(得分:3)
我认为您很幸运,此驱动程序后缀与您的显示器配置相匹配。在我的Windows 10多显示器设置中,当我在您所描述的驱动程序条目中使用此编号查找它时,显示错误。
将HID设备与显示器关联的可靠方法似乎是:
GetRawInputDeviceList()
以获取HID设备GetRawInputDeviceInfo()
致电RIDI_DEVICEINFO
以确定Usage
和UsagePage
GetRawInputDeviceInfo()
致电RIDI_DEVICENAME
以获取\\\\?\\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
,直到函数返回零。EnumDisplayDevices()
和lpDevice
EDD_GET_DEVICE_INTERFACE_NAME
调用dwFlags
,并观察它在DeviceID
中返回\\\\?\\DISPLAY#ELO2243#5&607b301&0&UID24833#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
表格DeviceName
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());
}
}
答案 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()返回的监视器的名称。