我想在鼠标左键在任意地方按下时执行一段代码,
也就是说并不是在某个控件中按下,也不一定在我的程序中按下

解决方案 »

  1.   

    在form的MouseDown事件中加入
     if button= mbLeft then
      .....
      

  2.   

    这样只能当鼠标在form中点击时才行,我想在任一处点击时都行
      

  3.   

    look 
    钩子程序的实例
         在本程序中建立了两个消息函数,一个用于纪录鼠标、键盘的动作并保存,另一个用于将保存的动作返给系统回放。在Delphi中建立一个工程,在Form1上添加3个按钮用于程序操作。另外再添加一个Edit控件用于验证操作。以下程序在Delphi6.0、Windows98环境下调试通过。
         unit Unit1;
         interface
         uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
                Dialogs, StdCtrls;
         type
           TForm1 = class(TForm)
           Button1: TButton;
           Button2: TButton;
           Button3: TButton;
           Edit1: TEdit;
           procedure FormCreate(Sender: TObject);
           procedure Button1Click(Sender: TObject);
           procedure Button2Click(Sender: TObject);
           procedure Button3Click(Sender: TObject);
           private
           { private declarations }
           public
           { public declarations }
           end;
         var
           Form1: TForm1;
           EventArr:array[0..1000]of EVENTMSG;
           EventLog:Integer;
           PlayLog:Integer;
           hHook,hPlay:Integer;
           recOK:Integer;
           canPlay:Integer;
           bDelay:Bool;
         implementation
         {$R *.DFM}
         function PlayProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
         begin
           canPlay:=1;
           Result:=0;
           if iCode < 0 then //必须将消息传递到钩子链的下一个处理程序
           Result := CallNextHookEx(hPlay,iCode,wParam,lParam)
           else if iCode = HC_SYSMODALON then  canPlay:=0
           else if iCode = HC_SYSMODALOFF then  canPlay:=1
           else if ((canPlay =1 )and(iCode=HC_GETNEXT)) then begin
           if bDelay then begin
           bDelay:=False;
           Result:=50;
           end;
           pEventMSG(lParam)^:=EventArr[PlayLog];
           end
           else if ((canPlay = 1)and(iCode = HC_SKIP))then begin
           bDelay := True;
           PlayLog:=PlayLog+1;
           end;
           if PlayLog>=EventLog then begin
           UNHookWindowsHookEx(hPlay);
           end;
         end;
         function HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
         begin
           recOK:=1;
           Result:=0; 
           if iCode < 0 then
           Result := CallNextHookEx(hHook,iCode,wParam,lParam)
           else if iCode = HC_SYSMODALON then  recOK:=0
           else if iCode = HC_SYSMODALOFF then  recOK:=1
           else if ((recOK>0) and (iCode = HC_ACTION)) then begin
           EventArr[EventLog]:=pEventMSG(lParam)^;
           EventLog:=EventLog+1;
           if EventLog>=1000 then begin
           UnHookWindowsHookEx(hHook);
           end;
           end;
         end;
         procedure TForm1.FormCreate(Sender: TObject);
         begin
           Button1.Caption:='纪录';
           Button2.Caption:='停止';
           Button3.Caption:='回放';
           Button2.Enabled:=False;
           Button3.Enabled:=False;
         end;
         procedure TForm1.Button1Click(Sender: TObject);
         begin
           EventLog:=0;
           //建立键盘、鼠标操作消息纪录链
           hHook:=SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0);
           Button2.Enabled:=True;
           Button1.Enabled:=False;
         end;
         procedure TForm1.Button2Click(Sender: TObject);
         begin
           UnHookWindowsHookEx(hHook);
           hHook:=0;
           Button1.Enabled:=True;
           Button2.Enabled:=False;
           Button3.Enabled:=True;
         end;
         procedure TForm1.Button3Click(Sender: TObject);
         begin
           PlayLog:=0;
           //建立键盘鼠标操作消息纪录回放链
           hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,
           HInstance,0); 
           Button3.Enabled:=False;
         end; 
         end. 
         运行程序,点击“纪录”按钮开始纪录操作,这时你可以在文本控件中输入一些文字,然后点击“停止”按钮停止纪录,再点击“回放”按钮就可以将先前所做的操作回放。在上面的程序中,HookProc是纪录操作的消息函数,每当有鼠标、键盘消息发生时,系统都会调用该函数,消息信息就保存在地址lParam中,PlayProc是消息回放函数,当系统执行消息回放时调用该函数,程序就将先前纪录的消息值返回到lParam指向的区域中,系统就会执行该消息,从而实现了消息回放。