如何通过Windows钩子捕获WM_KEYDOWN事件?

时间:2016-12-06 03:00:55

标签: delphi keyboard-hook

我想更改一个旧的键盘钩子代码,以支持unicode字符(旧代码是ascii),在这一刻我很难捕获WM_KEYDOWN事件。

我的实际代码如下:

var
  Form1: TForm1;
   HookHandle: hHook;
   ft: text;

implementation

{$R *.dfm}

function KBHookProc(Code: Integer; WParam: WParam; LParam: LParam)
  : LRESULT; stdcall;
var
  _Msg: TMessage;
  VK: Integer;
  SC: Integer;
  buf: Char;
  KS: TKeyboardState;
  MyHKB: HKL;
begin
  if Code = HC_ACTION then
  begin
 if _Msg.Msg = WM_KEYDOWN then
  begin
    VK := _Msg.WPARAM;
    MyHKB := GetKeyboardLayout(_Msg.LParam);
    SC := MapVirtualKeyEx(VK, MAPVK_VK_TO_VSC, MyHKB);
    GetKeyboardState(KS);
    ToUnicodeEx(VK, SC, KS, @buf, sizeof(buf), 0, MyHKB);

         append(ft);

             write(ft,buf);
           closefile(ft);
         MyHKB := 0;
    end;
  end;
  Result := CallNextHookEx(HookHandle, Code, WParam, LParam);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  assignfile(ft,'log.txt');
    rewrite(ft);
    closefile(ft);

  HookHandle := SetWindowsHookEx(WH_JOURNALRECORD , @KBHookProc, hinstance, 0);
end;

编辑1:

下面的代码是成功捕获WM_KEYDOWN,但没有写入文件:-(。

有什么建议吗?

var
  Form1: TForm1;
   HookHandle: hHook;
   ft: text;

implementation

{$R *.dfm}

function LowLevelKeyboardProc(nCode: Integer; wParam: wParam;
    lParam: lParam): LRESULT; stdcall;
  var
  _Msg: TMessage;
  VK: Integer;
  SC: Integer;
  buf: Char;
  KS: TKeyboardState;
  MyHKB: HKL;
begin
  if (nCode >= 0) and (wParam = WM_KEYDOWN) then
  begin
    VK := _Msg.WParam;
    MyHKB := GetKeyboardLayout(_Msg.LParam);
    SC := MapVirtualKeyEx(VK, MAPVK_VK_TO_VSC, MyHKB);
    GetKeyboardState(KS);
    ToUnicodeEx(VK, SC, KS, @buf, sizeof(buf), 0, MyHKB);

         append(ft);

             write(ft,buf);
           closefile(ft);
         MyHKB := 0;
  end;
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;

function InstallHook: Boolean;
begin
  Result := False;
  if HookHandle = 0 then
  begin
    HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
    Result := HookHandle <> 0;
  end;
end;

function UninstallHook: Boolean;
begin
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  assignfile(ft,'log.txt');
    rewrite(ft);
    closefile(ft);

   InstallHook;
end;

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

0 个答案:

没有答案