Открыть сервис

Raw Input

Raw Input — это механизм операционной системы Microsoft Windows для прямого доступа к данным с устройств ввода (клавиатура, мышь, джойстик, сенсорная панель и другие HID-совместимые устройства) без промежуточной обработки и фильтрации стандартными очередями сообщений (Windows message queue). В отличие от традиционных методов работы с вводом через сообщения WM_KEYDOWN, WM_MOUSEMOVE или WM_INPUT, Raw Input позволяет приложению получать необработанные данные непосредственно от драйвера устройства, что обеспечивает более низкую задержку, точность и возможность обработки данных, недоступных в обычном потоке.

История

Механизм Raw Input был впервые представлен в операционной системе Microsoft Windows XP с выходом Service Pack 1 (2002 год) и стал частью DirectInput API в составе DirectX 8.1. До появления Raw Input разработчики игр и специализированных приложений (например, симуляторов, профессиональных графических редакторов) сталкивались с ограничениями стандартной модели ввода: сообщения мыши и клавиатуры подвергались фильтрации (например, сглаживание движения мыши через параметр ускорения, заданный в настройках системы), а доступ к данным с джойстиков и других HID-устройств требовал использования DirectInput или API коммуникационных портов (COM-порт, LPT).

С выходом Windows Vista (2006) и Windows 7 (2009) поддержка Raw Input была расширена: появилась возможность регистрации устройств с различной топологией (например, нескольких мышей или клавиатур одновременно), а улучшенная документация MSDN и примеры кода на C++ упростили внедрение. Начиная с Windows 8 (2012) механизм стал основным способом работы с вводом для приложений, требующих высокой отзывчивости (в первую очередь — видеоигр). В Windows 10 и 11 Raw Input остаётся обратно совместимым с более ранними версиями и поддерживается для всех HID-классов.

Принцип работы

Отличие от стандартного ввода

Стандартный ввод в Windows работает через оконную очередь сообщений: каждое нажатие клавиши или движение мыши генерирует сообщение (например, WM_KEYDOWN), которое помещается в очередь потока, создавшего окно. При этом Windows может модифицировать данные: округлять координаты мыши, накладывать системное ускорение, удалять повторяющиеся нажатия (ключевой режим повтора) или преобразовывать скан-коды в виртуальные ключи с учётом раскладки. Эти модификации могут приводить к потере информации и дополнительной задержке.

Raw Input регистрирует устройство напрямую через API. Приложение получает данные в виде сырого пакета (структура RAWINPUT) через сообщение WM_INPUT. Обработка пакета происходит в произвольном порядке, вне очереди оконных сообщений, что снижает задержку до минимально возможной. При этом данные не фильтруются: приложение получает, например, абсолютное положение курсора или сырой скан-код клавиши (без раскладки).

Основные функции API

Windows предоставляет следующие функции для работы с Raw Input:

Структура RAWINPUT

Структура RAINPUT содержит заголовок (RAWINPUTHEADER) с идентификатором устройства, типом (мышь, клавиатура или HID) и полем размера пакета. Далее следуют структуры в зависимости от типа:

Классификация

По типу устройств

По способу регистрации

Применение

Видеоигры

Raw Input является стандартом де-факто для современных игр, особенно шутеров от первого лица (например, Counter-Strike: Global Offensive, Quake Champions, Overwatch). Отсутствие системного ускорения мыши обеспечивает предсказуемость и точность, что критично для соревновательной игры. Многие игровые движки (Unreal Engine, Unity, id Tech) имеют встроенную поддержку Raw Input.

Симуляторы и профессиональные приложения

Специализированные системы

Ограничения и недостатки

Пример использования

На практике разработчик игры на C++ обычно выполняет следующие шаги:

  1. Ввод структуры RAWINPUTDEVICE и вызов RegisterRawInputDevices с указанием типа устройства (например, RIM_TYPEMOUSE).
  2. В оконной процедуре (WndProc) обработка сообщения WM_INPUT.
  3. Вызов GetRawInputData для получения данных в структуру RAINPUT.
  4. Для мыши: чтение lLastX и lLastY как сырое перемещение (разница позиций между кадрами). Для клавиатуры: чтение MakeCode и определение нажатия/отпускания.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →