C
chy578
Unregistered / Unconfirmed
GUEST, unregistred user!
HOOK彻底研究中的问题。(菜鸟高手都请进)
HOOK己不是什么新技术了,但也是SDK编程中的一个重要技术。对于HOOK我也
是个新手,本人使用DFW全文检索找到了不少文章,但是有些问题还是不得其解。
看帮助我的英文又不好只能看个大概。
还有以下问题:
问题1,怎样才能使HOOK永远的挂上,就是加载HOOK的进程关了,也能挂上?
其它问题在代码中。。。。。。我会按回答的问题给分
以下是来自beta的HOOK制做流程: 其中问题用 {_ ** _} 表示。
1. 将以下的文字剪贴存成 HKTest.DPR
--- Cut Here ---
library HKTest;
uses
HKProc in 'HKProc.pas';
exports
EnableHotKeyHook,
DisableHotKeyHook;
begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
--- Cut Here ---
2. 将以下的文字剪贴存成 HKProc.PAS
(Note: HKTest.DPR 与 HKProc.PAS 建议储存在同一个目录)
--- Cut Here ---
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;
{__问题2________________________________________________________________________}
{_*** 问题2.这个iCode是什么?
我看MSDN上说好像是iCode<0 就必须 CallNextHookEx()这是为什么呢?** _}
If iCode < 0 Then
begin
{__问题3_________________________________________________________________________}
{_ *** 问题3.陈宽达的书上说以下的hNextHookProc要通过共享内存等方法才能得到,
但这个程序就这样也能够运行HOOK,他说错了吗? 还是有别的我不知道 *** _}
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
// 侦测 Ctrl + B 组合键
if ((lParam and _KeyPressMask) = 0) and
(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 呼叫链结断掉
{_____问题4_______________________________________________________________________}
{_*** 问题4 书上说hNextHookProc不是每一次都能得到正确的结果,
是为什么呢? 怎么解决? *** _}
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,
{_______问题5_____________________________________________________________________}
HInstance, {_<--问题5.这个参数好像没用,都照着写就行了吗?_}
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.
--- Cut Here ---
3. 启动 Delphi 2.0
4. 开启 HKTest.DPR, 然後 Project | Build All 以产生 HKTest.DLL
5. File | New Application 开启一个新的专案
6. 将此专案 unit1 与 project1 存档, 请注意: 请存到与 HKTest.DLL
相同的目录中.
7. 在 Form1 上安置二个 TButton, 并撰写 OnClick 程式, 同时,
在 implementation 节中宣告 EnableHotKeyHook() 与
DisableHotKeyHook(), 修改後的程式应类似:
...
...
implementation
{$R *.DFM}
function EnableHotKeyHook: BOOL; external 'HKTEST.DLL';
function DisableHotKeyHook: BOOL; external 'HKTEST.DLL';
procedure TForm1.Button1Click(Sender: TObject);
begin
if EnableHotKeyHook then
ShowMessage('HotKey Testing...');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if DisableHotKeyHook then
ShowMessage('HotKey Testing..., DONE!!');
end;
end.
8. 专案再存档一次, 执行.
OK! 执行後, 滑鼠点一下 Button1, 然後, 不管 form1 在不在前景, 极小化
也可以, 按下 Ctrl + B 这个组合键, 记事本就启动了.
HOOK己不是什么新技术了,但也是SDK编程中的一个重要技术。对于HOOK我也
是个新手,本人使用DFW全文检索找到了不少文章,但是有些问题还是不得其解。
看帮助我的英文又不好只能看个大概。
还有以下问题:
问题1,怎样才能使HOOK永远的挂上,就是加载HOOK的进程关了,也能挂上?
其它问题在代码中。。。。。。我会按回答的问题给分
以下是来自beta的HOOK制做流程: 其中问题用 {_ ** _} 表示。
1. 将以下的文字剪贴存成 HKTest.DPR
--- Cut Here ---
library HKTest;
uses
HKProc in 'HKProc.pas';
exports
EnableHotKeyHook,
DisableHotKeyHook;
begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
--- Cut Here ---
2. 将以下的文字剪贴存成 HKProc.PAS
(Note: HKTest.DPR 与 HKProc.PAS 建议储存在同一个目录)
--- Cut Here ---
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;
{__问题2________________________________________________________________________}
{_*** 问题2.这个iCode是什么?
我看MSDN上说好像是iCode<0 就必须 CallNextHookEx()这是为什么呢?** _}
If iCode < 0 Then
begin
{__问题3_________________________________________________________________________}
{_ *** 问题3.陈宽达的书上说以下的hNextHookProc要通过共享内存等方法才能得到,
但这个程序就这样也能够运行HOOK,他说错了吗? 还是有别的我不知道 *** _}
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
// 侦测 Ctrl + B 组合键
if ((lParam and _KeyPressMask) = 0) and
(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 呼叫链结断掉
{_____问题4_______________________________________________________________________}
{_*** 问题4 书上说hNextHookProc不是每一次都能得到正确的结果,
是为什么呢? 怎么解决? *** _}
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,
{_______问题5_____________________________________________________________________}
HInstance, {_<--问题5.这个参数好像没用,都照着写就行了吗?_}
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.
--- Cut Here ---
3. 启动 Delphi 2.0
4. 开启 HKTest.DPR, 然後 Project | Build All 以产生 HKTest.DLL
5. File | New Application 开启一个新的专案
6. 将此专案 unit1 与 project1 存档, 请注意: 请存到与 HKTest.DLL
相同的目录中.
7. 在 Form1 上安置二个 TButton, 并撰写 OnClick 程式, 同时,
在 implementation 节中宣告 EnableHotKeyHook() 与
DisableHotKeyHook(), 修改後的程式应类似:
...
...
implementation
{$R *.DFM}
function EnableHotKeyHook: BOOL; external 'HKTEST.DLL';
function DisableHotKeyHook: BOOL; external 'HKTEST.DLL';
procedure TForm1.Button1Click(Sender: TObject);
begin
if EnableHotKeyHook then
ShowMessage('HotKey Testing...');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if DisableHotKeyHook then
ShowMessage('HotKey Testing..., DONE!!');
end;
end.
8. 专案再存档一次, 执行.
OK! 执行後, 滑鼠点一下 Button1, 然後, 不管 form1 在不在前景, 极小化
也可以, 按下 Ctrl + B 这个组合键, 记事本就启动了.