Новости | Конференция | Чат | База данных | Творчество | Сообщество | О сайте | English | Помощь сайту |
УСТРОЙСТВА УПРАВЛЕНИЯ ЧАСТЬ ЧЕТВЕРТАЯ УСТРОЙСТВО ЕСТЬ, А ЧТО У НЕГО ВНУТРИ? Итак, прошлый раз мы говорили о том как узнать, какие устройства управления есть в системе. Сегодня мы поговорил о том как узнать, что у нас содержится в том или ином устройстве. Для начала нам надо создать устройстве на основе его GUID'a. Кто не помнит, что такое GUID и как его узнать рекомендую прочитать ещё раз третью статью. Устройство создаётся при помощи функции CreateDevice класса DirectInput. Функция на вход получает строковую переменную, содержащую GUID устройства, на и отдаёт экземпляр класса DirectInputDevice8. (Важно помнить, что все созданные классы следует обязательно удалять, иначе дальнейшая работа с системой может быть затруднена) Дальше у нас есть два варианта. Первый -- получаем количество кнопок, осей и «хаток». Всё бы хорошо, но есть одно но, оси в джойстике не обязательно идут по порядку некоторых может просто не быть. Второй -- получаем название только тех осей, которые реально есть в наличии(хотя тоже есть подвох со слайдерам, но о нём позже). Начнём с первого. Для получения информации о устройстве на нужно создать его класс. Например так: Set DID = DInput8.CreateDevice(“GUID_SysMouse”) ’Забыл сказать раньше, что у мыши и клавиатуры фиксированные GUID’ы, у мыши это GUID_SysMouse, у клавиатуры GUID_SysKeyboard. Когда устройство создано, можно получить информацию о нём при помощи процедуры GetCapabilities, в которую надо передать структуру DIDEVCAPS. DID.GetCapabilities DEVCaps ‘DEVCaps переменная стрктуры DIDEVCAPS Структура DIDEVCAPS содержит следующие, параметры: lAxes -- количество осей. lButtons -- количество кнопок lDevType -- тип устройства типы описаны константами CONST_DI8DEVICESUBTYPE(их очень много, поэтому расшифровывать не буду, кому интересно думаю сам найдёт) lDriverVersion -- версия драйвера lFFMinTimeResolution -- минимальное время отклика Force Feedback эффекта, в миллисекундах. lFFSamplePeriod -- минимальное время, между следованием Force Feedback командами. lFirmwareRevision -- Версия прошивки. lFlags -- флаги из группы констант CONST_DIDEVCAPSFLAGS почти все относятся к Force Feedback, поэтому пока не рассматривать небудем. lHardwareRevision -- Версия железа устройства(не пойму на кой оно надо но есть) lPOVs -- количество «хаток» Второй способ сложней но в отличии от первого способа мы сможем узнать не просто, в каком количестве у нас присутствуют оси, «хатки», кнопки но и узнаем за что они отвечают. Заключается он в вызове функции GetDeviceObjectsEnum входными параметрами которой являются константы CONST_DIDFTFLAGS возвращаемый результат будет класс DirectInputEnumDeviceObjects, в котором содержатся объекты класса DirectInputDeviceObjectInstance, которые и содержат нужную нам информацию. Набор констант CONST_DIDFTFLAGS довольно большой но нам из него нужны только: DIDFT_AXIS -- оси DIDFT_BUTTON -- кнопки DIDFT_POV -- «хатки» Константы можно объединять в получая на выходе только то что надо. Set DEVObj = DID.GetDeviceObjectsEnum(DIDFT_AXIS Or DIDFT_BUTTON Or DIDFT_POV) ’ Получить информацию о Осях, кнопках и «хатках» Объект DirectInputEnumDeviceObjects содержит две функции GetCount и GetItem первая возвращает количество объектов DirectInputDeviceObjectInstance, вторая позволяет получить объект DirectInputDeviceObjectInstance по его индексу. И в тоге всех операций мы получим объект DirectInputDeviceObjectInstance который содержит нужную нам информацию, а именно(Опишу только те назначение которых понимаю): GetFlags -- Возвращает специфичные флаги объекта из набора констант CONST_DIDEVICEOBJINSTANCEFLAGS. GetGuidType -- Тип GUID объекта по ним можно установить, что это за объект(описание ниже) GetName -- Имя объекта, которое задано драйвером GetOfs -- Смещение в структуре, относительного которого хранится нужное значение(вероятно на С++ удобно использовать) Набор констант CONST_DIDEVICEOBJINSTANCEFLAGS содержит: DIDOI_ASPECTACCEL -- объект возвращает информацию о ускорении DIDOI_ASPECTFORCE -- объект возвращает информацию о силовом воздействии DIDOI_ASPECTMASK -- используется для предоставление аспектов информации показывает, что устройство может возвращать несколько аспектов DIDOI_ASPECTPOSITION -- объект возвращает информацию о позиции DIDOI_ASPECTVELOCITY -- объект возвращает информацию о направление DIDOI_FFACTUATOR -- объект может иметь эффект Force Feedback примененный на нём. DIDOI_FFEFFECTTRIGGER -- объект может переключать работающий Force Feedback эффект. DIDOI_GUIDISUSAGE -- содержит информацию связанную с HID DIDOI_POLLED -- если установлен то устройство нуждается в вызове метода Poll для получения данных. Что такое GUID объекта -- это строковая информации, которая содержит, что это за объект, расшифровывать их не буду так как они так дольно понятны, но перечислить перечислю: GUID_XAxis, GUID_YAxis, GUID_ZAxis, GUID_RxAxis, GUID_RyAxis, GUID_RzAxis, GUID_Slider, GUID_Button, GUID_Key, GUID_POV, GUID_Unknown.(Стоит заметить что GUID_Key это кнопка клавиатуры, а GUID_Button это уже кнопка мыши или джойстика). Чтобы было более понятно я написал небольшой пример который наглядно покажет как всё что я описал работает Вот мы и осилили самую нудную, но и очень важную часть DirectInput в следующей части мы наконец получим первые данные от наших устройств. Надеюсь я вас не сильно утомил, хотя и сомневаюсь в этом :), статья выдалась очень скучной. P.S. Если что непонятно спрашивайте в конференции, с радостью отвечу на все вопросы. P.S.S. На флейм и оффтопик не отвечаю :) Пример к статье: http://www.elite-games.ru/downloads/art/program/devcaps.rar
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Дизайн Elite Games V5 beta.18 EGM Elite Games Manager v5.17 02.05.2010 |