c++ - 如何检测 Windows 8 Slate

标签 c++ c winapi windows-8 tablet

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

我尝试使用 WMI Win32_SystemEnclosure 并检查 ChassisTypes,但一个 Slate 报告 ChassisTypes 为“手持”,另一个报告为“主系统机箱”,因此这似乎不可靠。

最佳答案

我无法提供任何代码,因为我没有“slate”设备来测试它,但我可以为您提供一些建议。

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

GetSystemMetrics with SM_CONVERTIBLESLATEMODE:如果系统处于 Slate 模式,则返回 0,否则返回非零。不能保证这意味着系统是真正的平板设备,但它至少可以告诉您该设备是否具有平板模式并且正在使用它。

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

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

GetSystemMetricsSM_TABLETPC:与 SM_DIGITIZER 测试类似,这会告诉您 Tablet PC 输入服务是否已启动。如果该服务未启动,则您的设备可能不是平板电脑。

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 返回的内容:台式机低调台式机迷你塔式塔式Laptop 可能意味着该设备不是平板电脑。 披萨盒可移植笔记本(尽管一般用语中笔记本==笔记本电脑,因此这需要测试)、手持式节省空间午餐盒可能更可能是石板。您还可以尝试对 DepthHeightWidthWeight 属性进行计算,因为任何超过某些尺寸和重量可能不会是可移植设备,因此不会是平板电脑。

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

相关文章:

c - 错误 C2065 : 'Test_Proc' : undeclared identifier which 'Test_Proc' already exists

c++ - 如何在 QtQuick 2 中对 QML TableView 进行排序?

c++ - 是否有 GCC __PRETTY_FUNCTION__ 等同于它所提供的文字参数?

c++ - 如何使用指针访问 char * 中的字符

c - C 函数参数前的下划线

c - 如何在 Linux 上用 C 递归列出目录?

c++ - DirectX 11.2 错误 : X3501: 'main' entry point not found

c - 指向结构体、字段的指针莫名其妙地改变值

c# - 如何通过名称关闭窗口?

c++ - 用于修改网络接口(interface)属性的 Win32 API