第一步,建一DLL,DELPHI中NEW-》DLL SAVE AS GETKEYlibrary getKey;uses SysUtils, Windows, HookMain in hookmain.pas;exports OpenGetKeyHook, CloseGetKeyHook, GetPublicP;begin NextHook := 0; procSaveExit := ExitProc; DLLproc := @DLLMain; ExitProc := @HookExit; DLLMain(DLL_PROCESS_ATTACH); end.第二步,建一UNIT ,HOOK MAIN。关键在于CreateFileMapping 和 消息 WM_NCMouseMove, WM_MOUSEMOVE:unit HookMain; interface uses Windows, Messages, Dialogs, SysUtils; //type DataBuf = Array [1..2] of DWORD; type mydata=record data1:array [1..2] of DWORD; data2:TMOUSEHOOKSTRUCT; end; var hObject : Thandle; pMem : Pointer; NextHook: Hhook; procSaveExit: Pointer; function HookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export; function OpenGetKeyHook(sender : HWND;MessageID : WORD) : BOOL; export; function CloseGetKeyHook: BOOL; export; function GetPublicP : Pointer;stdcall; export; Procedure DLLMain(dwReason:Dword); far; procedure HookExit; far; implementation Procedure UnMapMem; begin if Assigned(pMem) then begin UnMapViewOfFile(pMem); pMem := Nil end; end; Procedure MapMem; begin hObject := CreateFileMapping($FFFFFFFF,Nil,Page_ReadWrite,0,$FFFF,pChar(_IOBuffer)); if hObject = 0 then Raise Exception.Create(创建公用数据的Buffer不成? ; pMem := MapViewOfFile(hObject,FILE_MAP_WRITE,0,0,SizeOf(mydata)); // 1 or SizeOf(DataBuf) ???? // 创建SizeOf(DataBuf)的数据区 if not Assigned(pMem) then begin UnMapMem; Raise Exception.Create(创建公用数据的映射关系不成功!); end; end; Procedure DLLMain(dwReason:Dword); far; begin Case dwReason of DLL_PROCESS_ATTACH : begin pMem := nil; hObject := 0; MapMem; //以下的公有数据,如tHWND,tMessageID将直接使用本Buf. End; DLL_PROCESS_DETACH : UnMapMem; DLL_THREAD_ATTACH, DLL_THREAD_DETACH :; //缺省 end; end; procedure HookExit; far; begin CloseGetKeyHook; ExitProc := procSaveExit; end;function GetPublicP : Pointer;export; begin //这里引出了公用数据区的指针,你可以在你的应用程序中自由操作它。但建议去掉此接口。 Result := pMem; end;function HookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export; begin Result := 0; If iCode $#@60; 0 Then Result := CallNextHookEx(NextHook, iCode, wParam, lParam); // This is probably closer to what you would want to do... Case wparam of WM_LBUTTONDOWN: begin end; WM_LBUTTONUP: begin end; WM_LBUTTONDBLCLK: begin end; WM_RBUTTONDOWN: begin messagebeep(1); end; WM_RBUTTONUP: begin end; WM_RBUTTONDBLCLK: begin end; WM_MBUTTONDOWN: begin end; WM_MBUTTONUP: begin end; WM_MBUTTONDBLCLK: |