Hook nie działa

0

Dlaczego mi ten kod nie działa tzn. nieprzechwytywane są naciskane klawisze. Delphi 7 i Windows 7.

 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Stdctrls, ComCtrls, Buttons;

type
  TForm1 = class(TForm)
    Memo: TMemo;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
MainHook:HHook;
  lpWnd:PCHar;

function KH(Code:integer; wParam: WPARAM; lParam:LPARAM):Longint ; stdcall;
var
Buffer:TEventMsg;
Wnd: array[0..255] of char;
procedure TK(Key:Byte);
begin
with Form1 do                    
begin
case Key of
13: Memo.Lines.Add('');
8: Memo.Lines.Add('[BCKSPC]');
27: Memo.Lines.Add('[esc]');
else Memo.Text := Memo.Text+ Chr(Key);
end; end end;

begin
  Result := 0;
  Buffer := PEventMsg(lParam)^;
  if Buffer.message = WM_KEYDOWN then
  begin
    GetWindowText(Buffer.hwnd,Wnd, SizeOf(Wnd));
    if Wnd<>lpWnd then
    begin
    lpWnd := Wnd;
    Form1.Memo.Clear;
  end;
  TK(Buffer.paramL);
  end
end;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MainHook := SetWindowsHookEx(WH_JOURNALPLAYBACK,KH,HInstance,0);
  if (MainHook = NULL) then
  raise Exception.Create('HOOK ERROR!'); 
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnhookWindowsHookEx(MainHook);
end;

end.
0

Przenalizuj sobie ten kod: http://www.speedyshare.com/files/25097172/catch_keys.zip i z tego co wiem
to znajomuy testował pod Windows 7 i działa. Pisałem go po to żeby starsza wesja WinAmpa 5.35 w taki
sposób jak chcę obslugiwała moją klawiaturę multimedialną. Bo nowsze wersje WinAmpa robią to - imo,
do d**y, no więc napisałem sobie własny Plugin, który zakłada Hooka na klawiaturę. A znajomy podał mi
z pod Windows 7 jakie dokładnie kody mają jego klawisze. Różnią się tylko wartością Flags, a vkCode z
tego co się orientuję, w większości klawiatur multimiedialnych, jest identyczne dla pewnych klawiszy.

0

A jak przerobić ten kod aby mi wyłapywał tylko kod naciśniętego klawisza a nie wszystkie stany (press,up, itp.).
Chcę tylko poznać naciskane klawisze. I dlaczego nie wyświetla dobrze znaków specjalnych? np [

 unit nain;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls,
  XPMan;

type
  TMainForm = class(TForm)
    TestMemo : TMemo;
    Button1 : TButton;
    XPManifest1: TXPManifest;
    procedure FormCreate(Sender : TObject);
    procedure Button1Click(Sender : TObject);
    procedure FormClose(Sender : TObject; var Action : TCloseAction);
  private
  public
  end;

var
  MainForm : TMainForm;

const
  WH_KEYBOARD_LL = $000D;
  LLKHF_EXTENDED = $0001;
  LLKHF_INJECTED = $0010;
  LLKHF_ALTDOWN = $0020;
  LLKHF_UP = $0080;

type
  tagKBDLLHOOKSTRUCT = packed record
    vkCode : DWord;
    ScanCode : DWord;
    Flags : DWord;
    Time : DWord;
    dwExtraInfo : integer;
  end;
  KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;

var
  HKHook : HHook;

implementation

{$R *.dfm}

function LowLevelKeyboardProc(nCode : Integer; wParam : Integer; lParam : Integer) : Integer; stdcall; export;
var
  Hook : PKBDLLHOOKSTRUCT;
begin
  Hook := Pointer(lParam);
      begin
        MainForm.TestMemo.Lines.Add(Format('KOD: %d | CHAR: %s |%d',
          [Hook.vkCode, chr(Hook.vkCode), hook.ScanCode]));
      end;
 // end;
  Result := CallNextHookEx(HKHook, nCode, wParam, lParam);
end;

procedure HookIt;   
begin
  HKHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0);
end;

procedure UnHookIt;
begin
  UnHookWindowsHookEx(HKHook);
end;

procedure TMainForm.FormCreate(Sender : TObject);
begin
  Hookit;
end;

procedure TMainForm.FormClose(Sender : TObject; var Action : TCloseAction);
begin
  UnHookIt;
end;

procedure TMainForm.Button1Click(Sender : TObject);
begin
  TestMemo.Clear;
end;

end.
0

Jak Flags wynosi 128 to znaczy że klawisz jest puszczony, o ile dobrze kojarzę.
Dostosuj sobie kod jak chcesz, ja tylko podałem przykład. Calego programu nie
mam zamiaru za Ciebie pisać. Skończylo się, bo by mnie haterzy zabili tutaj :P
A i wiadomo, że "[" nie wychwyci Tobie, bo najpierw wciskasz shift. A jeżeli jak
podejrzewam chcesz zrobić KeyLoggera to na sieci można znaleźć działający też
pod Windosem XP i być może pod nowszymi komponent w odpowiedniej wersji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1