Einzelnen Beitrag anzeigen

Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
460 Beiträge
 
Delphi XE4 Professional
 
#1

Keyhook - wParam und lParam in ASCII umwandeln

  Alt 23. Jun 2010, 11:42
Delphi-Version: 2005
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 ..
  Mit Zitat antworten Zitat