procedure leftbuttondown(var msg:TMessage);message WM_LBUTTONDOWN;
procedure leftbuttonup(var msg:TMessage) message WM_LBUTTONUP;
截取这两下消息就可以了

解决方案 »

  1.   

    我需要的是截取其他程序的鼠标动作。
    按stiwin(战无不胜)的方法只能截取自己程序的鼠标
    按erp2(天涯劍)的说法只能发出鼠标动作,而没有办法截取鼠标状态
      

  2.   

    原来MSDN中的WH_MOUSE_LL就是Delphi中的WH_MOUSE
    可以通过wParam来判断鼠标的动作
      

  3.   

    现在有出现一个问题,
    为什么我设置的Hook没法捕获所有的Mouse事件呢,
    只能得到在自己程序上的。
      

  4.   

    当然了,因为你hook的只是自己这个程序的进程
    并没有hook所有进程
    要捕获所有事件,得把你的hook程序放入dll中!
      

  5.   

    为什么放在Dll中仍然只能捕获调用Dll的程序
    下面是Dll中的程序
    exports
      SetMouseHook,EndMouseHook;begin
      HookHandle:=0;
      ProcSaveExit:=ExitProc;
      ExitProc:=@MouseHookExit;
    end.var
      HookHandle:hHook;
      ProcSaveExit:Pointer;function SetMouseHook(AFileName:string):bool;export;
    function EndMouseHook():bool;export;
    procedure MouseHookExit;far;implementation
    var
      CurWindowHandle:HWND;
      //LastWindowHandle:HWND;
      MouseFile:TextFile;
      FileName:string;
    function Play(Code:integer;wParam,lParam:Longint):Longint;stdcall;//回调函数
    var
      xPos,yPos:integer;
      x:TPoint;
    begin
      if Code>=0 then
      begin
        if wParam=WM_LBUTTONDOWN then
        begin
          x:=PMouseHookStruct(lParam).pt;
          CurWindowHandle:=PMouseHookStruct(lParam).hwnd;
          xPos:=x.x;
          yPos:=x.y;
          Writeln(MouseFile,IntToStr(xPos)+' '+IntToStr(yPos)+' '+IntToStr(CurWindowHandle));
        end;
        Result:=0;
      end
      else
        Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
    end;function SetMouseHook(AFileName:string):bool;
    begin
      HookHandle:=SetWindowsHookEx(WH_MOUSE,Play,hInstance,0);
      FileName:='E:\1.txt';
      AssignFile(MouseFile,FileName);
      Rewrite(MouseFile);
      Result:=(HookHandle<>0);
    end;function EndMouseHook():bool;
    begin
      if HookHandle<>0 then
      begin
        UnHookWindowsHookEx(HookHandle);
        HookHandle:=0;
      end;
      CloseFile(MouseFile);
      Result:=(HookHandle=0);
    end;procedure MouseHookExit;far;
    begin
      if HookHandle<>0 then
        EndMouseHook;
      //CloseFile(MouseFile);
      ExitProc:=ProcSaveExit;
    end;
    end.
    下面是调用Dll的程序
    function SetMouseHook(AFileName:string):bool;external 'Mouse_Track.dll';
    function EndMouseHook:bool;external 'Mouse_Track.dll';{$R *.DFM}procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      SetMouseHook('E:\1.txt');;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
      EndMouseHook;
    end;
      

  6.   

    function SetMouseHook(AFileName:string):bool;
    begin
    HookHandle:=SetWindowsHookEx(WH_MOUSE,Play,hInstance,0);
    FileName:='E:\1.txt';
    AssignFile(MouseFile,FileName);
    Rewrite(MouseFile);
    Result:=(HookHandle<>0);
    end;FileName:='E:\1.txt';<-------------对FileName进行内存共享,否则其他程序执行Play钩子过程的时候FileName被初始化为空串,所以就表现为在其他程序中“为什么放在Dll中仍然只能捕获调用Dll的程序”。
    当进行内存共享的时候,所有的程序都会使用同一个FileName内存变量。所以问题也就可以解决了。  我想飞,但是我是只笨鸟。
      

  7.   

    内存共享的函数
    1、createfilemapping
    2、MapViewOfFile
    3、UnMapViewOfFile
    4、CloseHandle
    句我所知:WH_MOUSE_LL是win2k才支持的,WH_KEYBOARD_LL也是如此