Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2009, 15:39   #1
Gonzo
Форумчанин
 
Аватар для Gonzo
 
Регистрация: 07.03.2009
Сообщений: 123
Вопрос Работа с джойстиком через USB

Пишу приложение по работе с игровым джойстиком через USB-порт. Кто сталкивался с этим? Буду благодарен за любую информацию и ссылки.

Ситуация следующая: к ПК под WinXP подключен джойстик (заранее не определенно, какой джойстик будет подключен), клавиатуры подключенно не будет. Независимо от модели джойстика, необходимо отлавливать и определять нажатия стрелок и двух-трех основных кнопок. Кто что посовеует?
Не говорите что мне делать, и я не скажу куда Вам идти.
Пишу программы на заказ на Delphi и Pascal
Форум разработчиков Pascal и Delphi
Gonzo вне форума Ответить с цитированием
Старый 28.10.2009, 16:03   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

как правило джойстики являются hid устройствами и драйвера не требуют... работать с ними не очень просто, а бы сказал очень просто через обращения к классам hid/ для облегчения труда разработчиков уже есть такой компонент - JvHidController (прилагаю к сообщению)...

...читаем подключенные hid:
Код:
function TForm1.hidEnumerate(HidDev: TJvHidDevice;
  const Idx: Integer): Boolean;
var n: Integer;
begin
 n:= ListBox1.Items.Add(DeviceName(HidDev));
 Hid.CheckOutByIndex(Dev, Idx);
 Dev.NumInputBuffers      := 128;
 Dev.NumOverlappedBuffers := 128;
 ListBox1.Items.Objects[n]:= Dev;
 Result:= True
end;
читаем данные:
Код:
procedure TForm1.hidDeviceData(HidDev: TJvHidDevice; ReportID: Byte;
  const Data: Pointer; Size: Word);
var i: integer;
    s: string;
    k: longword;
begin
 for i:= 0 to Size - 1 do
  s:= s + Format('%.2x ', [Cardinal(PChar(Data)[i])]);
 caption:= s;
 // тут преобразуем если в двух-байтном
 // например смещением
end;
как узнать что это ваше устройство (фильтруем по VID и PID):
Код:
function DeviceName(HidDev: TJvHidDevice): string;
begin
 if HidDev.ProductName <> '' then Result:= HidDev.ProductName
  else Result:= Format('Device VID=%.4x PID=%.4x',
                       [HidDev.Attributes.VendorID,
                       HidDev.Attributes.ProductID]);
 if HidDev.SerialNumber <> '' then // проверка наличия Serial Num
  Result:= Result + Format(' (Serial=%s)', [HidDev.SerialNumber])
end;
пример чтения-обращения к моему hid термометру прилагаю... думаю разберетесь

пы-сы: если что спрашивайте...
Вложения
Тип файла: zip HID.USB термометр_тестовый прием.zip (242.1 Кб, 445 просмотров)
Тип файла: zip компонент для доступа к HID устройствам.zip (249.3 Кб, 413 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 28.10.2009 в 16:12. Причина: дополняю: работать с джойстиком можно и через сообщения
raxp вне форума Ответить с цитированием
Старый 28.10.2009, 16:15   #3
Gonzo
Форумчанин
 
Аватар для Gonzo
 
Регистрация: 07.03.2009
Сообщений: 123
По умолчанию

Спасибо большое. Добавил отзыв.
Не говорите что мне делать, и я не скажу куда Вам идти.
Пишу программы на заказ на Delphi и Pascal
Форум разработчиков Pascal и Delphi
Gonzo вне форума Ответить с цитированием
Старый 28.10.2009, 16:20   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

дополню еще... кроме аппаратного чтения любых hid устройств, в delphi
есть еще более простой способ, возможно для вас он подойдет больше:
Код:
uses mmsysmem;

var
  myjoy: tjoyinfo;
begin
  joygetpos(joystickid1,@myjoy);
  //myjoy.wypos;
  //myjoy.wxpos;
  //(myjoy.wbuttons and joy_button1)>0;
  //(myjoy.wbuttons and joy_button2)>0;
end;
и еще с контролем отсутствия...
Код:
var
  MyJoy: TJoyInfo;
  ErrorResult: MMRESULT;
begin
  ErrorResult := joyGetPos(joystickid1, @MyJoy);
  if ErrorResult = JOYERR_NOERROR then
  begin
    //MyJoy.wypos;
    //MyJoy.wxpos;
    //(MyJoy.wbuttons and joy_button1) > 0;
    //(MyJoy.wbuttons and joy_button2) > 0;
  end
  else
    case ErrorResult of
      MMSYSERR_NODRIVER: ShowMessage('не обнаружен');
      MMSYSERR_INVALPARAM: ShowMessage('неверные параметры');
      JOYERR_UNPLUGGED: ShowMessage('джойстик вытянут');
    else
      ShowMessage('неизвестная ошибка');
    end;
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 17.11.2010, 20:22   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

VendorID, ProductID.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно обратиться к устройству, которое подключено через USB порт Mikhail Bakurov Общие вопросы Delphi 8 17.11.2008 20:42
Работа с usb портом Spice Общие вопросы .NET 6 16.07.2008 08:32
работа с питанием usb портов One.Love Общие вопросы Delphi 1 19.05.2008 16:05
Работа USB накопителями D7_beginner Win Api 4 04.12.2007 12:47