Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1267348
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2008-11-27 21:17:38



unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
          Edit1:   TEdit;  
          ButtonHook:   TButton;  
          ButtonUnhook:   TButton;  
          Label1:   TLabel;  
          Memo1:   TMemo;  
          procedure   ButtonHookClick(Sender:   TObject);  
          procedure   ButtonUnhookClick(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
      hookHandle:   HHook;  
   
  function   KeyboardCallback(code,   wParam,   lParam:   Integer):   HRESULT;   stdcall;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.ButtonHookClick(Sender:   TObject);  
  var  
      threadId:   Integer;  
  begin  
      threadId   :=   StrToInt(edit1.Text);  
      hookHandle   :=   SetWindowsHookEx(WH_KEYBOARD,   @KeyboardCallback,   HInstance,   threadId);  
      if   (hookHandle   =   0)   then  
          ShowMessage('hook   error');  
  end;  
   
  procedure   TForm1.ButtonUnhookClick(Sender:   TObject);  
  begin  
      if   (hookHandle   <>   0)   then   begin  
          UnhookWindowsHookEx(hookHandle);  
          hookHandle   :=   0;  
      end;  
  end;  
   
  function   KeyboardCallback(code,   wParam,   lParam:   Integer):   HRESULT;   stdcall;  
  begin  
      if   wParam   =   WM_KEYDOWN   then   begin  
          if   lParam   =   VK_F1   then   begin  
              Form1.Memo1.Text   :=   'okokok';  
          end;  
      end;  
      Result   :=   CallNextHookEx(hookHandle,   code,   wParam,   lParam);  
  end;  
   
  end.  
  =====================  
  以上是我得代码,晕死,搞了1天没搞明白,进行了HOOK之后在被HOOK窗体按F1就提示程序错误。哪位高手给个代码呀?

我不想搞出个DLL得方法,想使用一个文件。

不用DLL要钩住其他程序的按键,只能用日志钩子。  
  具体用法请看这里:  
  blog.csdn.net/linzhengqun  
  找钩子及其应用。

hookHandle   :=   SetWindowsHookEx(WH_KEYBOARD,   @KeyboardCallback,   HInstance,   threadId);  
  这一行代码,用了HInstance,后面一个参数就要设置为0   ,如果后面一个参数设置为险程ID,那么前一个参数就要设置成0  
   
  下面是正确的  
  hookHandle   :=   SetWindowsHookEx(WH_KEYBOARD,   @KeyboardCallback,   0,   GetCurrentThreadID);  
  hookHandle   :=   SetWindowsHookEx(WH_KEYBOARD,   @KeyboardCallback,   HInstance,   0);

上面的可能还有点不清楚,帮助里面是这么说的  
  hMod  
   
  Identifies   the   DLL   containing   the   hook   procedure   pointed   to   by   the   lpfn   parameter.   The   hMod   parameter   must   be   set   to   NULL   if   the   dwThreadId   parameter   specifies   a   thread   created   by   the   current   process   and   if   the   hook   procedure   is   within   the   code   associated   with   the   current   process.    
   
  dwThreadId  
   
  Specifies   the   identifier   of   the   thread   with   which   the   hook   procedure   is   to   be   associated.   If   this   parameter   is   zero,   the   hook   procedure   is   associated   with   all   existing   threads.

阅读(465) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~