如何判断当前鼠标是否在某个控件上(注意:有可能都个控件重合在一起)

解决方案 »

  1.   


    var
      h:HWND;
      p:TPoint;
      con:TControl;
    begin
      GetCursorPos(p);
      h := WindowFromPoint(p);
      if h > 0 then
      begin
        con := FindControl(h);
        ShowMessage(con.ClassName);
        //处理con
      end;
    end;
      

  2.   

    不好意思,发重了。还有个问题就是,当两个控件重合时,是哪个控件先触发Mousemover事件呢,那么我想改变一下触发事件的顺序,不知道怎么弄呀?顺便说声谢谢bdmh 了,可以把你的qq号告诉我吗?有问题我可以请教你,谢谢了
      

  3.   


    代码生成的EXE使用时报错。
      

  4.   

    我想得到组件的name怎么不对啊.
    只是组件的类型.
      

  5.   

    其实很容易的
    VCL的消息机制是全部由Application来传递的,所有的消息都要经过Application来处理
    所以,只需要处理Application.OnMessage事件就可以了
    具体代码可以参考下面unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        OldMessage: TMessageEvent;
        procedure DoMessage(var Msg: TMsg; var Handled: Boolean);
        function CheckMouseInRect(ControlHandle: THandle): Boolean;
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.CheckMouseInRect(ControlHandle: THandle): Boolean;
    var
      r: TRect;
      p: TPoint;
    begin
      GetWindowRect(ControlHandle,r);
      GetCursorPos(p);
      Result := PtInRect(r,p);
    end;procedure TForm1.DoMessage(var Msg: TMsg; var Handled: Boolean);
    var
       c: array[0..255] of char;
    begin
      if Assigned(OldMessage) then
        OldMessage(Msg,Handled);
      if Msg.message = WM_MOUSEMOVE then
      begin
        if CheckMouseInRect(Panel1.Handle) then
        begin
          GetClassName(msg.hwnd,c,256);
          ShowMessage(c);
        end;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldMessage := Application.OnMessage;
      Application.OnMessage := DoMessage;
    end;end.
      

  6.   

    ShowMessage(c);
    你这个只是组件的类型名,并不是组件的name
    还有你这个只是针对整个事件处理,并不针对单个组件.
      

  7.   

    我不过是给定了一个Handle来判断鼠标是否在上面而已
    并非是获得一个名字为目的,楼主都是猩猩了,这个应该看的明白吧
      

  8.   


    你看懂我说的没有?我就是说你的获取的不过是组件的name.
      

  9.   

    这不是废话嘛!
    我判断到鼠标在上面,我就ShowMessage了,什么都没做,弹出一个名字而已
    自然获取的只不过是组件的name了,这个还要一次又一次的点出来吗?晕!我
    怎么不知道获得的只是组件的名字呢,不过是一个例子罢了,至于怎么用,自然是自己扩展
    各取所需,举一反三嘛,莫非我还一定要写一个完全代码?
      

  10.   


    你也该猩猩了,既然能取出鼠标当前所在控件的handle,那和你给定的handle比较一下不行吗?