[WINAPI] CreateFile i pobieranie danych z USB(HID)

0

Witam

Staram się napisać program, który będzie pobierał dane z urządzenia USB-urządzenie korzysta z interfejsu HID i jest widoczne w panelu sterowania jak klawiatura. Przeczytałem, że można to zrobić po prostu otwierając "plik" do urządzenia.
Pozyskałem wartości VIP i PID urządzenia metodą SetupDiEnumDeviceInterfaces.

I teraz staram się "stworzyć" plik do urządzenia:

CreateFile(urzadzenie, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, null, OPEN_EXISTING, 0, 0);

Jak widać parametr dwDesiredAccess nie jest jak wszędzie podają GENERIC_WRITE | GENERIC_READ. W takim rozwiązaniu zawsze dostawałem uchwyt -1. Nawet jeżeli włączyłem FILE_FLAG_OVERLAPPED.
Przy podaniu tylko GENERIC_WRITE zwraca mi uchwyt-co to oznacza w praktyce bo przecież ja chce tylko czytać przychodzące dane z urządzenia (dlatego też dałem zamiast FILE_FLAG_OVERLAPPED to wpisałem 0), a GENERIC_WRITE przecież zezwala tylko na zapis do pliku(portu)-dobrze rozumiem?

No ok tak czy siak mam uchwyt ale przy wywołaniu ReadFile za pierwszym razem mam wynik w getlasterror 0 co niby potwierdza poprawne wykonanie funkcji ale za każdym kolejnym dostaje 5 co odpowiada ACCESS_DENIED...co robić?

Czy mimo że chce tylko czytać z urządzenia i to musze dać asynchroniczną komunikację? Moze do USB inaczej się stosuje pobieranie danych z portu niż do RS 232??

Proszę o pomoc.
Pozdrawiam

0

No ok okazuje się że gdy urządzenie pracuje jako klawiatura systemowa to nie można urzyskać do niego uchwytu-tzn nawet jak się uzyska to i tak tylko można uŻyć getfeature i setfeature co mnie nie zadowala.

Teraz spróbowałem z low-level keyboard hook....w sumie działa ale niestety globalnie-czy jest jakiś sposób (czytam MSDN i chyba nie ma) na rozdzielenie i określenie z jakiego urządzenia płyną dane?

0
lipkerson napisał(a)

na rozdzielenie i określenie z jakiego urządzenia płyną dane?

jest i gdzies jest na forum (RegisterRawInputDevices)

0

Dzięki za odpowiedz.

Tak to faktycznie będe miał dokładnie rozdzielone skąd dane i do czego. Ale to już jest czyste RAW data API. To jednak użyje w ostatecznośći. Teraz jeszcze tego hook'a do klawiatury ale już widze że na 99% to jest tylko globalne.

OK poszukam na forum-a czy ktoś ma jakieś doświadczenia z tym Raw data api? Jakieś przyjemne linki,źródła?:)

Pytam bo aplikacje piszę w Javie ale korzystam z natywnego kodu i się zastanawiam czy skorzystać z raw'a czy może lepiej włączyć emulację serial portu i starać się po prostu czytać jak z normalnego portu-co wy na to?

0

hmm na 100% nie da się rozdzielić przy użyciu SetWindowsHookEx :/

Ok to zostaje Raw data Api

Znalazłem twój post i otworzyłem linka i powiem ze ciekawe-tylko nic mi niedaje bo nie piszę w delphi-poszukam w C/C++, ewentulanie VB albo zacznę mapować do Javy...ciekawym efektu. Moze macie podobne już napisane w C++?

Pozdrawiam

0

Jesli piszesz aplikacje w Javie ktora i tak nie bedzie przenosna to moze warto z java zrezygnowac ?!

delphi/c++/... co kolwiek nie ma znaczenia wazny jest opis funkcji na MSDN !! Trzeba go zrozumiec reszta to formalnosc.

0

Nie da rady zrezygnować-to część duzego projektu napisanego w Javie i technologiach pokrewnych. A pisanie natywnych kodów w Javie nie jest takie złe-osobiście lubię Java Native Access, dzięki któremu już z niejednej funkcjonalności winapi skorzystałem więc msdn i tamte opisy mi niegroźne-ale zawsze lepiej spytać przed spędzeniem godzin nad implementacją.

Odnośnie RAW data Api-wymyśliłem że dane będą kierowane do niewidzialnego okna-to chyba uda mi się bezproblemu zrobić. Pytanie za to nasuwa się-czy da rade zrobic tak by dane (w systemie urządzenie jest widoczne jako klawiatura systemowa) były tylko i wyłącznie kierowane do tego mojego okna?? Że nie ze przełącze się do np. przeglądarki i tam nagle zacznie się pojawiać strumień-z tego co czytam to chyba da się ale w praktyce?

0

to moze byc trudniejsze jesli urzadzenie od razu jest jako klawiatura.
W ustawieniach systemu nie widzialem (ale tez nie szukalem) opcji w ktorej mozna by ustalic aktywna klawiature

Z pewnoscia mozna by pisac filter driver (a to raczej nie w java) ale z tego co kojarze to juz nie jest zalecany dla systemow >= windows 7

0

Inaczej to rozwiązałem - ustawiłem na emulacje serial portu, wtedy urządzenie przechodzi z klawiatury systemowej hid na hid "zwykły". Z javy implementuje createfile/readfile/createevent i tak dalej z kernela -dostaje raport z danymi z urządzenia i jeżeli jest to coś co mnie interesuje to przetwarzam sobie i nie puszczam dalej , a jeżeli coś innego co normalnie miało pójść jako klawiatura systemowa to używam z user32 keybd_event i symuluje keystroke czyli tak jakby to normalnie wyglądało. Działa ślicznie.

Tak btw: jaki jest odpowiednik keybd_event oraz tych funkcji z kernela windowsowego w Linux?
Gdzie tego szukać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1