当mouse移动到form外时,如何取到它在screen上的位置?

解决方案 »

  1.   

    全局鼠标钩子.if wParam = WM_MOUSEMOVE then
      

  2.   

    demo: http://files.cnblogs.com/del/MouseHook_1.rar
      

  3.   

    Mouse.CursorPos.x
    Mouse.CursorPos.y
      

  4.   

    var
      P: TPoint;
    begin
      GetCursorPos(P);
      

  5.   

    var 
      P: TPoint; 
    begin 
      GetCursorPos(P);
      

  6.   


    这个就是VCL原生至此的功能啊,最好不用API
      

  7.   


    用钩子的话,就算焦点不在程式里,即点desktop也可以读到座标
      

  8.   

    抱歉,有一点没有看明白:dinoalex提供的demo中,有一段procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Text := GetInfo;
    end;不知道这个Text是谁的? 没有看到前面有声明。
      

  9.   

    又,采用  GetCursorPos(P);或  Mouse.CursorPos.x;Mouse.CursorPos.y后,点desktop也可以读到座标,好像没有差别。
      

  10.   

    Mouse.CursorPos.x
    Mouse.CursorPos.y
    这个比较方便,毕竟是Delphi自带的
      

  11.   

    to wxsan:我问text是哪一个组件的属性。form1是没有这一属性的,Timer也没有这一属性。
      

  12.   

    不用钩子也可以实现。调用API函数
      

  13.   

    引用 22 楼 zzwu 的回复:
    to wxsan:我问text是哪一个组件的属性。form1是没有这一属性的,Timer也没有这一属性。
    鼠标放到text就会显示了这种解释有点怪,难道鼠标不放在text上,而在其他地方,就不显示位置了吗?

      

  14.   

    在源代码中把鼠标放到“text”上面,一会就会显示text是属于哪个类的了。
      

  15.   


    我不懂“ 在源代码中把鼠标放到“text”上面”的含义。
    另外,你也没有回答我的问题:说明这个text是哪一个组件的属性。
      

  16.   

    意思就是:你把鼠标指针指向代码编辑窗口中的Text,Delphi就会显示出这个Text 是哪个组件的了。
      

  17.   

    to pilicat,实在抱歉,我仍然不能理解,我需要在我的程序运行时知道整个screen中任意一点的位置,
    而我的程序是一个制作几何图形的软件,运行时,没有代码编辑窗口.
      

  18.   


    ----------------------------------|
    |  这是scrren                           |
    |                                 |
    |    ---------------------          |
    |  | 这是我的程序的form                  |          |
    |  |                   |          |
    |  |                   |          |
    |  |                   |          |
    |  |                   |          |
    |  |                   |          |
    |  |                   |          |
    |  ---------------------          |
    |                                 |
    |                                 |
    |                                 |
    |                                 |
    -----------------------------------
    我希望做的工作就是,在画图时,如果必要,可将部分图形画到我的form之外,
    例如,在form中已有两条任意的线段,要求出它们的交点,因form内的任意两
    个线段的交点有可能落在form外,这时我就要把交点以及线段的部分延长线从
    form内穿过Form边界一直画到不属于form的screen部分.
      

  19.   

    而当我作好线段求交图形后,一旦将mouse移动到form外时,
    仍需要在statusbar中指示mouse在screen上的位置.
      

  20.   


    {不知道你是否是要这样的效果}
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      p : TPoint;
    begin
      GetCursorPos(p);
      self.Label1.Caption := IntToStr(p.X) +'   '+ IntToStr(p.Y);
    end;{简单的Demo,要什么钩子}
      

  21.   

    HOHO~~LZ好有面子,这么多高人来捧场……
      

  22.   

    to sanguomi:这个问题前面已经解决,现在是问20楼的一段程序procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Text := GetInfo;
    end; 
         
    中,字符串"Text"是谁的属性,何处声明?这一点我始终弄不懂,但似乎大家都已经明白了。
      

  23.   

    to HHJG2360:
    确实,不用钩子也行,我后来实际上也没有用钩子.
      

  24.   

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Text := GetInfo;//此处的Text就是Form1.Text
    end; 
      

  25.   

    只要位置完全没有必要用钩子,用api就可以了var
      P: TPoint;
    begin
      GetCursorPos(P);
      

  26.   

    二楼发的地址是万一老师一篇文章中的例子,比较全面的说明请看万一老师的这篇文章:http://www.cnblogs.com/del/archive/2008/07/14/1242389.html另楼主也可以在Delphi中按住Ctrl键,在用鼠标左键点代码中的“Text”,就会弹出这个“Text”在哪里声明的,其在Control单元中声明如下:
    property Text: TCaption read GetText write SetText;
    也就是说这个Text是指Form1.caption值,楼主可以看看是不是在窗体外电鼠标的话窗体的标题不断显示鼠标所在坐标。个人见解,未必正确,希望对楼主有用。
      

  27.   

    to dongnanyanhai:你所讲的“text 就是 caption”是对的,我所不知道的就是这一点,
    我习惯用Caption, 这是Object Inspector中明白写着的tform属性,
    想不到它还会有另一个叫“text”的别名,所以无需声明就可以用了。谢谢你。讲清楚了这个我想不到的问题。
      

  28.   

    也就是说,text和hook无关,例如下面的程序unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
    text:='ABCD';
    end;end.运行后,程序标题行就由Form1变成ABCD了。