Einzelnen Beitrag anzeigen

Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#1

Globaler Tastaturhook für eine bestimmte Tastatur

  Alt 21. Sep 2022, 21:26
Hallo,

ich würde gerne über einen globalen Tastaturhook die Eingaben einen bestimmten Tastatur auswerten. Speziell habe ich hier so einen RFID-Reader, welcher sich als Tastatur ausgibt. Die Alternative könnte sein, diesen Reader direkt via USB irgendwie auszulesen. Dafür fehlt mir aktuell leider noch das Wissen. Falls das eine nicht geht, wäre das also auch eine gute Option. Es gibt auf der verlinkten Seite ein kleines Tool, mit dem man ein paar wenige Optionen des Readers anpassen kann.

Der Reader sendet 10 Zeichen (0-9), welche der ID der Karte entspricht und dann ein Return. Man kann das auf HEX oder so umstellen, aber das löst das Problem noch nicht so richtig. Die Zeichen zu lesen ist kein Problem, allerdings dürfen diese dann auch nicht einfach in anderen Eingabecontrols landen. Man kann dem Reader leider auch nicht mitteilen, dass man ein spezielles Anfangszeichen braucht. Die Option "Add user-defined byte" aus der Software hat leider keine Funktion.

Der Code hier funktioniert soweit, leider bekommt halt jedes Eingabecontrol welches gerade zufällig Aktiv ist den Code ebenfalls.

Code:
unit RfidTest;

interface

implementation

uses
  Winapi.Windows, Winapi.Messages;

var
  GlobalKeyboardHook: HHOOK;
  RfidCode: string;


function KeyboardHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
type
  PKeyboardLowLevelHookStruct = ^TKeyboardLowLevelHookStruct;
  TKeyboardLowLevelHookStruct = record
    KeyCode: Cardinal;
    ScanCode: Cardinal;
    Flags: Cardinal;
    Time: Cardinal;
    ExtraInfo: Cardinal;
  end;

var
  DllHook: PKeyboardLowLevelHookStruct;

begin
  if nCode = HC_ACTION then
  begin
    DllHook := PKeyboardLowLevelHookStruct(lParam);

    if (wParam = WM_KEYUP) or (wParam = WM_SYSKEYUP) then
    begin
      if (DllHook^.KeyCode >= Ord('0')) and (DllHook^.KeyCode <= Ord('9')) then
        RfidCode := RfidCode + Char(DllHook^.KeyCode)
      else if DllHook^.KeyCode = VK_RETURN then
      begin
        OutputDebugString(PWideChar('RFID-Code: ' + RfidCode));
        RfidCode := '';
      end;
    end;
  end;

  Result := CallNextHookEx(GlobalKeyboardHook, nCode, wParam, lParam);
end;



procedure InitGlobalKeyboardHook();
begin
  GlobalKeyboardHook := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, 0, 0);

  if GlobalKeyboardHook = 0
    then RaiseLastOSError;
end;


procedure KillGlobalKeyboardHook();
begin
  if (GlobalKeyboardHook <> 0) then
    UnhookWindowsHookEx(GlobalKeyboardHook);
end;

initialization
  InitGlobalKeyboardHook();

finalization
  KillGlobalKeyboardHook();

end.
Hat jemand vielleicht hilfreiche Ideen dazu parat?
  Mit Zitat antworten Zitat