DELPHI使用键盘钩子

小读了一下《Delphi下深入Windows核心编程》感觉里面的东西写得还算可以,至少有学到东西

于是整理了一下书中的代码,并加上注注释发上来

首先是最重要的键盘钩子使用的DLL:

 

  1. unit UnitDll;  
  2.   
  3. interface  
  4.   
  5. uses Windows;  
  6.   
  7. const BUFFER_SIZE = 16 * 1024// 文件映射到内存的大小  
  8. const HOOK_MEM_FILENAME = 'MEM_FILE'// 映像文件名  
  9. const HOOK_MUTEX_NAME = 'MUTEX_NAME'// 互斥名  
  10.   
  11. type  
  12.   // 共享结构  
  13.   TShared = record  
  14.     Keys: array[0..BUFFER_SIZE] of Char;  
  15.     KeyCount: Integer;  
  16.   end;  
  17.   // 共享结构指针  
  18.   PShared = ^TShared;  
  19.   
  20. var  
  21.   MemFile, HookMutex: THandle;  // 文件句柄和互斥句柄  
  22.   hOldKeyHook: HHook; // 钩子变量  
  23.   Shared: PShared; // 共享变量  
  24.   
  25. implementation  
  26.   
  27. // 重要:键盘钩子回调  
  28. function KeyHookProc(iCode: Integer; wParam: WPARAM;  
  29.   lParam: LPARAM): LRESULT; stdcall; export;  
  30. const  
  31.   KeyPressMask = $80000000;  
  32. begin  
  33.   if iCode < 0 then  
  34.     Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam)  
  35.   else  
  36.   begin  
  37.     if ((lParam and KeyPressMask) = 0then  
  38.     begin  
  39.       // 键盘消息捕获  
  40.       Shared^.Keys[Shared^.KeyCount] := Char(wParam and $00FF);  
  41.       Inc(Shared^.KeyCount);  
  42.       // 超出内存限定大小则重置  
  43.       if Shared^.KeyCount >= BUFFER_SIZE - 1 then  
  44.         Shared^.KeyCount := 0;  
  45.     end;  
  46.     result:=0;  
  47.   end;  
  48. end;  
  49.   
  50. // 安装钩子  
  51. function EnableKeyHook: BOOL; export;       
  52. begin  
  53.   Shared^.KeyCount := 0;  
  54.   if hOldKeyHook = 0 then  
  55.   begin  
  56.     // 设置钩子过滤  
  57.     {WH_KEYBOARD: 安装的是键盘钩子 KeyHookProc: 消息回调, HInstance: 回调函数实例 线程ID}  
  58.     hOldKeyHook := SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, HInstance, 0);  
  59.   end;  
  60.   Result := (hOldKeyHook <> 0);  
  61. end;  
  62.   
  63. {撤消钩子过滤函数}  
  64. function DisableKeyHook: BOOL; export;  
  65. begin  
  66.   if hOldKeyHook <> 0 then  
  67.   begin  
  68.     UnHookWindowsHookEx(hOldKeyHook);  
  69.     hOldKeyHook := 0;  
  70.     Shared^.KeyCount := 0;  
  71.   end;  
  72.   Result := (hOldKeyHook = 0);  
  73. end;  
  74.   
  75.   
  76. // 得到获得多少按键  
  77. function GetKeyCount: Integer; export;  
  78. begin  
  79.   Result := Shared^.KeyCount;  
  80. end;  
  81.   
  82. // 得到第I个按键  
  83. function GetKey(index: Integer): Char; export;  
  84. begin  
  85.   Result := Shared^.Keys[index];  
  86. end;  
  87.   
  88. // 清空按键  
  89. procedure ClearKeyString; export;  
  90. begin  
  91.   Shared^.KeyCount := 0;  
  92. end;  
  93.   
  94. // 导出函数列表  
  95. exports  
  96.   EnableKeyHook,  
  97.   DisableKeyHook,  
  98.   GetKeyCount,  
  99.   ClearKeyString,  
  100.   GetKey;  
  101.   
  102. initialization  
  103.   // 创建互斥变量,DLL只能有一个进程可以使用  
  104.   HookMutex := CreateMutex(nil, True, HOOK_MUTEX_NAME);  
  105.   // 打开文件映像  
  106.   MemFile := OpenFileMapping(FILE_MAP_WRITE, False, HOOK_MEM_FILENAME);  
  107.   // 如果不存在该文件映像则创建  
  108.   if MemFile = 0 then  
  109.     MemFile := CreateFileMapping($FFFFFFFFnil, PAGE_READWRITE, 0, SizeOf(TShared), HOOK_MEM_FILENAME);  
  110.   // 文件映射内存  
  111.   Shared := MapViewOfFile(MemFile, File_MAP_WRITE, 000);  
  112.   // 释放互斥变量  
  113.   ReleaseMutex(HookMutex);  
  114.   // 关闭互斥句柄  
  115.   CloseHandle(HookMutex);  
  116.   
  117. finalization  
  118.   // 撤消钩子过滤  
  119.   if hOldKeyHook <> 0 then  
  120.     DisableKeyHook;  
  121.   // 释放映射  
  122.   UnMapViewOfFile(Shared);  
  123.   // 关闭映像文件  
  124.   CloseHandle(MemFile);  
  125. end.  

 

这个看懂了之后就可以直接写个CLIENT调用了

 

  1. unit Unit2;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
  7.   StdCtrls, ExtCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Memo1: TMemo;  
  12.     bSetHook: TButton;  
  13.     bCancelHook: TButton;  
  14.     bReadKeys: TButton;  
  15.     bClearKeys: TButton;  
  16.     Panel2: TPanel;  
  17.     procedure bSetHookClick(Sender: TObject);  
  18.     procedure bCancelHookClick(Sender: TObject);  
  19.     procedure bReadKeysClick(Sender: TObject);  
  20.     procedure bClearKeysClick(Sender: TObject);  
  21.   end;  
  22.   
  23. var  
  24.   Form1: TForm1;  
  25.   
  26.   
  27. implementation  
  28.   
  29. {$R *.DFM}  
  30. function EnableKeyHook: BOOL; external 'KEYHOOK.DLL';  
  31. function DisableKeyHook: BOOL; external 'KEYHOOK.DLL';  
  32. function GetKeyCount: Integer; external 'KEYHOOK.DLL';  
  33. function GetKey(idx: Integer): Char; external 'KEYHOOK.DLL';  
  34. procedure ClearKeyString; external 'KEYHOOK.DLL';  
  35.   
  36. procedure TForm1.bSetHookClick(Sender: TObject);  
  37. begin  
  38.   EnableKeyHook;  
  39.   bSetHook.Enabled := False;  
  40.   bCancelHook.Enabled := True;  
  41.   bReadKeys.Enabled := True;  
  42.   bClearKeys.Enabled := True;  
  43.   Panel2.Caption := ' 键盘钩子已经设置';  
  44. end;  
  45.   
  46. procedure TForm1.bCancelHookClick(Sender: TObject);  
  47. begin  
  48.   DisableKeyHook;  
  49.   bSetHook.Enabled := True;  
  50.   bCancelHook.Enabled := False;  
  51.   bReadKeys.Enabled := False;  
  52.   bClearKeys.Enabled := False;  
  53.   Panel2.Caption := ' 键盘钩子没有设置';  
  54. end;  
  55.   
  56. procedure TForm1.bReadKeysClick(Sender: TObject);  
  57. var  
  58.    i: Integer;  
  59. begin  
  60.   Memo1.Lines.Clear;{在Memo1中显示击键历史记录}  
  61.   for i := 0 to GetKeyCount - 1 do  
  62.     Memo1.Text := Memo1.Text + GetKey(i);  
  63.   
  64. end;  
  65.   
  66. procedure TForm1.bClearKeysClick(Sender: TObject);  
  67. begin  
  68.   Memo1.Clear;  
  69.   ClearKeyString;  
  70. end;  
  71.   
  72. end.  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单的低级钩子做的应用实例,实现了开机自动启动功能,程序启动后在后台运行,等待本地QQ启动后,开启钩子,记录键盘输入的字符,并保存在D:盘目录下的指定名文档中。关闭QQ时,钩子自动卸载并结束进程。 但是由于是使用键盘钩子,所以只能简单的抓取键盘所键入的内容,如果是汉字的话则无法显示。 由于使用Hook技术,并对注册表进行了修改,使用前请关闭360等防火墙软件,并使用管理员模式运行。 一次执行后,之后再次开机时,该程序会自动启动。 程序尚有缺陷,如内存泄漏,究其原因是CString应用在多线程中导致,但至今未查到根源所在,希望大神指教,学生不胜感激! 也希望各位多提出宝贵意见,或对本程序进行开发改造。 个人暂时希望改造的几个方面: 1.首先是希望能够屏蔽掉360等防火墙的检查。更深层次的改造,希望能够主动杀死360等防火墙的进程。 2.其次是希望能够做成主辅进程相互监视的模式,主进程down掉后,辅进程自动能把主进程启动,辅助进程down掉后,主进程能把辅进程自动启动。 3.其次是希望能够做成真正的隐藏进程的风格,就是能够在任务管理器中隐藏掉进程,其实可以做成服务,但是更希望能够以进程的形式存在。 4.然后很重要的是,希望能够做成自动获取管理员权限的类型,这个一直很想做,但是小菜我水平有限,暂时未对应。 5.希望对应网络开发,现在用钩子钩下来的文字,暂时只是保存在本地的一个txt文件中,希望最终实现把抓下来的内容发送到指定邮箱这样的功能。 暂时就先想到这么多吧,希望大家多多提出宝贵意见。 (最终声明:本程序只限用于研究学习开发技术,不得用于研究学习以外的任何目的) 作者:Benjamin Wang 2013-12-02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值