我正在寻找一种使用C / C++以编程方式检测Windows 8 Slate设备的方法。我对“Slate”的定义是“一种配备有触摸屏但没有专用物理键盘的便携式计算设备”(因此包括带有键盘底座的设备,但不包括连接了物理键盘的笔记本电脑和传统平板电脑)。

我尝试使用WMI Win32_SystemEnclosure并检查ChassisType,但是一个Slate报告该ChassisType为“手持”,另一个报告“Main System Chassis”,因此这似乎不可靠。

最佳答案

我无法提供任何代码,因为我没有“平板”设备可以对其进行测试,但是我可以为您提供一些建议。

您可能需要使用一种启发式的方法,即使用多个API调用来确定硬件的各个位的存在或状态,然后确定系统是否与您要查找的内容匹配。 GetSystemMetrics API可能对您最有用;在阅读了一些文档之后,以下电话可能会为您提供帮助。

GetSystemMetricsSM_CONVERTIBLESLATEMODE:如果系统处于“平板模式”,则返回0,否则返回非零。无法保证这将意味着系统是实际的平板设备,但它至少可以告诉您该设备是否具有平板模式并正在使用它。

GetSystemMetricsSM_DIGITIZER:返回一个位域值,该值告诉您系统支持触摸还是笔。如果GetSystemMetrics(SM_DIGITIZER) & TABLET_CONFIG_NONE评估为true,则您的设备可能不是平板。您还可以充分利用此调用允许您访问的其他位标志。

GetSystemMetricsSM_MOUSEPRESENT:告诉您是否存在鼠标。这是一个非常弱的测试,因为文档说虚拟鼠标或有时只是一个鼠标端口就足以设置此标志,但是仍然值得测试。如果没有鼠标,则您的设备更有可能成为平板电脑。

GetSystemMetricsSM_TABLETPC:类似于SM_DIGITIZER测试,它告诉您Tablet PC Input服务是否已启动。如果服务未启动,则您的设备可能不是平板电脑。

GetSystemPowerStatus 也可以提供一些有用的试探法。此API返回 SYSTEM_POWER_STATUS 结构,您可以通过以下方式进行测试:

  • 如果ACLineStatus为0,则说明您的设备未连接到交流电源,因此很可能是平板电脑。
  • 如果BatteryFlag为128,则没有系统电池,因此您的设备可能不是平板。如果它是其他任何值(255(状态未知)除外),则都有电池,这意味着您的设备更容易成为平板。

  • 您还可以查看WMI's Win32_Keyboard,特别是AvailabilityConfigManagerErrorCodeStatus属性。最后,there is no way to determine whether keyboard input is from a physical or virtual keyboard,但是您至少可以尝试测试物理键盘。

    您的WMI Win32_SystemEnclosure测试将成为列表中的另一种启发式方法。查看ChassisTypes返回的内容:DesktopLow Profile DesktopMini TowerTowerLaptop可能意味着该设备不是平板电脑。 Pizza BoxPortableNotebook(尽管通常笔记本电脑==笔记本电脑有常见的用法,所以这需要测试),Hand HeldSpace SavingLunch Box更有可能是平板。您还可以尝试在DepthHeightWidthWeight属性上运行计算,因为任何超过一定大小和重量的东西都可能不是便携式设备,因此也不会成为平板。

    关于c++ - 如何检测Windows 8 Slate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22418074/

    10-10 22:42