Hallo Leute,
Wenn ein Barcodescanner seine Daten schickt, sendet er ascii20 als erstes, gefolgt von dem Strichcodewerten, abschließend Return. Wenn ascii20 via Tastaturhook kommt, soll meine Anwendung aktiv werden. Aber anstelle ascii20 zu emfangen, empfange ich 2 DllMessages mit Wert 84 und 17 ???
Ein Tastaturhook sendet via:
PostMessage(FindWindow(nil,'Versatile'), WM_USER + 8765,wParam,lParam);
Informationen an "Versatile.exe". Dort werden sie in
procedure TVersatile_main_handle.DllMessage(var Msg: TMessage);
abgefangen und Testweise ausgegeben via:
Delphi-Quellcode:
if msg.WParam <>0 then
begin
memo1.Lines.Append('0: ['+inttostr(Msg.wParam)
+'] 1: ['+inttostr(Msg.lParam)
+'] 2: ['+inttostr(Msg.Result)
+'] 3: ['+inttostr(Msg.WParamLo)
+'] 4: ['+inttostr(Msg.WParamHi)
+'] 5: ['+inttostr(Msg.LParamLo)
+'] 6: ['+inttostr(Msg.LParamHi)
+'] 7: ['+inttostr(Msg.ResultLo)
+'] 8: ['+inttostr(Msg.ResultHi)
+']');
end;
ABER:
Wenn ich "Strg" drücke, kommen diese Werte an: (17 wäre ja
ascii vom Hardwaredevice 1)
Code:
0: [17] 1: [-1071841279] 2: [0] 3: [17] 4: [0] 5: [1] 6: [49181] 7: [0] 8: [0]
Wenn ich "a" drücke, kommen diese Werte an: (65 wäre ja
ascii vom große "A")
Code:
0: [65] 1: [-1071775743] 2: [0] 3: [65] 4: [0] 5: [1] 6: [49182] 7: [0] 8: [0]
und wenn ein Barcodescanner
Ascii[20] für Hardwaredevice4 sendet kommt das an:
Code:
0: [84] 1: [-1072431103] 2: [0] 3: [84] 4: [0] 5: [1] 6: [49172] 7: [0] 8: [0]
0: [17] 1: [-1071841279] 2: [0] 3: [17] 4: [0] 5: [1] 6: [49181] 7: [0] 8: [0]
Ich würde aber eigentlich nur den Wert ascii20 benötigen. Wie komm ich zu den Wert ?
Komischerweise ergibt 84 und 17 ..... also 8+4 + 1+7 = 20 ?
Kann mir jemand verraten, was ich da falsch mache?
Vielen Dank
Erich
ich hab schon versucht, den "wparam"-Wert via ToAscii umzuwandeln, wenn aber dann "Strg" gedrückt wird - gibts AccessViolations:
Delphi-Quellcode:
function GetCharFromVKey(vkey: Word): string;
var
keystate: TKeyboardState;
retcode: Integer;
begin
Win32Check(GetKeyboardState(keystate)) ;
SetLength(Result, 2) ;
retcode := ToAscii(vkey,
MapVirtualKey(vkey, 0),
keystate, @Result[1],
0) ;
case retcode of
0: Result := '';
1: SetLength(Result, 1) ;
2: ;
else
Result := '';
end;
end;
Tastaturhook (Freepascal wegen 32 / 64 Bit)
Delphi-Quellcode:
library Versatile32;
{$mode objfpc}{$H+}
{$IFDEF WINDOWS}{$R Versatile32.rc}{$ENDIF}
uses
Classes,
Windows,
ActiveX,
ShlObj,
Messages,
SysUtils;
var
HookHandle: Cardinal = 0;
AppHandle: HWND;
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
stdcall;
begin
Result := CallNextHookEx(HookHandle,
nCode,
wParam,
lParam);
if nCode = HC_NOREMOVE
then Exit;
if ((lParam
and (1
shl 30)) <> 0)
then
begin
if wParam = VK_F4
then
begin
PostMessage(FindWindow(
nil,'
Versatile'), WM_USER + 8765, 300, 0);
end
else
begin
PostMessage(FindWindow(
nil,'
Versatile'), WM_USER + 8765,wParam,lParam);
end;
end;
end;
function StartHook32(ApplicationHandle: HWND): Boolean;
stdcall;
begin
Result := False;
if HookHandle = 0
then
begin
HookHandle := SetWindowsHookEx(WH_KEYBOARD,
@KeyboardHookProc,
HInstance,
GetCurrentThreadId());
AppHandle := ApplicationHandle;
Result := TRUE;
end;
end;
function StopHook32: Boolean;
stdcall;
begin
Result := UnhookWindowsHookEx(HookHandle);
HookHandle := 0;
end;
exports
StartHook32,
StopHook32;
end.
Erich Wanker - for life:=1971 to lebensende do begin ..