我正在编写Windows C ++库,我需要找到一种方法来检测连接的键盘设备是物理的还是虚拟的。
我尝试使用KeyboardPresent
类的Windows::Devices::Input::KeyboardCapabilities
成员,但是即使没有物理键盘也返回true。
我也尝试过使用Windows::Devices::Enumeration::DeviceInformation
类,但是从它返回的信息,直到获得它的全部为止,似乎都不包含有关设备性质的信息。也许是这样,我错过了吗?
这两种方法均已在Surface 4 Pro上进行了测试。
答案 0 :(得分:1)
任何Windows API均未提供此信息,因为Windows本身不知道哪些设备是虚拟的还是物理的。
设备由驱动程序控制,驱动程序是在操作系统中以非常低的级别以提升的权限运行的软件。具体来说,驱动程序对Windows隐藏了硬件的详细信息,包括物理的还是虚拟的。
我能想到的唯一方法:
编译已知虚拟键盘名称/硬件ID的列表,并以此识别键盘。
编译已知虚拟设备驱动程序列表,并标识用于特定键盘的驱动程序。
自己编写一个驱动程序,该驱动程序挂接到其他驱动程序的代码中,并使用硬件检查它们的I / O行为。如果它向操作系统发送的输入与真实的硬件输入不对应,则可能是虚拟设备驱动程序。当然,这种方法非常危险。
上述各项的组合。