如何获得当前输入焦点中光标的位置,注意是光标不是鼠标? 小弟最近做了一个控件,需要随时获得屏幕中获得输入焦点中的光标的位置,也就是那个一闪一闪的竖线,怎样实现请各位仁兄指点以下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 比如你封装的TEdit那么你在类里可以通过 Self.SelStart 属性来修改和获得当前光标插入点的位置. BOOL GetCaretPos( LPPOINT lpPoint // address of structure to receive coordinates ); BOOL GetCaretPos( LPPOINT lpPoint // address of structure to receive coordinates ); 我试验了一下,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; 会不会是ClientToScreen(GetFocus,lpPoint); ^^^^^^^^___________________激活的控件不是光标所在的控件? lamfish 应该不是这种情况,因为我是在 MouseMove 事件中调用的 GetScreenCaretPos 小弟最近做了一个控件,需要随时获得屏幕中获得输入焦点中的光标的位置,也就是那个一闪一闪的竖线,怎样实现请各位仁兄指点以下。这个东西应该叫做“插入符”光标在Windows中就指的是鼠标!提供以下函数供参考!CreateCaretDestroyCaretGetCaretBlinkTimeGetCaretPosHideCaretSetCaretBlinkTimeSetCaretPosShowCaret 绝大多数控件不出现一闪一闪的竖线光标,能出现的也就是TEdit,Tmemo等有限的几个,对Tedit、Tmemo控件,SelStart属性就是光标位置,当前焦点控件用self.ActiveControl判断 我想获得其他应用程序中插入符的位置,下面的代码是我从别的帖子拷贝过来的,据说不能得到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. 推荐你看下有关WIN32技术资料的书,以前有的5本一套,你找找看吧。 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"); 庆祝CSDN改版,散分200 在delphi中加入voloview控件解决旋转的问题 关于TWebBrowser和Delhpi之间的通讯问题,在线等待,急 delphi 项目外包 PAnsiChar怎么转成integer? 高手帮忙 超级解霸如何实现视频广播技术的?? TDBGrid的fields和columns 有什么区别? delphi 的edit passwordchar 怎样删除文本文件的一行? 加入一行? 关于TADOCommand的疑问 一个关于在图像中运用鼠标拖拉的问题?(急!!!)
那么你在类里可以通过 Self.SelStart 属性来修改和获得当前光标插入点的位置.
);
);
我试图用下面的过程实现转换,得到的结果却很离谱,请高手给解释一下。
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;
^^^^^^^^___________________激活的控件不是光标所在的控件?
光标在Windows中就指的是鼠标!提供以下函数供参考!
CreateCaret
DestroyCaret
GetCaretBlinkTime
GetCaretPos
HideCaret
SetCaretBlinkTime
SetCaretPos
ShowCaret
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.
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");