以编程方式区分物理或虚拟键盘

时间:2018-10-01 15:15:23

标签: c++ windows winapi device virtual

我正在编写Windows C ++库,我需要找到一种方法来检测连接的键盘设备是物理的还是虚拟的。

我尝试使用KeyboardPresent类的Windows::Devices::Input::KeyboardCapabilities成员,但是即使没有物理键盘也返回true。

我也尝试过使用Windows::Devices::Enumeration::DeviceInformation类,但是从它返回的信息,直到获得它的全部为止,似乎都不包含有关设备性质的信息。也许是这样,我错过了吗?

这两种方法均已在Surface 4 Pro上进行了测试。

1 个答案:

答案 0 :(得分:1)

任何Windows API均未提供此信息,因为Windows本身不知道哪些设备是虚拟的还是物理的。

设备由驱动程序控制,驱动程序是在操作系统中以非常低的级别以提升的权限运行的软件。具体来说,驱动程序对Windows隐藏了硬件的详细信息,包括物理的还是虚拟的。

我能想到的唯一方法:

  • 编译已知虚拟键盘名称/硬件ID的列表,并以此识别键盘。

  • 编译已知虚拟设备驱动程序列表,并标识用于特定键盘的驱动程序。

  • 自己编写一个驱动程序,该驱动程序挂接到其他驱动程序的代码中,并使用硬件检查它们的I / O行为。如果它向操作系统发送的输入与真实的硬件输入不对应,则可能是虚拟设备驱动程序。当然,这种方法非常危险。

  • 上述各项的组合。