Я ищу метод для программного обнаружения устройств Windows 8 Slate с использованием C / C ++. Мое определение «Slate» — это «портативное вычислительное устройство, оснащенное сенсорным экраном, но без выделенной физической клавиатуры» (включая устройства, оснащенные док-станцией для клавиатуры, но исключая ноутбуки и традиционные планшеты, к которым подключена физическая клавиатура).
Я пытался использовать WMI Win32_SystemEnclosure и проверять ChassisTypes, но один Slate сообщил, что ChassisTypes является «ручным», а другой — «Main System Chassis», так что это не выглядит надежным.
Я не могу предоставить какой-либо код, так как у меня нет «планшетного» устройства для его тестирования, но я могу предложить вам несколько советов.
Возможно, вы захотите использовать эвристический подход, использующий несколько вызовов API для определения наличия или состояния различных битов оборудования, а затем определить, соответствует ли система тому, что вы ищете. GetSystemMetrics API, вероятно, будет самым полезным для вас; после просмотра некоторой документации, вот звонки, которые могут вам помочь.
GetSystemMetrics
с SM_CONVERTIBLESLATEMODE
: возвращает 0, если система находится в режиме Slate Mode, и ненулевое значение в противном случае. Там нет никакой гарантии, что это будет означать, что система является фактическим сланцевым устройством, но он может по крайней мере сказать вам, если устройство имеет сланец Режим и использует это.
GetSystemMetrics
с SM_DIGITIZER
: возвращает значение битового поля, указывающее, поддерживает ли система касание или перо. Если GetSystemMetrics(SM_DIGITIZER) & TABLET_CONFIG_NONE
оценивается как правда, ваше устройство, вероятно, не шифер. Вы также можете эффективно использовать другие битовые флаги, к которым этот вызов дает вам доступ.
GetSystemMetrics
с SM_MOUSEPRESENT
: сообщает, присутствует ли мышь. Это очень слабый тест, так как в документах говорится, что виртуальные мыши или иногда просто мыши порт будет достаточно, чтобы установить этот флаг, но это все еще стоит проверить. Если мышь отсутствует, у вашего устройства больше шансов стать планшетом.
GetSystemMetrics
с SM_TABLETPC
: похоже на SM_DIGITIZER
test, это говорит вам, запущена ли служба ввода Tablet PC или нет. Если служба не запущена, возможно, ваше устройство не является планшетом.
GetSystemPowerStatus
может также предоставить несколько полезных эвристик. Этот API возвращает SYSTEM_POWER_STATUS
структура, которую вы можете проверить следующими способами:
ACLineStatus
0, ваше устройство не подключено к сети переменного тока, так что скорее всего оно будет шиферным.BatteryFlag
128, нет системного аккумулятора, поэтому ваше устройство, вероятно, не планшет. Если это какое-либо другое значение (кроме 255, которое является неизвестным состоянием), есть батарея, что означает, что ваше устройство, скорее всего, будет планшетным ПК.Вы также можете посмотреть в Win32_Keyboard WMI, в частности его Availability
, ConfigManagerErrorCode
, а также Status
свойства. В конце дня нет способа определить, является ли ввод с клавиатуры физической или виртуальной клавиатуры, но вы можете по крайней мере попытаться проверить физическую клавиатуру.
Ваш 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
свойства, поскольку что-либо более определенного размера и веса, вероятно, не будет портативным устройством и, следовательно, не будет планшетом.
Пример кода обнаружения касания от 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 */}
Я не специалист, когда дело доходит до WinAPI, но, поскольку никто не ответил, может быть, это поможет вам. На MSDN есть список функций Доступно для приложений магазина Windows, в которых также указывается, могут ли функции использоваться на портативных устройствах. Похоже на Windows.Devices.Enumeration
содержит именно то, что вам нужно — DeviceInformation
учебный класс.
Все, что вам нужно сделать, это перечислить все устройства (есть код на странице, который говорит, как это сделать), и найти в списке клавиатуру.
Обратите внимание: у меня нет устройства с Windows 8, поэтому я не могу проверить, полезно это или нет. Попробуйте, и я удалю свой комментарий, если он вам не поможет.