Deutsch
Forum

USB auslesen ...

 
- Seite 1 -



Erasmus.Herold
Hallo liebe Community.

Möchte es mit diesem Thema noch einmal ganz anders versuchen, zu Hilfe zu kommen. Die COM Schnittstelle am PC auszulesen ist mit XProfan simpel.

Wie sieht es aus mit der USB Schnittstelle?
Hat jemand sich daran versucht und hat Codeschnipsel für mich?

Bitte keine Diskussion um Treiber, Windowshoheiten oder USB2COM Adapter, sondern zu diesem Thread bitte nur den Austausch, ob jemand mit XProfan USB direkt auslesen kann.

Danke euch.
 
04.05.2019  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Paul
Glatz
Die "1995378067" in hScanner& ist ein Handle auf das Gerät und wird sich zwischen Programm- oder Computerneustarts ändern.
Der Gerätename (\\?\HID#VID_????&PID_????...) sollte konstant bleiben.

Mir ist keine Möglichkeit bekannt den Wert anzuzeigen. Aber die VID/PID sieht man auch im Geräte-Manager unter "Hardware-IDs".
 
06.05.2019  
 




Paul
Glatz
Hallo,

für HID Geräte habe ich bisher (außerhalb von XProfan) HIDAPI  [...]  verwendet.

Die von Windows bereitgestellten HID APIs verbieten jedoch den Zugriff auf HID-Tastaturen und Mäuse.

Für die Verwendung von HIDAPI in XProfan habe ich mal ein kleines Beispielprogramm angehangen.

Herunterladen

Für den Zugriff auf HID-Tastaturen und Mäuse oder andere (nicht HID) USB Geräte ist ein separater Treiber notwendig.
libusb  [...]  enthält einen Treiber mit dem man aus einem eigenen Programm kompletten Zugriff auf ein USB-Gerät erhält.

8 kB
Hochgeladen:04.05.2019
Ladeanzahl100
Herunterladen
 
04.05.2019  
 




Erasmus.Herold
Das hört sich schon einmal prima an. Werde ich kurzfristig testen.

Bedeutet also.
1. Ich muss den zuletzt genannten zusätzlichen Treiber installieren?
2. Die HIDAPI downloaden und bereitstellen?
3. Das kleine Demoprogramm testen?

Gruß und DANKE
Erasmus
 
04.05.2019  
 




Paul
Glatz
Für HIDAPI braucht man keinen Treiber und die hidapi.dll habe ich in der zip mit bereitgestellt.

Den Treiber braucht man für libusb. Mit libusb muss man sich um die komplette USB Kommunikation selbst kümmern. Dazu habe ich kein Demoprogramm. Vielleicht versuche ich morgen mal eins zu erstellen.
 
04.05.2019  
 




Erasmus.Herold
Hallo Paul.

Ein erster Test sieht schon mal gar nicht so schlecht aus. Anbei ein Screenshot.
Ich erkenne meine 6 USB Anschlüsse. Dazu ein Hinweis auf angeschlossene Tastatur und Maus von Logitech.

Aus der Ferne fehlt mir heute am Sonntag die Macht, einen Barcode-Scanner und / oder einen RFID-Reader an USB anzuschließen.

Bin gespannt, ob ich dann einen direkten Zugriff darauf bekomme und z.B. eine gescannte EAN direkt in eine Variable abgreifen kann.

 
05.05.2019  
 




H.Brill
Der Barcode Reader wird bei mir auch erkannt.

Wobei ich schon im Internet Beispiele in C / Delphi usw.
gesehen habe, die ohne libusb den Scanner erkennen
bzw. auslesen können.

Das geht auch über API und mit wm_input und mit entsprechenden
Strukturen. Zuerst muß dann ein Gerät mit RegisterRawInputDevices
angemeldet werden. Da kommen nur Standardkonstanten vor, die in der
MSDN beschrieben sind.

Es wird halt schwierig, da XProfan nur die wichtigsten Standard-Messages
durchläßt. Somit muß man wahrscheinlich die Messageverwaltung abschalten
und mit GetMessage arbeiten, was aber bei einer grafischen Benutzer-
Oberfläche (GUI) sehr hinderlich ist.

Bei Rolands Beispiel mit GetMessage (Messageverwaltung selbst übernehmen)
bekomme ich z.B. beim Einlesen eines Barcodes ins Edit die Message 257.

Also wird da schon eine Message geschickt.

Man könnte auch einen erweiterten Tastatur - Hook schreiben, der bestimmte
Tastenkürzel abfängt. Dazu muß man dann wiederum den Scanner so
konfigurieren, daß Anfang und Ende des Barcodes mit einem von der Tastatur
unerreichbaren virt. Tastencode gekennzeichnet wird. Aber besser wäre es, alles ohne Editfeld und im Hintergrund zu machen.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
05.05.2019  
 




Paul
Glatz
Ich bin bei der Suche nach einer Möglichkeit einen Barcode Scanner auszulesen auch schon auf RegisterRawInputDevices gestoßen.

Jedoch habe ich über RawInput keine Möglichkeit gefunden um zu verhinden, dass die Eingaben des Scanners zusätzlich zu den RawInput Messages als normale Tastatureingaben gesendet werden.

Somit wird z. B. wenn grad ein Editfeld den Focus hat der Barcode zusätzlich dort eingegeben oder wenn ein Button ausgewählt ist wird dieser durch den Barcodescanner ausgelöst (wenn der Scanner am Ende des Barcodes Enter "drückt").
 
05.05.2019  
 




H.Brill
Na das wäre ja schon was.
Die Editfelder könnte man ja auch mit $00CF
auf Read only setzen, wenn der Barcode eintrifft
und nach dem Lesen wieder zurücksetzen.
Oder brauchst du unbedingt das ENTER im Barcode ?
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
05.05.2019  
 




Erasmus.Herold
Danke für die Ideen und Ansätze.
Gleichwohl vom einfachen (luxuriösen) Erfassen á la COM ist es doch weit entfernt.
Gruß Erasmus
 
05.05.2019  
 




H.Brill
Was für einen Scanner hast du denn ?
Kann man den nicht umstellen auf COM
Emulation ?
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
05.05.2019  
 




Erasmus.Herold
Genau das ist mein Ansatz.
Eine Lösung in XProfan für reine USB Geräte zu finden.
Via COM ist nie ein Problem.
 
05.05.2019  
 




Paul
Glatz
Habe nochmal mit RawInput rumprobiert und eine Möglichkeit gefunden um die Eingaben des Scanners abzufangen.

Das Programm setzt wenn eine Eingabe vom Scanner erkannt wird den Focus in ein verstecktes Edit und wenn ein Enter vom Scanner kommt wird der Focus auf das ursprüngliche Control zurück gesetzt und der Barcode kann aus dem verstecken Edit gelesen werden.

Habe gerade keine Barcodescanner zum Testen da und konnte es daher nur mit einer zweiten Tastatur testen.
Struct RAWINPUTDEVICE = usUsagePage%, usUsage%, dwFlags&, hwndTarget&
Struct RAWINPUTKEYBOARD = dwType&, dwSize&, hDevice&, wParam&, MakeCode%, Flags%, Reserved%, VKey%, Message&, ExtraInformation&
Def RegisterRawInputDevices(3) !"User32", "RegisterRawInputDevices"
Def GetRawInputData(5) !"User32", "GetRawInputData"
Def GetRawInputDeviceList(3) !"User32", "GetRawInputDeviceList"
Def GetRawInputDeviceInfoA(4) !"User32", "GetRawInputDeviceInfoA"
WindowTitle "RawInput"
Window 1000, 600
SubClass %HWnd, 1
Declare hScanner&, CodeStatus%, CodeFocus&
DrawText 5, 5, "Scanner:"
Var hDev& = Create("ChoiceBox", %hwnd, 1, 5, 25, Width(%hwnd) - 10, 300)
AddDevices hDev&
Create("Button", %hwnd, "Testbutton", 5, 60, 200, 25)
Create("Edit", %hwnd, "Testedit", 5, 90, 200, 25)
Var hCode& = Create("Edit", %hwnd, "", 2000, 2000, 0, 0)// Verstecktes Textfeld für Barcodeeingabe
Var hLog& = Create("MultiEdit", %hwnd, "", 5, 120, Width(%hwnd) - 10, Height(%hwnd) - 125)
// RawInput registrieren
Declare rid#
Dim rid#, RAWINPUTDEVICE
rid#.usUsagePage% = 1// RegisterRawInputDevices
rid#.usUsage% = 6// Keyboard
rid#.dwFlags& = 0// $30 /* RIDEV_NOLEGACY */
rid#.hwndTarget& = %hwnd

IfNot RegisterRawInputDevices(rid#, 1, SizeOf(rid#))

    MessageBox("RawInput konnte nicht registriert werden " + Hex$(%WinError), "", 0)

EndIf

// Hauptschleife

While 1

    WaitInput

    If Clicked(hDev&)

        hScanner& = Val(SubStr$(GetText$(hDev&), 2, "|"))

    ElseIf %MenuItem = 1234

        SetText hLog&, GetText$(hLog&) + "Barcode gelesen: " + GetText$(hCode&) + "\n"

    EndIf

EndWhile

Proc AddDevices

    Parameters hList&
    Declare numDevices&, devices#, hDevice&
    GetRawInputDeviceList(0, Addr(numDevices&), 8)

    If numDevices& = 0

        Return

    EndIf

    Dim devices#, numDevices& * 8
    GetRawInputDeviceList(devices#, Addr(numDevices&), 8)

    WhileLoop numDevices&

        If Long(devices#, (&Loop * 8) + 4) = 1/* RIM_TYPEKEYBOARD */

            hDevice& = Long(devices#, &Loop * 8)
            AddString(hList&, GetDeviceName(hDevice&) + "|" + Str$(hDevice&))

        EndIf

    EndWhile

EndProc

Proc GetDeviceName

    Parameters hdev&
    Declare buf#, len&
    GetRawInputDeviceInfoA(hdev&, $20000007  0, Addr(len&))/* RIDI_DEVICENAME */

    If len& = 0

        Return ""

    EndIf

    Dim buf#, len&
    GetRawInputDeviceInfoA(hdev&, $20000007  buf#, Addr(len&))/* RIDI_DEVICENAME */
    Return String$(buf#, 0)

EndProc

SubClassProc

    If SubClassMessage(%hWnd, $00ff)/* WM_INPUT */

        Declare raw#
        Dim raw#, RAWINPUTKEYBOARD
        Var size& = SizeOf(raw#)

        IfNot GetRawInputData(&sLParam, $10000003  raw#, addr(size&), 16) == -1/* RID_INPUT */

            If (raw#.hDevice& = hScanner&) AND ((raw#.flags% & 1  = 0)/* RI_KEY_BREAK */

                IfNot GetFocus(hCode&)

                    CodeFocus& = %GetFocus
                    SetFocus(hCode&)
                    SetText hCode&, ""

                EndIf

                If raw#.VKey% = 13// scancode 13 = Enter

                    SetFocus(CodeFocus&)
                    CodeFocus& = 0
                    SetMenuItem 1234

                EndIf

            EndIf

        EndIf

    EndIf

EndProc

 
05.05.2019  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

19.784 Betrachtungen

Unbenanntvor 0 min.
Member 862464120.05.2024
Sven Bader03.07.2023
H.Brill14.05.2023
Normann Strübli30.01.2023
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie