2012-01-03 6 views
2

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

Моя идея - использовать 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?

+0

Вы говорите: «... цель состоит в наличии двух клавиатур ... сопоставление всех ключей одного из них специальным (обычным) функциям». Вы когда-нибудь закончили этот проект? Он доступен где-то? У меня была та же самая идея на некоторое время, и я никогда не мог ее атаковать. Благодаря!! –

+0

@JonasHeidelberg проверьте этот [gist] (https://gist.github.com/xorserer/481356fa586fcaa426f5). Сам проект - это C#, а некоторые классы отсутствуют из сути, но я думаю, что он может использоваться в этой форме. (Весь проект не является публичным, и я не могу его публиковать) – nirbruner

ответ

4

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

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

Смежные вопросы