﻿#include <APISysConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

; hier muss der DeviceName von eurem Scanner drinstehen
; beim auskommentieren von Zeile 47 wird der DeviceName beim scannen angezeigt.
Global $g_sDevName = '\\?\HID#VID_13BA&PID_0018#6&238b7016&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}'

Global $g_hForm = GUICreate('BarcodeScanner', 300, 120)
Global $g_idLabel = GUICtrlCreateLabel('', 5, 5, 290, 30) ; fuer die Ausgabe vom Barcode-Scanner
GUICtrlSetFont(-1, 16)
Global $g_idInput = GUICtrlCreateInput('', 5, 40, 290, 30) ; zum testen ein Input, fuer eine Eingabe von der Tastatur
GUICtrlSetFont(-1, 16)
Global $g_idDummy = GUICtrlCreateInput('', 0, 0, 0, 0) ; Dummy-Input, um die Scannereingabe umzulenken

Local $tRID = DllStructCreate($tagRAWINPUTDEVICE)
DllStructSetData($tRID, 'UsagePage', 0x01)
DllStructSetData($tRID, 'Usage', 0x06)
DllStructSetData($tRID, 'Flags', $RIDEV_INPUTSINK)
DllStructSetData($tRID, 'hTarget', $g_hForm)
_WinAPI_RegisterRawInputDevices($tRID)

GUIRegisterMsg($WM_INPUT, 'WM_INPUT')
GUISetState(@SW_SHOW)
GUICtrlSetState($g_idInput, $GUI_FOCUS)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam)
	#forceref $iMsg, $wParam
	Local Static $sBuffer = ''
	Local $devType, $devName, $tRIM, $tText, $hFocus
	Switch $hWnd
		Case $g_hForm
			$tRIM = DllStructCreate($tagRAWINPUTHEADER)
			If _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_HEADER) Then
				$devType = $tRIM.Type
			Else
				ConsoleWrite("Device Header Retrieval Failed" & @CRLF)
				Return
			EndIf
			$tText = DllStructCreate('wchar data[256]')
			If _WinAPI_GetRawInputDeviceInfo($tRIM.hDevice, $tText, 256, $RIDI_DEVICENAME) Then
				$devName = $tText.data
;~ 				ConsoleWrite(StringFormat("DevName: '%s'\r\n", $devName))
			Else
				ConsoleWrite('Device Name Retrieval Failed' & @CRLF)
			EndIf
			If $devName = $g_sDevName Then ; hier wird getestet, ob die Eingabe vom Barcode-Scanner kommt
				If $devType = $RIM_TYPEKEYBOARD Then ; sicherstellen, dass eine Tastatur-Emulation erfolgt
					GUICtrlSetState($g_idDummy, $GUI_FOCUS) ; Focus auf das Dummy-Input setzen
					$tRIM = DllStructCreate($tagRAWINPUTKEYBOARD)
					If _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_INPUT) Then
						If $tRIM.Message = $WM_KEYUP Then ; wenn KEYUP
							If $tRIM.VKey = 13 Then ; wenn VKey = 13 (@CR) wird bei meinem Barcode-Scanner als Postfix gesendet (evtl. anpassen)
								GUICtrlSetData($g_idLabel, $sBuffer) ; Buffer im Label anzeigen
								$sBuffer = '' ; Buffer leeeren, fuer naechsten Code
								ConsoleWrite('--- New Code ---' & @CRLF) ; nur zum debuggen
								GUICtrlSetState($g_idInput, $GUI_FOCUS) ; Focus wieder auf das Input fuer die Tastatur
							Else ; alle anderen Zeichen werden in den Buffer uebernommen
								$sBuffer &= Chr($tRIM.VKey)
								ConsoleWrite('Char: ' & Chr($tRIM.VKey) & @CRLF) ; nur zum debuggen
							EndIf
						EndIf
					EndIf
				EndIf
			EndIf
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_INPUT
