| |
|
|
- 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. |
|
|
| |
|
|
|
« 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". |
|
|
| |
|
|
|
|
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. |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
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"). |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
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
|
|
|
| |
|
|