libusb-win32 - не может читать с клавиатуры

Я пытаюсь написать собственный «драйвер» для клавиатуры (HID, если это имеет значение) под Windows 7. Конечная цель — подключить к компьютеру две клавиатуры, но сопоставить все клавиши одной из них со специальными (пользовательские) функции.

Моя идея состоит в том, чтобы использовать libusb-win32 в качестве драйвера второй клавиатуры и написать небольшую программу для чтения данных с клавиатуры и обработки их. Я успешно установил драйвер, и устройство распознается моей программой, но тайм-аут всех передач, хотя я нажимаю клавиши.

вот мой код:

     struct usb_bus *busses;
     struct usb_device *dev;
     char buf[1024];

     usb_init();
     usb_find_busses();
     usb_find_devices();

     busses = usb_get_busses();
     dev = busses->devices;

     cout << dev->descriptor.idVendor << '\n' << dev->descriptor.idProduct << '\n';

     usb_dev_handle *h = usb_open(dev);
     cout << usb_set_configuration(h, 1) << '\n';
     cout << usb_claim_interface(h, 0) << '\n';
     cout << usb_interrupt_read(h, 129, buf, 1024, 5000) << '\n';
     cout << usb_strerror();
     cout << usb_release_interface(h, 0) << '\n';
     cout << usb_close(h) << '\n';

и он возвращает:

  1133
  49941
  0
  0
  -116
  libusb0-dll:err [_usb_reap_async] timeout error
  0
  0

(Я нажимаю много клавиш за эти 5 секунд)

Есть только одна шина, одно устройство, одна конфигурация, один интерфейс и одна конечная точка. Конечная точка имеет bmAttributes = 3, что означает, что я должен использовать прерывание передачи (правильно?)

так почему я ничего не получаю? Я неправильно использую libusb? Вы знаете способ сделать это без libusb?


person nirbruner    schedule 03.01.2012    source источник
comment
Вы говорите ... цель состоит в том, чтобы иметь две клавиатуры ... сопоставление всех клавиш одной из них со специальными (настраиваемыми) функциями. Вы когда-нибудь закончили этот проект? Это доступно где-нибудь? У меня была точно такая же идея какое-то время, и я никогда не нападал на нее. Спасибо!!   -  person Jonas Heidelberg    schedule 08.08.2014
comment
@JonasHeidelberg ознакомьтесь с этим суть. Сам проект C#, и некоторые классы отсутствуют, но я думаю, что его можно использовать в таком виде. (весь проект не публичный и я не могу его опубликовать)   -  person nirbruner    schedule 09.08.2014


Ответы (1)


На самом деле это довольно просто — при чтении с USB-устройства вы должны прочитать точно нужное количество байтов. Вы знаете, что это за сумма, прочитав wMaxPacketSize.

По-видимому, запрос на чтение с любым другим размером просто приводит к тайм-ауту.

person nirbruner    schedule 11.01.2012