library MyHook;uses SysUtils, Windows, Messages, Classes;{$R *.res}var hook: HHOOK; function MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin if wParam = WM_LBUTTONDOWN then begin //发现系统有Mouse点击事件 //DoEvent() end; Result := CallNextHookEx(hook, nCode, wParam, lParam); end; function SetHook: Boolean; stdcall; begin hook := SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0); Result := hook <> 0; end; function DelHook: Boolean; stdcall; begin Result := UnhookWindowsHookEx(hook); end; exports SetHook name 'SetHook', DelHook name 'DelHook', MouseHook name 'MouseHook'; begin end.
只能用HOOK, var HookHandle: HHOOK;//钩子的句柄值。function MsgHookProc(Code: Integer; WParam: Longint;Msg:Longint): LRESULT;stdcall; //鼠标钩子的回调函数,即是用它来处理得到消息后要干什么。。 //nCode参数是Hook的标志,一般只关心小于0时。 //WParam参数表示鼠标消息的类型 //LParam参数是一个指向 TMOUSEHOOKSTRUCT 结构的指针。结构包含了鼠标消息的状态,我只用了hwnd一个 //即鼠标消息要传递给的窗口句柄。 //返回值如果不是0的话Windows就把这个消息丢掉,其它的程序就不会再收到这个消息了。function EnableMsgHook:Boolean; stdcall; eXPort; function DisableMsgHook:Boolean; stdcall; eXPort;//两个函数都是Boolean类型,成功都是返回True implementationfunction MsgHookProc(Code: Integer; WParam: Longint;Msg:Longint): LRESULT;stdcall; begin if (Code = HC_ACTION) then if PMsg(Msg)^.Message = WM_MOUSEWHEEL then //鼠标滚动 begin if HIword(PMsg(Msg)^.wParam)=120 then // 上滚 begin //做你想做的。 ShowWindow (pmsg(msg)^.hwnd,SW_MAXIMIZE ); end; if HIword(PMsg(Msg)^.wParam)<>120 then // 下滚 begin //做你想做的。 ShowWindow (pmsg(msg)^.hwnd,SW_RESTORE ); end; PMsg(Msg)^.Message := 0; end; Result :=CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg)); end;function EnableMsgHook:Boolean; stdcall; eXPort; begin if HookHandle = 0 then //为了安全,必须判断一下再设置钩子。 Begin // 第三个参数的Hinstance 在Delphi中有定义,用就可以了。第四个参数必须为0 HookHandle := SetWindowsHookEx(WH_GETMESSAGE,@MsgHookProc,Hinstance,0); Result := True; end else Result := False; end;function DisableMsgHook:Boolean; stdcall; eXPort; begin if HookHandle <> 0 then //如果有钩子就卸掉他。 begin UnHookWindowsHookEx(HookHandle); HookHandle := 0; Result := True; end else Result := False; end;end.
library MyHook;uses
SysUtils,
Windows,
Messages,
Classes;{$R *.res}var
hook: HHOOK;
function MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
if wParam = WM_LBUTTONDOWN then
begin
//发现系统有Mouse点击事件
//DoEvent()
end;
Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;
function SetHook: Boolean; stdcall;
begin
hook := SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0);
Result := hook <> 0;
end;
function DelHook: Boolean; stdcall;
begin
Result := UnhookWindowsHookEx(hook);
end;
exports
SetHook name 'SetHook',
DelHook name 'DelHook',
MouseHook name 'MouseHook'; begin
end.
var
HookHandle: HHOOK;//钩子的句柄值。function MsgHookProc(Code: Integer; WParam: Longint;Msg:Longint): LRESULT;stdcall;
//鼠标钩子的回调函数,即是用它来处理得到消息后要干什么。。
//nCode参数是Hook的标志,一般只关心小于0时。
//WParam参数表示鼠标消息的类型
//LParam参数是一个指向 TMOUSEHOOKSTRUCT 结构的指针。结构包含了鼠标消息的状态,我只用了hwnd一个
//即鼠标消息要传递给的窗口句柄。
//返回值如果不是0的话Windows就把这个消息丢掉,其它的程序就不会再收到这个消息了。function EnableMsgHook:Boolean; stdcall; eXPort;
function DisableMsgHook:Boolean; stdcall; eXPort;//两个函数都是Boolean类型,成功都是返回True
implementationfunction MsgHookProc(Code: Integer; WParam: Longint;Msg:Longint): LRESULT;stdcall;
begin
if (Code = HC_ACTION) then
if PMsg(Msg)^.Message = WM_MOUSEWHEEL then //鼠标滚动
begin
if HIword(PMsg(Msg)^.wParam)=120 then // 上滚
begin
//做你想做的。
ShowWindow (pmsg(msg)^.hwnd,SW_MAXIMIZE );
end; if HIword(PMsg(Msg)^.wParam)<>120 then // 下滚
begin
//做你想做的。
ShowWindow (pmsg(msg)^.hwnd,SW_RESTORE );
end;
PMsg(Msg)^.Message := 0;
end;
Result :=CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
end;function EnableMsgHook:Boolean; stdcall; eXPort;
begin
if HookHandle = 0 then //为了安全,必须判断一下再设置钩子。
Begin
// 第三个参数的Hinstance 在Delphi中有定义,用就可以了。第四个参数必须为0
HookHandle := SetWindowsHookEx(WH_GETMESSAGE,@MsgHookProc,Hinstance,0);
Result := True;
end
else
Result := False;
end;function DisableMsgHook:Boolean; stdcall; eXPort;
begin
if HookHandle <> 0 then //如果有钩子就卸掉他。
begin
UnHookWindowsHookEx(HookHandle);
HookHandle := 0;
Result := True;
end
else
Result := False;
end;end.