|
|
От: |
Pavel_Agurov
|
|
| Дата: | 20.06.09 15:01 | ||
| Оценка: | |||
DirectInput — это набор API, обеспечивающий аппаратнонезависимый ввод данных в систему в режиме реального времени. События, обрабатываемые DirectInput, формируются клавиатурой, мышкой и джойстиком. Кроме того, DirectInout работает с устройствами HID класса и именно эту функциональность мы будем рассматривать. Примеры этого раздела мы будем реализовывать на языке C#.
Для использования функций DirectInput на платформе .NET требуется подключение библиотеки Microsoft.DirectX.DirectInput.dll, которое производится добавлением этой DLL в ссылки (reference) проекта. Сам DLL файл можно найти в системном каталоге WINXP\assembly\GAC\Microsoft.DirectX.DirectInput.
Объекты DirectInput расположены в пространстве имен Microsoft.DirectX.DirectInput (мы приводим самые интересные классы):
Device — класс устройства;
DeviceList — коллекция устройств;
DeviceProperties — описание свойств устройства;
Manager — основной класс для доступа к устройствам;
SystenGuid — содержит Guid константы мыши и клавиатуры;
DeviceInstance — структура описания устройства;
InputRange — структура описания диапазона;
MouseState — структура описания состояния мыши;
DeviceClass — набор констант описания классов устройств;
DeviceType — набор констант описания типов устройств;
Key — набор констант описания клавиш клавиатуры;
Mouse — набор констант описания клавиш мыши.
Класс Manager.Device позволяет получить доступ к устройствам. Например, получение количества доступных устройств выглядит следующим образом:
DeviceList dl = Microsoft.DirectX.DirectInput.Manager.Devices;
Console.WriteLine("Всего устройств: {0}", dl.Count);
Или можно выбрать только определенный класс устройств:
DeviceList dl = Manager.GetDevices(
DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly);
С объектом типа DeviceList можно работать с помощью энумератора. Каждый элемент этой коллекции является объектом типа DeviceInstance. Код для перечисления всех устройств и отбражения некоторых свойств этих устройств выглядит следующим образом:
foreach (DeviceInstance d in dl)
{
Console.WriteLine(
"Type={0} SubType={1} Usage={2}
Page={3} Guid={4} ProductName={5}",
d.DeviceType,
d.DeviceSubType,
(UInt16)d.Usage,
(UInt16)d.UsagePage,
d.InstanceGuid,
d.ProductName
);
}
Для мыши этот код выводет строку "type=Mouse, subtype=1, usage=page=0", для клавиатуры — "type=Keyboard, subtype=4, usage=page=0", для нашего HID устройства из главы 10 — "type=Device, subtype=0, usage=1, page=65280".
Объект DeviceInstance пригоден для получения свойств устройства, а для обмена данными следует создать класс самого устройства, т. е. объект типа Device:
try
{
dev.Acquire();
dev.Poll();
BufferedDataCollection dataCollection = dev.GetBufferedData();
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
Также с помощью этого объекта можно получить идентификатор устройства:
if (d.DeviceType == DeviceType.Device)
// Для нашего HID устройства напечатает "VID_03EB&PID_6203"
Console.WriteLine(dev.Properties.TypeName);
С точки зрения Direct Input набор данных устройства состоит из элементов (объектов), в соответствии с дескриптором устройства. Для получения списка объектов необходимо вызвать метод GetObjects, передав ему необходимый фильтр:
// получить все объекты
DeviceObjectList objList =
dev.GetObjects(DeviceObjectTypeFlags.All);
// получить только коллекции
DeviceObjectList objList =
dev.GetObjects(DeviceObjectTypeFlags.Collection);
// получить только кнопки
DeviceObjectList objList =
dev.GetObjects(DeviceObjectTypeFlags.Button);
Возможные фильтры описываются флагами набота DeviceObjectTypeFlags. Разумеется, класс DeviceObjectList имеет энумератор и метод Count:
foreach (DeviceObjectInstance oi in objList)
{
Console.WriteLine(@"object:
Name={0}
Dim={1}
Offset={2}
Flags={3}
CollectionNumber={4},
Exponent={5}",
oi.Name, oi.Dimension, oi.Offset,
oi.Flags, oi.CollectionNumber, oi.Exponent
);
}
Например для мыши этот код отобразит следующие элементы:
objList.Count=8
object:
Name=X-axis
Dim=0
Offset=0
Flags=256
CollectionNumber=0,
Exponent=0
object:
Name=Y-axis
Dim=0
Offset=4
Flags=256
CollectionNumber=0,
Exponent=0
object:
Name=Wheel
Dim=0
Offset=8
Flags=256
CollectionNumber=0,
Exponent=0
object:
Name=Button 0
Dim=0
Offset=12
Flags=0
CollectionNumber=0,
Exponent=0
object:
Name=Button 1
Dim=0
Offset=13
Flags=0
CollectionNumber=0,
Exponent=0
object:
Name=Button 2
Dim=0
Offset=14
Flags=0
CollectionNumber=0,
Exponent=0
object:
Name=Button 3
Dim=0
Offset=15
Flags=0
CollectionNumber=0,
Exponent=0
object:
Name=Button 4
Dim=0
Offset=16
Flags=0
CollectionNumber=0,
Exponent=0
Перед чтением данных следует указать формат пакета, используя либо системные константы, либо класс DataFormat:
// формат данных — протокол "мыши"
dev.SetDataFormat(DeviceDataFormat.Mouse);