小弟最近做了一个控件,需要随时获得屏幕中获得输入焦点中的光标的位置,也就是那个一闪一闪的竖线,怎样实现请各位仁兄指点以下。

解决方案 »

  1.   

    比如你封装的TEdit
    那么你在类里可以通过 Self.SelStart 属性来修改和获得当前光标插入点的位置.
      

  2.   

    BOOL GetCaretPos(    LPPOINT lpPoint  // address of structure to receive coordinates
       );
      

  3.   

    BOOL GetCaretPos(    LPPOINT lpPoint  // address of structure to receive coordinates
       );
      

  4.   

    我试验了一下,GetCaretPos返回的是当前焦点控件的客户区位置,怎么把它转换成屏幕位置?
    我试图用下面的过程实现转换,得到的结果却很离谱,请高手给解释一下。
    procedure GetScreenCaretPos(var lpPoint: TPoint);
    var Point: TPoint;
    begin
        ClientToScreen(GetFocus,lpPoint);
        GetCaretPos(Point);
        lpPoint.X:=lpPoint.X+Point.X;
        lpPoint.Y:=lpPoint.Y+Point.Y;
    end;
      

  5.   

    会不会是ClientToScreen(GetFocus,lpPoint);
                           ^^^^^^^^___________________激活的控件不是光标所在的控件?
      

  6.   

    lamfish 应该不是这种情况,因为我是在 MouseMove 事件中调用的 GetScreenCaretPos
      

  7.   

    小弟最近做了一个控件,需要随时获得屏幕中获得输入焦点中的光标的位置,也就是那个一闪一闪的竖线,怎样实现请各位仁兄指点以下。这个东西应该叫做“插入符”
    光标在Windows中就指的是鼠标!提供以下函数供参考!
    CreateCaret
    DestroyCaret
    GetCaretBlinkTime
    GetCaretPos
    HideCaret
    SetCaretBlinkTime
    SetCaretPos
    ShowCaret 
      

  8.   

    绝大多数控件不出现一闪一闪的竖线光标,能出现的也就是TEdit,Tmemo等有限的几个,对Tedit、Tmemo控件,SelStart属性就是光标位置,当前焦点控件用self.ActiveControl判断
      

  9.   

    我想获得其他应用程序中插入符的位置,下面的代码是我从别的帖子拷贝过来的,据说不能得到Word中的插入符位置,其他的可以,不过我不明白它的意思,有谁能解释一下。如何得到 MS WORD里插入符号的位置?下面的这段代码能获得其他程序中插入符的位置,但在MS word中不行unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure myWM_ACTIVATE(var Message: TMessage); message WM_ACTIVATE;
        procedure Button1Click(Sender: TObject);//截获消息
      private
        { Private declarations }
      public
        { Public declarations }
         HActWin,Hself: HWND;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.myWM_ACTIVATE(var Message: TMessage);
    begin
      if Message.wParam = WA_CLICKACTIVE  then
      begin
        //SetActiveWindow(message.lParam);
        if (HActWin<>message.lParam) and (message.lParam<>Hself) then
          HActWin:=message.lParam;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      focushld,windowhld:hwnd;
      threadld:dword;
      P1:TPoint;
    begin  SetActiveWindow(HActWin);
      windowhld:=GetForegroundWindow;
      threadld:=GetWindowThreadProcessId(Windowhld,nil); //Windowhld
      AttachThreadInput(GetCurrentThreadId,threadld,true);
      GetCaretPos(P1);
      Caption:=IntToStr(P1.X )+'::'+IntToStr(P1.y ) ;
      Focushld:=getfocus;
      AttachThreadInput(GetCurrentThreadId,threadld,false); if focushld = 0 then Exit;
    end;end.
      

  10.   

    推荐你看下有关WIN32技术资料的书,以前有的5本一套,你找找看吧。
      

  11.   

    TPoint cPos;
     if (GetCaretPos(&cPos))
       {
        Edit3->Text="x="+IntToStr(cPos.x)+",y="+ IntToStr(cPos.y);
        cPos=Edit1->ClientToScreen(cPos);
        this->PopupMenu1->Popup(cPos.x,cPos.y+Edit1->Height);
       }
      else
       ShowMessage("no Caret");