我正在寻找一种使用C / C++以编程方式检测Windows 8 Slate设备的方法。我对“Slate”的定义是“一种配备有触摸屏但没有专用物理键盘的便携式计算设备”(因此包括带有键盘底座的设备,但不包括连接了物理键盘的笔记本电脑和传统平板电脑)。
我尝试使用WMI Win32_SystemEnclosure并检查ChassisType,但是一个Slate报告该ChassisType为“手持”,另一个报告“Main System Chassis”,因此这似乎不可靠。
最佳答案
我无法提供任何代码,因为我没有“平板”设备可以对其进行测试,但是我可以为您提供一些建议。
您可能需要使用一种启发式的方法,即使用多个API调用来确定硬件的各个位的存在或状态,然后确定系统是否与您要查找的内容匹配。 GetSystemMetrics API可能对您最有用;在阅读了一些文档之后,以下电话可能会为您提供帮助。
带GetSystemMetrics
的SM_CONVERTIBLESLATEMODE
:如果系统处于“平板模式”,则返回0,否则返回非零。无法保证这将意味着系统是实际的平板设备,但它至少可以告诉您该设备是否具有平板模式并正在使用它。
带GetSystemMetrics
的SM_DIGITIZER
:返回一个位域值,该值告诉您系统支持触摸还是笔。如果GetSystemMetrics(SM_DIGITIZER) & TABLET_CONFIG_NONE
评估为true,则您的设备可能不是平板。您还可以充分利用此调用允许您访问的其他位标志。
带GetSystemMetrics
的SM_MOUSEPRESENT
:告诉您是否存在鼠标。这是一个非常弱的测试,因为文档说虚拟鼠标或有时只是一个鼠标端口就足以设置此标志,但是仍然值得测试。如果没有鼠标,则您的设备更有可能成为平板电脑。
带GetSystemMetrics
的SM_TABLETPC
:类似于SM_DIGITIZER
测试,它告诉您Tablet PC Input服务是否已启动。如果服务未启动,则您的设备可能不是平板电脑。
GetSystemPowerStatus
也可以提供一些有用的试探法。此API返回 SYSTEM_POWER_STATUS
结构,您可以通过以下方式进行测试:
ACLineStatus
为0,则说明您的设备未连接到交流电源,因此很可能是平板电脑。 BatteryFlag
为128,则没有系统电池,因此您的设备可能不是平板。如果它是其他任何值(255(状态未知)除外),则都有电池,这意味着您的设备更容易成为平板。 您还可以查看WMI's Win32_Keyboard,特别是
Availability
,ConfigManagerErrorCode
和Status
属性。最后,there is no way to determine whether keyboard input is from a physical or virtual keyboard,但是您至少可以尝试测试物理键盘。您的WMI Win32_SystemEnclosure测试将成为列表中的另一种启发式方法。查看
ChassisTypes
返回的内容:Desktop
,Low Profile Desktop
,Mini Tower
,Tower
和Laptop
可能意味着该设备不是平板电脑。 Pizza Box
,Portable
,Notebook
(尽管通常笔记本电脑==笔记本电脑有常见的用法,所以这需要测试),Hand Held
,Space Saving
和Lunch Box
更有可能是平板。您还可以尝试在Depth
,Height
,Width
和Weight
属性上运行计算,因为任何超过一定大小和重量的东西都可能不是便携式设备,因此也不会成为平板。关于c++ - 如何检测Windows 8 Slate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22418074/