Обзор необработанных входных данных
Существует множество устройств ввода пользователей рядом с традиционной клавиатурой и мышью. Например, входные данные пользователя могут поступать из джойстика, сенсорного экрана, микрофона или других устройств, которые обеспечивают большую гибкость ввода пользователем. Эти устройства называются устройствами с человеческим интерфейсом (HID). API необработанных входных данных обеспечивает стабильный и надежный способ для приложений принимать необработанные входные данные из любого HID, включая клавиатуру и мышь.
В этом разделе рассматриваются следующие разделы:
- Модель необработанного ввода
- Регистрация необработанных данных ввода
- чтение необработанных входных данных
Необработанные входные модели
Ранее клавиатура и мышь обычно создают входные данные. Система интерпретировала данные, поступающие с этих устройств, таким образом, чтобы устранить характерные для каждого устройства детали из исходной информации. Например, клавиатура создает код сканирования для конкретного устройства, но система предоставляет приложение с кодом виртуального ключа. Помимо скрытия сведений о необработанных входных данных, диспетчер окон не поддерживал все новые HID. Чтобы получить входные данные из неподдерживаемых HID, приложению пришлось выполнить много действий: открыть устройство, управлять общим режимом, периодически читать устройство или настраивать порт завершения ввода-вывода и т. д. Необработанная модель ввода и связанные API были разработаны, чтобы обеспечить простой доступ к необработанным входным данным со всех устройств ввода, включая клавиатуру и мышь.
Необработанные входные модели отличаются от исходной модели ввода Windows для клавиатуры и мыши. В исходной модели ввода приложение получает независимые от устройства входные данные в виде сообщений, отправляемых или размещенных в его окнах, таких как WM_CHAR, WM_MOUSEMOVEи WM_APPCOMMAND. В отличие от этого, для необработанных входных данных приложение должно зарегистрировать устройства, из которые он хочет получить данные. Кроме того, приложение получает необработанные входные данные через сообщение WM_INPUT.
Существует несколько преимуществ для необработанной входной модели:
- Приложению не нужно обнаруживать или открывать устройство ввода.
- Приложение получает данные непосредственно с устройства и обрабатывает данные для своих потребностей.
- Приложение может различать источник входных данных, даже если он отличается от того же типа устройства. Два мышиных устройства.
- Приложение управляет трафиком данных путем указания данных из коллекции устройств или только определенных типов устройств.
- Устройства HID можно использовать по мере их появления на рынке, не ожидая новых типов сообщений или обновленной версии ОС для получения новых команд в 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.