键盘钩子(HOOK),以前的帖子太多了,去翻一下吧。

解决方案 »

  1.   

    键盘钩子(HOOK),以前的帖子太多了,去翻一下吧。
      

  2.   

    初次学习,找不着门路,没找到一个完整的例子,谁能给个完整的代码,让我先有个感性认识。
    [email protected]
      

  3.   

    给你个BCB的程序,如何?
    Hook程序一般分两部份,Hook是一个dll,app负责调用和解除Hook.
      

  4.   

    在下面的LowLevelKeyboardProc里处理
    下面是一个拦截VK_Escape的unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;{按键消息的结构,Delphi中也没有,自己定义吧。这也就我为什么说用C写
    这样的程序更好的原因之一。还必须注意的是这个结构在Windows NT 4 sp3以上系统
    中才能使用}
    tagKBDLLHOOKSTRUCT = packed record
      vkCode: DWORD;//虚拟键值
      scanCode: DWORD;//扫描码值(没有用过,我也不懂^_^)
      {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
      根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}
      flags: DWORD;
      time: DWORD;//消息时间戳
      dwExtraInfo: DWORD;//和消息相关的扩展信息
    end;
      KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
      PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
    const WH_KEYBOARD_LL = 13;
    //定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
    const LLKHF_ALTDOWN = $20;var
      Form1: TForm1;
      hhkLowLevelKybd: HHOOK;
    implementation
    {
    功能:低级键盘钩子的回调函数,在里面过滤消息
    参数:nCode   是Hook的标志
           WParam  表示消息的类型
           LParam  是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针
    返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。
    }
    function LowLevelKeyboardProc(nCode: Integer;
      WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
    var
      fEatKeystroke: BOOL;
      p: PKBDLLHOOKSTRUCT;
    begin
      Result := 0;
      fEatKeystroke := FALSE;
      p := PKBDLLHOOKSTRUCT (lParam);
      //nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息
      if (nCode = HC_ACTION) then
      begin
      //拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。
        case wParam of
          WM_KEYDOWN,
          WM_SYSKEYDOWN,
          WM_KEYUP,
          WM_SYSKEYUP:
          begin
            fEatKeystroke :=
              (p.vkCode = vk_escape);
            if fEatKeystroke then
            begin
              //dosomething
            end;
          end;
        end;
      end;  if fEatKeystroke = True then
        Result := 1;
      if nCode <> 0 then
         Result := CallNextHookEx(0, nCode, wParam, lParam);end;
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      //设置低级键盘钩子
      hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
        LowLevelKeyboardProc, Hinstance, 0);
      if hhkLowLevelKybd <> 0 then
        MessageBox(0, '低级键盘钩子设置成功!', '提示', MB_OK);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      //卸载低级键盘钩子
      if hhkLowLevelKybd <> 0 then
      begin
        UnhookWindowsHookEx(hhkLowLevelKybd);
        MessageBox(0, '低级键盘钩子卸载成功!', '提示', MB_OK);
      end;
    end;end.