Интерфейс DirectInputEffectприменяется для обслуживания устройств с обратной связью. В этой книге он не используется.
Интерфейс DirectInput
Инициализация DirectInputпроисходит в тот момент, когда вы получаете указатель на интерфейс DirectInputфункцией DirectInputCreate(). Затем полученным интерфейсом можно воспользоваться для создания экземпляров интерфейса DirectInputDevice, составления списка доступных устройств и даже для вызова панели управления DirectInput. Интерфейс DirectInputсодержит следующие четыре функции:
• CreateDevice()
• EnumDevice()
• GetDeviceStatus()
• RunControlPanel()
Функция CreateDevice()создает новые экземпляры интерфейса DirectInputDevice. Она получает три аргумента: GUID нужного устройства, адрес инициализируемого указателя на интерфейс и показатель агрегирования (aggregation) COM, который обычно должен быть равен нулю. Для системной мыши и клавиатуры в DirectX предусмотрены стандартные значения GUID:
• GUID_SysKeyboard
• GUID_SysMouse
Значения GUID остальных устройств можно получить функцией EnumDevices().
Функция EnumDevices()обнаруживает устройства ввода, установленные на данном компьютере. Она позволяет составить список устройств по их типу, по факту их текущего подключения к компьютеру и по тому, являются ли они устройствами с обратной связью. Для каждого устройства, обнаруженного функцией EnumDevices(), предоставляются два значения GUID: GUID экземпляра и GUID продукта. GUID экземпляра идентифицирует конкретное устройство, а GUID продукта — его тип. При вызове функции CreateDevice()используется GUID экземпляра.
С помощью функции GetDeviceStatus()можно определить, доступно ли устройство для DirectInput в данный момент. Код возврата DI_OKозначает, что устройство подключено и доступно. Функция RunControlPanel()вызывает приложение DirectInput Control Panel. Точнее, она вызывает приложение DirectX Control Panel и активизирует вкладку DirectInput.
Интерфейс DirectInputDevice
Доступ ко всем устройствам ввода, представленным в DirectInput, осуществляется через интерфейс DirectInputDevice. Интерфейс DirectInputDeviceсодержит следующие функции:
• Acquire()
• Unacquire()
• GetCapabilities()
• GetDeviceData()
• GetDeviceInfo()
• GetDeviceState()
• SetDataFormat()
• SetEventNotification()
• EnumObjects()
• GetObjectInfo()
• GetProperty()
• SetProperty()
• SetCooperativeLevel()
• RunControlPanel()
Не стоит полагать, что для работы с устройствами понадобятся все эти функции. Тем не менее мы кратко рассмотрим каждую из них.
Функции Acquire()и Unacquire()устанавливают и разрывают связь между устройством ввода и DirectInput. Перед тем как получать от устройства данные, необходимо захватить его.
Функция Acquire()используется для начального захвата устройства и для восстановления нарушенной связи с устройством. Обычно связь между устройством ввода и DirectInput разрывается из-за того, что приложение теряет фокус ввода. Функция Unacquire()используется, как правило, для того, чтобы вернуть Windows право доступа к устройству. Например, при работе с меню необходимо уступить объекты DirectInputDevice, представляющие мышь и клавиатуру, чтобы Windows могли нормально обработать выбор команды меню.
Функция GetCapabilities()с помощью структуры DIDEVCAPSописывает возможности устройства, в том числе количество кнопок, количество осей и поддержку обратной связи. Кроме того, в структуру включаются описания конкретных особенностей (или ограничений) устройства, влияющих на его использование. Например, установка флага DIDC_POLLEDDEVICEозначает, что от устройства можно получать лишь непосредственные данные.
Функция GetDeviceData()получает от устройства буферизованные данные. Она позволяет извлечь из буфера один или несколько элементов, а также просмотреть его содержимое (то есть прочитать элементы буфера без их удаления).
Функция GetDeviceInfo()заполняет структуру DIDEVICEINSTANCEинформацией об устройстве. В структуру заносятся значения GUID экземпляра и продукта для данного устройства, а также строки с неформальными описаниями. Ту же самую информацию можно получить функцией EnumDevices()интерфейса DirectInput, так что, строго говоря, эта функция не является обязательной.
Функция GetDeviceState()предназначена для получения непосредственных данных от устройства. Она определяет состояние устройства на момент вызова функции. Например, с ее помощью можно узнать об одновременном нажатии двух клавиш.
Читать дальше