首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测Windows 8 Slate

如何检测Windows 8 Slate
EN

Stack Overflow用户
提问于 2014-03-15 08:34:34
回答 3查看 1.3K关注 0票数 2

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

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

EN

回答 3

Stack Overflow用户

发布于 2014-03-16 03:46:56

我不能提供任何代码,因为我没有“石板”设备来测试它,但我可以给你一些建议。

您可能希望使用一种启发式方法,使用几个API调用来确定各种硬件位的存在或状态,然后确定系统是否与您正在寻找的硬件匹配。GetSystemMetrics应用编程接口可能对您最有用;在阅读了一些文档之后,下面是可能对您有帮助的调用。

SM_CONVERTIBLESLATEMODEGetSystemMetrics:如果系统处于板岩模式,则返回0,否则返回非零值。不能保证这将意味着系统是一个实际的板岩设备,但它至少可以告诉你设备是否有板岩模式并且正在使用它。

SM_DIGITIZERGetSystemMetrics:返回一个位字段值,告诉您系统是支持触摸还是支持画笔。如果GetSystemMetrics(SM_DIGITIZER) & TABLET_CONFIG_NONE的计算结果为true,那么你的设备很可能不是slate。您还可以很好地利用此调用提供给您的其他位标志。

带有SM_MOUSEPRESENTGetSystemMetrics:告诉您鼠标是否存在。这是一个非常弱的测试,因为文档说虚拟鼠标或有时只是一个鼠标端口就足以设置这个标志,但它仍然值得测试。如果没有鼠标,你的设备有更高的机会成为一块石板。

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

GetSystemPowerStatus还可以提供一些有用的启发式方法。该接口返回一个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属性上运行计算,因为任何超过特定大小和重量的设备都可能不是便携设备,因此不会是板岩。

票数 4
EN

Stack Overflow用户

发布于 2016-08-30 01:12:18

来自MSDN的触摸检测代码示例

代码语言:javascript
复制
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value  & NID_MULTI_INPUT){
    /* digitizer is multitouch */ 
    MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}
票数 0
EN

Stack Overflow用户

发布于 2014-03-15 21:38:25

当涉及到WinAPI时,我不是一个专家,但是因为没有其他人回答,也许它会对你有一些帮助。在MSDN上,有一个可用于Windows store应用程序的list of functions,它还指定了是否可以在手持设备上使用功能。看起来Windows.Devices.Enumeration包含了你需要的东西-- DeviceInformation class

你所要做的就是列出所有的设备(页面上有一个代码告诉你如何做),然后在列表中搜索键盘。

请注意:我没有任何Windows8设备,所以我不能真正测试这是否有用。试一试,如果我的评论对你没有帮助,我会删除我的评论。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22418074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档