hipfzwirgel
Goto Top

Hook-Funktion zum Einlesen eines RFID-Scanners in Autoit

Hallo Gemeinde,

ich habe ein HW-Buchungssystem in Autoit geschrieben. Damit habe ich aber ein erhebliches Problem:

Zur Authentisierung eines Buchungsvorganges muss der User seinen Betriebsausweis auf den genannten RFID Scanner(Emulation Tastatureingabe) legen. Dadurch wird die 6-stellige Ausweisnummer ausgelesen. Hierzu habe ich eine Hook-Funktion erstellt. Das Problem: Die Hook-Funktion funktioniert nur einmal nach dem Programm-Start.
Wenn der Buchungsvorgang abgeschlossen ist und ich Quasi an den Anfang zurückkehre, lässt sich die Ausweisnummer nicht mehr einlesen.

Wie kann ich die Hook-Funktion quasi on demand starten(ein Aufruf der Funktion zur Laufzeit geht jedenfalls nicht!)?

Beim Programm-Start wird die Func _initKeyHook ausgeführt die die Hookprozedur initiiert.

Func _InitKeyHook()
	ConsoleWrite('_InitKeyHook Start' & " " & _Counter() & @CRLF)  
	If $g_hStub_KeyProc = Null Then
		$g_hStub_KeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam')  
		Local $hmod = _WinAPI_GetModuleHandle(0)
		$g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), $hmod)
	EndIf
	ConsoleWrite('_InitKeyHook End' & " " & _Counter() & @CRLF)  
EndFunc   ;==>_InitKeyHook

Das Kuriose an der Sache: Der Vorgang (Ausweis einlesen - Buchen - Ausweis erneut einlesen -Buchen, etc.) hat Anfangs super funktioniert.
Ohne i-welche Änderungen am Code(kompilierte Exe) geht der Vorgang auf einmal egal auf welchem Rechner ich die Exe ausführe nicht mehr.
Ich vermute Änderung im Handling mit Hooks in Windows 10...

Beim weiteren Versuch eine Ausweisnummer einzulesen kommt nur noch ein Plong vom OS...

Content-Key: 3855389432

Url: https://administrator.de/contentid/3855389432

Printed on: April 27, 2024 at 23:04 o'clock

Mitglied: 3803037559
3803037559 Sep 06, 2022 updated at 11:23:31 (UTC)
Goto Top
Moin.
Deine Callback Prozedur die auf das Event reagiert fehlt hier leider ...
Würde dazu mal folgendes lesen und mit allem bei dir angewendetem abgleichen.
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legac ...

Cheers
certguy
Member: hipfzwirgel
hipfzwirgel Sep 07, 2022 at 08:46:23 (UTC)
Goto Top
Hallo Certguy,

zunächst vielen lieben Dank für deine Antwort. Also den Beitrag kenne ich schon. Leider steht da, zumindest für mich nicht ersichtlich, wie man eine Callback-Prozedur richtig beendet und vor allem wie man sie bei Bedarf wieder initiiert.
Es ist nämlich so, dass die Hook-Prozedur nur während des Einlesens des Betriebsausweises aktiv sein soll. Danach wird nämlich ein QR/Datamatrix-Code eingelesen. Da wäre es furchtbar wenn der Hook da noch aktiv ist. Aber das ist gelöst.
Nur: wie bekomme ich die Hook-prozedur wieder an den Start, wenn der Buchungsvorgang erledigt ist.
Hier mal die CallBack-Prozedur

Func _KeyProc($nCode, $wParam, $lParam)
	If Not $g_bScanActiv Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
	Local $tKEYHOOKS, $sChar
	$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
	If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
	If $wParam = $WM_KEYDOWN Then
		$sChar = Chr($tKEYHOOKS.vkCode)
		If StringRegExp($sChar, '[0-9]') Then ; $sChar kann jetzt nur "0 - 9" enthalten (nicht von NUMPAD-Eingabe)  
			$g_sAusweisNr &= $sChar ; Speichern der einzelnen Zeichen in $g_sAusweisNr zur kompletten Ausweisnr die immer aus 6 Zahlen besteht
			If StringLen($g_sAusweisNr) = 6 Then ; AusweisNr kpl. eingelesen
				$g_bScanActiv = False ; Key-Hook pausiert
				GUICtrlSendToDummy($g_DummyStartCheck) ; Ctrl "$g_DummyStartCheck" wird befeuert und dessen hinterlegte Aktion gestartet  
				GUICtrlSetState($g_btScan, $GUI_ENABLE) ; Button zum Starten Scan freigeben
			EndIf
		Else ; irgendein Nicht-Ziffer Zeichen - FEHLER
			$g_sAusweisNr = '' ; $g_sAusweisNr leeren  
			$g_bScanActiv = False ; Key-Hook pausiert, User muss aktiv Scanvorgang neu starten
			$g_sErrorType = 'NoDigit'  
			GUICtrlSendToDummy($g_DummyError) ; Ctrl "$g_DummyError" wird befeuert und dessen hinterlegte Aktion gestartet  
		EndIf
		Return -1 ; Eingabe wird nicht an das System weitergeleitet
	EndIf
	Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc