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

Programmatically differentiating between physical or virtual keyboards

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

我曾尝试使用 Windows::Devices::Input::KeyboardCapabilities class 的 KeyboardPresent 成员,但 returns 即使在没有物理键盘的情况下也是如此。

我也尝试过使用 Windows::Devices::Enumeration::DeviceInformation class,但是从它返回的信息,虽然很详尽,但似乎不包含有关设备性质的信息。也许确实如此,但我错过了?

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

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

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

我能想到的唯一方法:

  • 编译已知虚拟键盘列表 names/hardware id 并用它识别键盘。

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

  • 自己编写一个驱动程序,挂钩到其他驱动程序的代码中,并用硬件检查它们的 I/O 行为。如果它向 OS 发送与实际硬件输入不对应的输入,则您可能有一个虚拟设备驱动程序。这种方法当然是超级冒险​​的。

  • 以上的组合。