金笛工业手机论坛  

返回   金笛工业手机论坛 > 开发者乐园 > 短信开发资料

短信开发资料 短信开发技巧,代码分析

回复
 
LinkBack 主题工具 显示模式
旧 2009-10-09   #1 (permalink)
高级会员
 
注册日期: 2009-07-09
住址: 亦庄经济开发区2号院大族广场1502
帖子: 537
susu8988 正向着好的方向发展
默认 在DELPHI中HOOK程序的编写

在编写WINDOWS应用程序的时候,有时候我们希望所
编写的程序可以捕获用户的某一个特定的动作(比如是否
按下鼠标右键)。如果我们的程序处于系统前台,实现这
一功能并不复杂。但如果程序在后台运行或者程序不是当
前运行的进程的话,这一功能应该如何实现呢?答案就是H
OOK程序。

  ■ 使用DELPHI实现的HOOK程序

  DELPHI作为一种可视化的开发工具以其程序开发的短
周期和编译代码的高效率受到了广大程序人员的喜爱。一
般来说,编写HOOK程序应将hook procedures函数编写为D
LL,然后在主程序中调用。因此,编写HOOK程序需要调用
API函数并将其编译为DLL(动态连接库),这两点在DELP
HI中实现起来可以说是轻而易举。通过以下的小例子你可
以看到在DELPHI中实现HOOK程序是多么的简单。

  首先是DLL的源代码(我们假设需要捕捉CRTL+N这一
击键动作):

  选择FILE菜单中的NEW选项,选择产生一个新的DLL模
板,存为HKTEST.DPR library HKTest;

// WH_KEYBOARD Hook Demo
// 1. Project | Compile 编译连结成 HKTest.DLL
// 2. 开启 HookDemo.DPR 测试
library HKTest;

uses
HKProc in 'HKProc.pas';

exports
EnableHotKeyHook,
DisableHotKeyHook;

begin
hNextHookProc := 0;
// 以下这两列, 旨在确定 DLL UnLoad 时, 确定将 HOOK 解除
//To keep the exit chain intact,
// you need to save the current contents of ExitProc before
//changing it to the address of your own exit procedure.
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.

  以下是文件HKPROC.PAS的源码

unit HKProc;

interface

uses
Windows, Messages;

var
hNextHookProc: HHook;
procSaveExit: Pointer;


function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
function EnableHotKeyHook: BOOL; export;
function DisableHotKeyHook: BOOL; export;
procedure HotKeyHookExit; far;

implementation

function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
_KeyPressMask = $80000000;
begin
Result := 0;
If iCode < 0 Then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
// 侦测 Ctrl + B 组合键
if ((lParam and _KeyPressMask) = 0) and //(lparam and $80000000= 0) -->down <>0 --> up;
(GetKeyState(vk_control) <0) and (wParam = Ord('B')) then
begin
Result := 1;
WinExec('Notepad.exe', sw_Normal); // 记事本
end;
end;


function EnableHotKeyHook: BOOL; export;
begin
Result := False;
if hNextHookProc <> 0 then Exit;
// 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下
// 来, 免得 HOOK 呼叫链结断掉
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,
HInstance,
0);
Result := hNextHookProc <> 0;
end;


function DisableHotKeyHook: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
MessageBeep(0);
MessageBeep(0);
end;
Result := hNextHookProc = 0;
end;


procedure HotKeyHookExit;
begin
// 如果忘了解除 HOOK, 自动代理解除的动作
if hNextHookProc <> 0 then DisableHotKeyHook;
ExitProc := procSaveExit;
end;

end.

  该程序在编译以后会产生一个名为HKTEST.dll的文件
,在程序中调用该DLL的方法非常的简单,只需声明DLL中
的两个函数:

  function EnableHotKeyHook: BOOL; external ′HK
TEST.DLL′;

  function DisableHotKeyHook: BOOL; external ′H
KTEST.DLL′;

  然后就可以在程序中使用EnableHotKeyHook函数来使
HOOK有效,使用DisableHotKeyHook来关闭HOOK。在程序
运行中当HOOK程序运行时,你会看到无论程序当前是否在
前台,只要你按下CRTL+N,系统就会启动一个记事本的进
程。

  有一点应当注意的是:因为HOOK程序增加了系统处理
每一条消息的工作量,它的运行有可能会降低系统的运行
效率,所以在不需要的时候一定要将HOOK程序关闭。
__________________
地址:北京亦庄经济技术开发区荣华南路10号院5号楼705

电话:010-82356575/76/77转6070 联系人:苏秋英

手机微信同号:13811870548 QQ: 1170923055
susu8988 当前离线   回复时引用此帖
回复

书签


当前查看此主题的会员: 1 (0 位会员和 1 位游客)
 

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为北京时间。现在的时间是 06:43


Powered by vBulletin® 版本 3.8.3
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.