这个钩子要实现可以捕获除了本窗体外的所有鼠标位置信息。
我目前实现的是可以得到本窗体上鼠标移动的信息,当把鼠标移出到其他应用程序上时,
就无法得到鼠标信息了。

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        Procedure Hook(En: Boolean = true);
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      hHook: LongWord;
      xy: TPoint;implementation{$R *.dfm}function HookProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
    begin
      if(peventmsg(lparam)^.message = WM_LBUTTONDOWN) Or
        (peventmsg(lparam)^.message = WM_LBUTTONUP) Or
        (peventmsg(lparam)^.message = WM_LBUTTONDBLCLK) Or
        (peventmsg(lparam)^.message = WM_MOUSEMOVE) Or
        (peventmsg(lparam)^.message = WM_RBUTTONDOWN) Or
        (peventmsg(lparam)^.message = WM_RBUTTONUP) Or
        (peventmsg(lparam)^.message = WM_RBUTTONDBLCLK) Or
        (peventmsg(lparam)^.message = WM_MBUTTONDOWN) Or
        (peventmsg(lparam)^.message = WM_MBUTTONUP) Or
        (peventmsg(lparam)^.message = WM_MBUTTONDBLCLK)
        then
        begin
          GETCURSORPOS(XY);
          form1.Caption := IntToStr(XY.x) + ' ' + IntToStr(XY.y);
        end;
      Result := CallNextHookEx(hHook, iCode, wParam, lParam);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Hook;
    end;procedure TForm1.Hook(En: Boolean);
    begin
      if En then
        hHook := SetwindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0)
      else
        UnHookWindowsHookEx(hHook);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Hook(false);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
     Hook(false);
    end;end.
      

  2.   

    Kevin_Lmx(繁华阅尽) ( )
    能具体说明一下实现的要点嘛?
      

  3.   

    to cdsgajxlp(新手) 
    你的这种方法只能在本form内得到鼠标钩子
      

  4.   

    建立系统范围的Windows钩子要向某个进程注入DLL,一个十分普遍也是比较简单的方法就是建立在标准的Windows钩子的基础上。Windows钩子一般是在DLL中实现的,这是一个全局性的Windows钩子的基本要求。当我们成功地调用SetWindowsHookEx函数之后,便在系统中安装了某种类型的消息钩子,这个钩子可以是针对某个进程,也可以是针对系统中的所有进程。一旦某个进程中产生了该类型的消息,操作系统会自动把该钩子所在的DLL映像到该进程的地址空间中,从而使得消息回调函数(在SetWindowsHookEx的参数中指定)能够对此消息进行适当的处理,在这里,我们所感兴趣的当然不是对消息进行什么处理,因此在消息回调函数中只需把消息钩子向后传递就可以了,但是我们所需的DLL已经成功地注入了目标进程的地址空间,从而可以完成后续工作。
    ------------
    大概是这样。你在网上找找资料吧。^_^
      

  5.   

    问题可能就出在:SetwindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0)上,
    关键是HInstance参数要如何设置
      

  6.   

    你的这种方法只能在本form内得到鼠标钩子,以外好象也行
    如果不放心,可以做成DLL更好
      

  7.   

    WH_JOURNALRECORD是什么参数,怎么得不到鼠标移动和鼠标按下的消息啊如果用WH_MOUSE可以得到鼠标移动和鼠标按下的消息,但只能在本form内?