关于hook?(100分)

  • 主题发起人 主题发起人 lizheng
  • 开始时间 开始时间
L

lizheng

Unregistered / Unconfirmed
GUEST, unregistred user!
var
HookForm: THookForm;
hNextHookProc: HHook;
procSaveExit: Pointer;

implementation

{$R *.DFM}

function KeyboardHookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
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;
HookForm.Visible := True;
~~~~~~~~~~~~~~~~~~~~~~~~~`只要执行就出错,不知原因?
HookForm.BringToFront;
end;
end;

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

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

procedure THookForm.FormDestroy(Sender: TObject);
begin
// 如果忘了解除 HOOK, 自动代理解除的动作
if hNextHookProc <> 0 then DisableHotKeyHook;
ExitProc := procSaveExit;
end;

procedure THookForm.SetHookBtnClick(Sender: TObject);
begin
if EnableHotKeyHook then
begin
ShowMessage('Keyboard Hook 启动, 按下 Ctrl + B 将叫出「记事本」');
Visible := False;
end;
end;

procedure THookForm.Button2Click(Sender: TObject);
begin
if DisableHotKeyHook then
ShowMessage('Keyboard Hook 已解除!');
end;

end.
 
为什么没人理我,五五
 
Delphi做钩子好象是有一些问题,具体原因不太清楚
 
你的hookform做在了dll中?
清注意win32中dll和调用程序一个地址空间,因而一个全局
的钩子函数被回叫时,此dll和你要监视的程序一个地址空间,和你自己的监视程序却
不是。所以。。。。。
 
是 Access Violation 错误吗?是的话可能是 HookForm 对象还未创建(实例化)
 
出错原因:

1. SetWindowsHookEx(WH_KEYBOARD,KeyboardHookHandler,HInstance,0);

最后的参数是0,表示对所有的进程都可以按Ctrl_B键,但是你的过程

KeyboardHookHandler中却调用了你自己的模块程序:
HookForm.Visible := True; 和
HookForm.BringToFront;

那末就意味着,别的进程执行了他们不能访问的地址空间。即类似的
“Access Violation ”。

2. 你的要求可以不用就DLL能实现。

3. 你需要达到的功能,按Ctrl_B就执行Notepad,可以实现为:
a. procedure THookForm.SetHookBtnClick(Sender: TObject);
begin
if EnableHotKeyHook then
begin
ShowMessage('Keyboard Hook 启动, 按下 Ctrl + B 将叫出「记事本」');
//*** 去掉这一句 Visible := False;
end;
end;

b. 在KeyboardHookHandler中去掉你自己的模块程序:
HookForm.Visible := True; 和
HookForm.BringToFront;
改为WinExec('notepad.exe',sw_normal);即可。

c. 运行吧,按了“SetHookBtn”按钮后,在其它程序上按Ctrl_B试试,
如何???哈哈哈,大功告成也!!!

给我加分吧!!!
 
有一点我要解释一下,我不是想调用一个笔记本程序,
我在运行时先将自己程序的主窗口隐藏了,
想通过 ctrl+b是自己程序的主窗口显示出来。
 
若如此,registerhotkey即可。
 
是啊,既然这样你用热建就好了啊。

我看好像是你的那个HookForm没有初始化。
 
接受答案了.
 

Similar threads

I
回复
0
查看
621
import
I
I
回复
0
查看
689
import
I
后退
顶部