Hook(50分)

  • 主题发起人 delphi fan2
  • 开始时间
D

delphi fan2

Unregistered / Unconfirmed
GUEST, unregistred user!
谁有处理Hook的delphi源程序(鼠标,键盘)。
控件也可以!
不过一定要有源程序(用delphi写的)
E-mail:dingzheng@126.com
 
http://www.progfa.com/delphi/files/mousehook.zip
http://www.progfa.com/delphi/files/keybrdhook.zip
 
(以下是我从别的地方剪贴过来的,不知道对你有没有帮助)
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;
If iCode < 0 then
begin
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 呼叫链结断掉
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.
--- Cut Here ---
3. 启动 Delphi
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...,do
NE!!');
end;

end.

8. 专案再存档一次, 执行.
OK! 执行後, 滑鼠点一下 Button1, 然後, 不管 form1 在不在前景, 极小化也可以, 按下 Ctrl + B 这个组合键, 记事本就启动了.
HOOK可分成 task scope 与 system scope 两种, Windows 系统会先呼叫 task scope 的函式, 然後才呼叫 system scope 的函式;
但如果当时挂上 task scope hook 的程式不在前景, 则其所属的 task scopehook 当然没有作用. (不然怎麽叫 task scope 嘛! :p)
如果不是实作成 DLL, 而是将之移入 .exe 的Project中,那它就从 system scope 变成 task scope 的 hook, 当程式在背景时,Windows 当然就不理会这个 hook 函式了.
换句话说, system scope 的 HOOK 必须实作成 DLL. 而且, 某些类型的 HOOK 还必须要求只能以 system scope 的方式挂上去, 像是WH_JOURNALPLAYBACK, 就是其中一个. 进一步的资讯, 您可以参考WinSDK Reference. 市面上讲 Windows 程式设计比较深入的我认为应该要涵盖这个题目.
 
急!帮助说:Specifies the identifier of the mouse message. 可是如何知道Ctrl,Alt是否按下?(空)
 
急!帮助说:Specifies the identifier of the mouse message. 可是如何知道Ctrl,Alt是否按下?(空)
 
那MouseHook 如和用呢?
 
给你一个例子。
 
chenke:
能CC给我一份吗?<a href="xftang@shtdu.edu.cn">xftang@shtdu.edu.cn</a>
谢谢!
 
给我来一份:lin.zg@990.net
 
可到ftp.fortunecity.com,
username:chenkeftp
password:chenkeftp
get hookdemo.zip
enjoy it!
 
我的分分不出去!
总是分配分与总分不符!
 
我来试试 :)
 
顶部