我正在寻找一种使用C/C++编程检测Windows8 Slate设备的方法。我对"Slate“的定义是”配备触摸屏但没有专用物理键盘的便携式计算设备“(因此包括带有键盘基座的设备,但不包括笔记本电脑和连接了物理键盘的传统平板电脑)。
我尝试使用WMI Win32_SystemEnclosure并检查ChassisTypes,但一个Slate报告ChassisTypes是“手持”的,另一个报告是“主系统机箱”,所以这似乎不可靠。
发布于 2014-03-16 03:46:56
我不能提供任何代码,因为我没有“石板”设备来测试它,但我可以给你一些建议。
您可能希望使用一种启发式方法,使用几个API调用来确定各种硬件位的存在或状态,然后确定系统是否与您正在寻找的硬件匹配。GetSystemMetrics应用编程接口可能对您最有用;在阅读了一些文档之后,下面是可能对您有帮助的调用。
带SM_CONVERTIBLESLATEMODE的GetSystemMetrics:如果系统处于板岩模式,则返回0,否则返回非零值。不能保证这将意味着系统是一个实际的板岩设备,但它至少可以告诉你设备是否有板岩模式并且正在使用它。
带SM_DIGITIZER的GetSystemMetrics:返回一个位字段值,告诉您系统是支持触摸还是支持画笔。如果GetSystemMetrics(SM_DIGITIZER) & TABLET_CONFIG_NONE的计算结果为true,那么你的设备很可能不是slate。您还可以很好地利用此调用提供给您的其他位标志。
带有SM_MOUSEPRESENT的GetSystemMetrics:告诉您鼠标是否存在。这是一个非常弱的测试,因为文档说虚拟鼠标或有时只是一个鼠标端口就足以设置这个标志,但它仍然值得测试。如果没有鼠标,你的设备有更高的机会成为一块石板。
带有SM_TABLETPC的GetSystemMetrics:类似于SM_DIGITIZER测试,它告诉您Tablet PC输入服务是否已启动。如果该服务未启动,则您的设备可能不是平板电脑。
GetSystemPowerStatus还可以提供一些有用的启发式方法。该接口返回一个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属性上运行计算,因为任何超过特定大小和重量的设备都可能不是便携设备,因此不会是板岩。
发布于 2016-08-30 01:12:18
来自MSDN的触摸检测代码示例
// 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 */}发布于 2014-03-15 21:38:25
当涉及到WinAPI时,我不是一个专家,但是因为没有其他人回答,也许它会对你有一些帮助。在MSDN上,有一个可用于Windows store应用程序的list of functions,它还指定了是否可以在手持设备上使用功能。看起来Windows.Devices.Enumeration包含了你需要的东西-- DeviceInformation class。
你所要做的就是列出所有的设备(页面上有一个代码告诉你如何做),然后在列表中搜索键盘。
请注意:我没有任何Windows8设备,所以我不能真正测试这是否有用。试一试,如果我的评论对你没有帮助,我会删除我的评论。
https://stackoverflow.com/questions/22418074
复制相似问题