AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Keyhook - wParam und lParam in ASCII umwandeln

Ein Thema von erich.wanker · begonnen am 23. Jun 2010 · letzter Beitrag vom 23. Jun 2010
Antwort Antwort
Benutzerbild von erich.wanker
erich.wanker

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

Keyhook - wParam und lParam in ASCII umwandeln

  Alt 23. Jun 2010, 10: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
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Keyhook - wParam und lParam in ASCII umwandeln

  Alt 23. Jun 2010, 12:09
Wenn der Barcodescanner nicht 20 schickt kannst du auch nicht 20 empfangen. Da machst du nichts falsch.
Und nur weil die Quersumme der Tastencodes 20 ergibt ist das keine 20
Aber eigentlich ist es doch auch egal ob eine 20 ankommt oder nicht? Dir geht es doch nur darum festzustellen wenn etwas vom Barcodescanner kommt. Und wenn dieser anstelle einer 20 etwas anderes schickt reagiere doch einfach auf das andere.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

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

AW: Keyhook - wParam und lParam in ASCII umwandeln

  Alt 23. Jun 2010, 14:26
Hallo SirThornberry,

komisch bei der ganzen Sache ist aber, das mit meinem aktuellen Keyhook "Strg" dann als "pseudo ascii 17" ermittelt wird .. und das bringt Probleme (soll ja HardwareDevice1 bleiben)

Wenn Barcode ascii20 schickt - bekomm ich per Postmessage 2 Meldungen (keyup wird ja geschluckt)
  • ascii 84 wurde gedrückt
  • ascii 17 wurde gedrückt

Mein "alter" Keyhook machte das nicht

Der neue ist auf Lazarus (wegen 32 und 64 Bit) geschrieben...

und siehe da - ich schaffs nicht, das ascii20 zeichen zu empfangen ...




schöne Grüße
Erich



Der "alte" Keyhook alá Delphi7:

Delphi-Quellcode:
library Versatile;

uses
  Windows,
  Messages,
  SysUtils;

type
  PHookRec = ^THookRec;
  THookRec = record
    AppHnd: Integer;
    MemoHnd: Integer;
  end;

var
  Hooked: Boolean;
  hKeyHook, hMemo, hMemFile, hApp: HWND;
  PHookRec1: PHookRec;




function KeyHookFunc(Code, VirtualKey, KeyStroke: Integer): LRESULT; stdcall;
var
  KeyState1: TKeyBoardState;
  AryChar: array[0..1] of Char;
  Count: Integer;
begin
  Result := 0;

  if Code = HC_NOREMOVE then Exit;
  Result := CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke);
  if Code < 0 then Exit;

  if Code = HC_ACTION then
  begin

    if ((KeyStroke and (1 shl 30)) <> 0) then
      if not IsWindow(hMemo) then
      begin
        hMemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'Versatile_mapping');
        PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
        if PHookRec1 <> nil then
        begin
          hMemo := PHookRec1.MemoHnd;
          hApp := PHookRec1.AppHnd;
        end;
      end;

    


    if ((KeyStroke and (1 shl 30)) <> 0) then
    begin
      GetKeyboardState(KeyState1);
      Count := ToAscii(VirtualKey, KeyStroke, KeyState1, AryChar, 0);

      if VirtualKey = VK_F4 then
      begin
        PostMessage(hApp, WM_USER + 8765, 300 , 0);
      end;

      if Count = 1 then
      begin
         PostMessage(hApp, WM_USER + 8765, Ord(AryChar[0]), 0);
      end;
    end;
  end;

  // ........

end; // procedure




function StartHook(MemoHandle, AppHandle: HWND): Byte; export;
begin
  Result := 0;
  if Hooked then
  begin
    Result := 1;
    Exit;
  end;
  if not IsWindow(MemoHandle) then
  begin
    Result := 4;
    Exit;
  end;
  hKeyHook := SetWindowsHookEx(WH_KEYBOARD, KeyHookFunc, hInstance, 0);
  if hKeyHook > 0 then
  begin

    hMemFile := CreateFileMapping($FFFFFFFF, // $FFFFFFFF gets a page memory file
      nil, // no security attributes
      PAGE_READWRITE, // read/write access
      0, // size: high 32-bits
      SizeOf(THookRec), // size: low 32-bits
      //SizeOf(Integer),
      'Versatile_mapping'); // name of map object
    PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
    hMemo := MemoHandle;
    PHookRec1.MemoHnd := MemoHandle;
    hApp := AppHandle;
    PHookRec1.AppHnd := AppHandle;
    {set the Memo and App handles to the mapped file}
    Hooked := True;
  end
  else
    Result := 2;
end;



function StopHook: Boolean; export;
begin
  if PHookRec1 <> nil then
  begin
    UnmapViewOfFile(PHookRec1);
    CloseHandle(hMemFile);
    PHookRec1 := nil;
  end;
  if Hooked then
    Result := UnhookWindowsHookEx(hKeyHook)
  else
    Result := True;
  Hooked := False;
end;

procedure EntryProc(dwReason: DWORD);
begin
  if (dwReason = Dll_Process_Detach) then
  begin
    if PHookRec1 <> nil then
    begin
      UnmapViewOfFile(PHookRec1);
      CloseHandle(hMemFile);
    end;
    UnhookWindowsHookEx(hKeyHook);
  end;
end;

exports
  StartHook,
  StopHook;

begin
  PHookRec1 := nil;
  Hooked := False;
  hKeyHook := 0;
  hMemo := 0;
  DLLProc := @EntryProc;
  EntryProc(Dll_Process_Attach);
end.
Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

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

AW: Keyhook - wParam und lParam in ASCII umwandeln

  Alt 23. Jun 2010, 14:40
oh mann ... ich probier mal was ganz simples..

Da es sich nur um EAN13 Codes handelt, bekomm ich immer 12 Zahlen... charakteristisch für die Barcodescannereingabe ist die "Eingabezeit" ....

So auf die Art:
Wenn die letzten 12 Eingaben reine Zahlenwerte waren und diese Eingabe unter einer Sekunde erfolgte - dann ist es wahrscheinlich ein Barcode....

So könnte ich auf das Initialisierungszeichen ascii20 komplett versichten


Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

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

AW: Keyhook - wParam und lParam in ASCII umwandeln

  Alt 23. Jun 2010, 15:39
OK .. Test funktioniert ..

Delphi-Quellcode:
function mylength(s: String): Integer;
var
  len: Integer;
begin
  len := 1;
  while s[len] <> #0 do
    inc(len);
  result := len-1;
end;
Delphi-Quellcode:
var
    zeit1,zeit2,zeit3,zeit4,zeit5,zeit6,zeit7,zeit8,zeit9,zeit10,zeit11,zeit12 :TTime;
    barcodestring :String;
    barcodelaenge :Integer;
    hilfestring :String;
Delphi-Quellcode:
procedure TVersatile_main_handle.DllMessage(var Msg: TMessage);
begin

//*********************************************************
//*********************************************************
//********************* Barcodesachen..... **********
//*********************************************************
//*********************************************************

if (Msg.wParam >47) AND (Msg.wParam <58) then
begin
//das Ding ist eine Zahl

            zeit12 :=zeit11;
            zeit11 :=zeit10;
            zeit10 :=zeit9;
            zeit9 :=zeit8;
            zeit8 :=zeit7;
            zeit7 :=zeit6;
            zeit6 :=zeit5;
            zeit5 :=zeit4;
            zeit4 :=zeit3;
            zeit3 :=zeit2;
            zeit2 :=zeit1;
            zeit1 :=now;

     barcodestring:=barcodestring+char(Msg.wParam);

     if mylength(barcodestring) > 12 then
     begin
     hilfestring:=copy(barcodestring,2,12); {-->}  barcodestring:= hilfestring;
     end;
memo1.Lines.Append('barcodestring= '+barcodestring);
     if mylength(barcodestring) = 12 then
     begin
     // ich hab eine Anzahl von 12 Zahlen gesammelt
         if zeit1-zeit12 <3 then
         begin
         memo1.Lines.Append('***** Barcode : '+barcodestring);
         barcodestring:='';
         end;

     end;


end
else
begin
//das Ding ist KEINE Zahl
     barcodestring:='';
end;
Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Keyhook - wParam und lParam in ASCII umwandeln

  Alt 23. Jun 2010, 17:07
Du hast jetzt 99 Beiträge und ich dachte eigentlich da weiß man dann inzwischen das pushen innerhalb von 24 Stunden in der DP nicht erwünscht ist. Bitte unterlasse das zukünftig und verwende den "bearbeiten"-Button

Warum merkst du dir eigentlich 12 Zeiten? merke dir doch einfach nur eine Zeit bei Eintreffen des ersten Zeichens und wenn du das letzte Zeiten empfangen hast kannst du diese eine Zeit mit der aktuellen Zeit vergleichen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's

Geändert von SirThornberry (23. Jun 2010 um 17:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz