Общие сведения о необработанных входных данных
Помимо традиционной клавиатуры и мыши существует множество устройств ввода данных пользователем. Например, ввод данных пользователем может поступать с джойстика, сенсорного экрана, микрофона или других устройств, которые обеспечивают большую гибкость ввода данных пользователем. Эти устройства в совокупности называются устройствами интерфейса человека (HID). API необработанных входных данных обеспечивает стабильный и надежный способ, с помощью которых приложения могут принимать необработанные входные данные из любого HID, включая клавиатуру и мышь.
В этом разделе описываются следующие темы:
- Необработанная модель входных данных
- Регистрация для необработанных входных данных
- Чтение необработанных входных данных
Необработанная модель входных данных
Ранее клавиатура и мышь обычно формировали входные данные. Система интерпретировала данные, поступающие с этих устройств, таким образом, чтобы исключить сведения о необработанных данных, относящиеся к конкретному устройству. Например, клавиатура создает код сканирования для конкретного устройства, но система предоставляет приложению код виртуального ключа. Помимо скрытия сведений о необработанных входных данных, диспетчер окон не поддерживал все новые идентификаторы HID. Чтобы получить входные данные из неподдерживаемых HID, приложению приходилось выполнять множество действий: открывать устройство, управлять общим режимом, периодически считывать устройство или настраивать порт завершения ввода-вывода и т. д. Модель необработанного ввода и связанные API были разработаны для обеспечения простого доступа к необработанным входным данным со всех устройств ввода, включая клавиатуру и мышь.
Необработанная модель ввода отличается от исходной модели ввода Windows для клавиатуры и мыши. В исходной модели ввода приложение получает независимые от устройства входные данные в виде сообщений, которые отправляются или публикуются в его окнах, таких как WM_CHAR, WM_MOUSEMOVE и WM_APPCOMMAND. В отличие от этого, для необработанных входных данных приложение должно регистрировать устройства, с которые оно хочет получить данные. Кроме того, приложение получает необработанные входные данные через сообщение WM_INPUT .
Модель необработанных входных данных имеет ряд преимуществ.
- Приложению не нужно обнаруживать или открывать устройство ввода.
- Приложение получает данные непосредственно с устройства и обрабатывает их в соответствии с потребностями.
- Приложение может различать источник входных данных, даже если он относится к тому же типу устройства. Например, два устройства мыши.
- Приложение управляет трафиком данных, указывая данные из коллекции устройств или только определенных типов устройств.
- Устройства HID можно использовать по мере их появления в Marketplace, не дожидаясь новых типов сообщений или обновленной ОС, чтобы в WM_APPCOMMAND появились новые команды.
Обратите внимание, что WM_APPCOMMAND предоставляет некоторые устройства HID. Однако WM_APPCOMMAND является событием ввода более высокого уровня, независимым от устройства, в то время как WM_INPUT отправляет необработанные низкоуровневые данные, относящиеся к конкретному устройству.
Регистрация для необработанных входных данных
По умолчанию приложение не получает необработанные входные данные. Чтобы получить необработанные входные данные от устройства, приложение должно зарегистрировать устройство.
Чтобы зарегистрировать устройства, приложение сначала создает массив структур RAWINPUTDEVICE , определяющих коллекцию верхнего уровня (TLC) для нужных устройств. TLC определяется страницей использования (класс устройства) и идентификатором использования (устройство в классе ). Например, чтобы получить TLC клавиатуры, задайте UsagePage = 0x01 и UsageID = 0x06. Приложение вызывает RegisterRawInputDevices для регистрации устройств.
Обратите внимание, что приложение может зарегистрировать устройство, которое в настоящее время не подключено к системе. При подключении этого устройства диспетчер Windows автоматически отправляет необработанные входные данные в приложение. Чтобы получить список необработанных устройств ввода в системе, приложение вызывает GetRawInputDeviceList. Используя hDevice из этого вызова, приложение вызывает GetRawInputDeviceInfo для получения сведений об устройстве.
С помощью элемента dwFlagsв RAWINPUTDEVICE приложение может выбрать устройства для прослушивания, а также устройства, которые оно хочет игнорировать. Например, приложение может запрашивать входные данные от всех телефонных устройств, за исключением автоответов. Пример кода см. в разделе Регистрация для необработанных входных данных.
Обратите внимание, что мышь и клавиатура также являются HID, поэтому данные из них могут поступать как через сообщения HID WM_INPUT так и из традиционных сообщений. Приложение может выбрать любой из методов с помощью правильного выбора флагов в RAWINPUTDEVICE.
Чтобы получить состояние регистрации приложения, в любое время вызовите Метод GetRegisteredRawInputDevices .
Чтение необработанных входных данных
Приложение получает необработанные входные данные от любого HID, чья коллекция верхнего уровня (TLC) соответствует TLC из регистрации. Когда приложение получает необработанные входные данные, его очередь сообщений получает WM_INPUT сообщение и установлен флаг состояния очереди , QS_RAWINPUT (QS_INPUT также включает этот флаг). Приложение может получать данные, когда оно находится на переднем плане и в фоновом режиме.
Существует два способа чтения необработанных данных: небуферизованный (или стандартный) метод и буферизованный метод. Небуферизованный метод получает необработанные данные по одной структуре RAWINPUT за раз и достаточно для многих HID. Здесь приложение вызывает GetMessage , чтобы получить сообщение WM_INPUT . Затем приложение вызывает GetRawInputData , используя дескриптор RAWINPUT , содержащийся в WM_INPUT. Пример см. в разделе Выполнение стандартного чтения необработанных входных данных.
Буферный метод, напротив, получает массив структур RAWINPUT за раз. Это предусмотрено для устройств, которые могут производить большие объемы необработанных входных данных. В этом методе приложение вызывает GetRawInputBuffer , чтобы получить массив структур RAWINPUT . Обратите внимание, что макрос NEXTRAWINPUTBLOCK используется для обхода массива структур RAWINPUT . Пример см. в разделе Выполнение буферизованного чтения необработанных входных данных.
Для интерпретации необработанных входных данных требуются подробные сведения о HID. Приложение получает сведения об устройстве, вызывая Метод GetRawInputDeviceInfo с дескриптором устройства. Этот дескриптор может поступать либо из WM_INPUT , либо из элемента hDeviceобъекта RAWINPUTHEADER.