一个简单的例子。只有一个exe文件,窗体中没有任何控件,鼠标操作可以从debugview.exe中看到。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const
WM_TestMessage = WM_USER + 2000;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
HookHandle: HHOOK;
function TestHookProc(Code: Integer; wParam: wParam; lParam: lParam)
: LRESULT; stdcall;
var
X,Y:Long;
begin
if (Code > 0) then
begin
case wParam of
WM_LBUTTONDOWN:
OutputDebugString(PChar('鼠标消息:点击左键。'));
WM_RBUTTONDOWN:
OutputDebugString(PChar('鼠标消息:点击右键。'));
WM_LBUTTONDBLCLK:
OutputDebugString(PChar('鼠标消息:双击左键。'));
WM_RBUTTONDBLCLK:
OutputDebugString(PChar('鼠标消息:双击右键。'));
WM_LBUTTONUP:
OutputDebugString(PChar('鼠标消息:左键松开。'));
WM_RBUTTONUP:
OutputDebugString(PChar('鼠标消息:右键松开。'));
WM_MOUSEMOVE or WM_MouseMove:
begin
X := pMOUSEHOOKSTRUCT(lParam)^.pt.X;
Y := pMOUSEHOOKSTRUCT(lParam)^.pt.Y;
OutputDebugString(PChar(intToStr(X)+','+intToStr(Y)));
end;
end;
end;
Result := CallNextHookEx(HookHandle, Code, wParam, Longint(@lParam));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_MOUSE, @TestHookProc, 0,
GetCurrentThreadID);
OutputDebugString(PChar('鼠标钩子已经加载。'));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(HookHandle);
OutputDebugString(PChar('鼠标钩子已经卸载。'));
end;
end.