用DELPHI编制Windows95下的钩子函数计算机等级考试

文章作者 100test 发表时间 2009:07:16 18:33:27
来源 100Test.Com百考试题网


  Windows消息管理机构提供了能使应用程序访问控制消息流μ\c4所谓的钩子(HOOK)机制。钩子有多种,分别用于捕获某一特定类型或某一范围的消息。如:键盘消息,鼠标消息等。我们这里仅以键盘钩子的使用为例,讨论在DELPHI下怎样编写DLL程序和怎样在自己的程序中安装使用键盘钩子函数,并讨论了不同程序使用同一DLL文件时怎样共享数据。
  一、 钩子过滤函数的编写说明
  由于钩子过滤函数必须在独立的模块中,也就是说我们必须首先生成一个DLL框架,然后再在其中加入钩子函数代码以及其他相关函数代码。我们这里以键盘钩子过滤函数的编写为例来说明。具体步骤如下:
  1、先生成一个DLL筐2架
  2、编写自己的键盘钩子过滤函数
  钩子过滤函数必须是回调函数,其函数的 4?形如下?o
  function KeyHookProc(
  iCode:Integer.
  wParam:WPARAM.
  lParam:LPARAM ) : LRESULT. stdcall .export .
  在生成的DLL框架中加入自己的键盘钩子处理函数处理键盘消息。
  代码如下:…
  if(iCode>.=0) then begin
  Result:=0. //初始化返回值
  // 在这里加入自己的代码
  end else
  begin
  Result:=CallNextHook(hOldKeyHook,iCode,wParam,lParam).
  // hOldKeyHook是保存的原键盘过滤函数 5刂?
  end.
  3、 安装键盘钩子过滤函数
  为安装一个钩子?_fd滤函数应调用SetWindowsHookEx函数(适用于Windows3.0的SetWindowsHook钩子安装函数现在已经废弃不用)。该函数的原形如下:
  HHOOK SetWindowsHookEx(
  int idHook,  // 安装的?_b3子类型
  HOOKPROC lpfn,  // 钩子过滤??f数地址
  HINSTANCE hMod,   // 任务句柄
  DWORD dwThreadId   // 钩子用于的目的
  ).
  需要说明的是:?_a8常应该调用MakeProcInstance函数以获取一个输出函数的前导码的入口地址,再将此地址作为 SetWindowsHookEx的第二个参数lpfn。但由于Delphi提供了\"灵巧调用(smart callback)\",使得MakeProcInstance可以省去,而直接将钩子过滤函数名用作入口地址。
  这样当应用程序?_c3GetMessage或PeekMessage函数从消息队列中读消息或有按键消息(WM_KEYDOWN或WM_KEYUP)要处理时,系统就要调用钩子过滤函数KeyHookProc处理键盘消息。
  4、 卸载钩子过滤函数。
  当钩子函数不再需要时,应调用UnHookWindowsHookProc卸载安装的钩子以释放系统资源。
  完整的程序清单如下?_ba
  Library KEYHOOK.
  uses Windows.
  const BUFFER_SIZE=16*1024.
  const HOOK_MEM_FILENAME=\SAMPLE KEY_HOOK_MEM_FILE\.
  const HOOK_MUTEX_NAME =\SAMPLE KEY_HOOK_MUTEX_NAME\.
  type
  TShared=record
  Keys : array[0..BUFFER_SIZE] of Char.
  KeyCount : Integer.
  end.
  PShared=^TShared.
  var
  MemFile,HookMutex : THandle.
  hOldKeyHook : HHook.
  ProcSaveExit : Pointer.
  Shared : PShared.
  //键盘钩子过滤函数
  function KeyHookProc(iCode: Integer. wParam: WPARAM . lParam: LPARAM):LRESULT
  . stdcall. export.
  const KeyPressMask = $80000000.
  begin
  if iCode <. 0 then
  Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam)
  else begin
  if ((lParam and KeyPressMask)= 0) then // 键按下
  begin
  Shared^.Keys[Shared^.KeyCount]:=Char(wParam and $00ff).
  Inc(Shared^.KeyCount).
  if Shared^.KeyCount>.=BUFFER_SIZE-1 then Shared^.KeyCount:=0.
  end.
  iCode:=-1.
  Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam).
  end.
  end.

相关文章


DELPHI的原子世界(2)计算机等级考试
DELPHI的原子世界(1)计算机等级考试
如何将界面代码和功能代码分离(基于Delphi_VCL)计算机等级考试
自制支持文件拖放的VCL组件计算机等级考试
用DELPHI编制Windows95下的钩子函数计算机等级考试
在Delphi的DBGrid中插入其他可视组件计算机等级考试
二级考试DELPHI辅导:特色按钮计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛