挂钩笔记二——鼠标状态
一个简单的例子。只有一个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.