F fanwendou Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-25 #1 实现像输入法那样的窗口跟随! 在创建窗体的时候需要获得光标在屏幕中的位置。GetCaretPos 和 ClientToScreen 都用了还是不行呀!
Z znxia Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-25 #4 GetCaretPos表示光标在Window(Edit/Memo之类)中的相对位置如果知道当前光标所在Window的句柄Handle,则通过windows.GetWindowRect(Handle,Rect:TRect);可以计算出来当前window在桌面上的位置,然后再加上 GetCaretPos的结果,就可以得到光标在桌面上的位置。可惜我不知道如何获得光标所在的window的句柄
GetCaretPos表示光标在Window(Edit/Memo之类)中的相对位置如果知道当前光标所在Window的句柄Handle,则通过windows.GetWindowRect(Handle,Rect:TRect);可以计算出来当前window在桌面上的位置,然后再加上 GetCaretPos的结果,就可以得到光标在桌面上的位置。可惜我不知道如何获得光标所在的window的句柄
Z znxia Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-25 #5 H:=windows.GetForegroundWindow;可以获得当前活动的Form的句柄,但这个Form中的哪个window是活动的,我还没找到。
Z znxia Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-25 #7 var t:tpoint; Hnd,ParentHand:THandle; R:TRect; begin ParentHand:=windows.GetForegroundWindow;//当前活动form的句柄 Hnd:= FindWindowExA (ParentHand, 0, nil, nil);//当前活动form中,焦点所在window句柄 windows.GetWindowRect(Hnd,R); //当前活动form中,焦点所在window,在桌面中的位置
var t:tpoint; Hnd,ParentHand:THandle; R:TRect; begin ParentHand:=windows.GetForegroundWindow;//当前活动form的句柄 Hnd:= FindWindowExA (ParentHand, 0, nil, nil);//当前活动form中,焦点所在window句柄 windows.GetWindowRect(Hnd,R); //当前活动form中,焦点所在window,在桌面中的位置
Z znxia Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-25 #8 procedure TForm1.Timer1Timer(Sender: TObject);var t:tpoint; hWnd,ParentHand:THandle; R:TRect; dThreadID,sThreadIDWORD; begin ParentHand:=windows.GetForegroundWindow;//当前活动form的句柄 sThreadID := GetCurrentThreadId(); dThreadID := GetWindowThreadProcessId(ParentHand, NIL); AttachThreadInput(dThreadID, sThreadID, true); hWnd := GetFocus(); GetCaretPos(t); windows.GetWindowRect(hWnd,R); //当前活动form中,焦点所在window,在桌面中的位置 caption:=format('光标位置:%d %d',[R.Left+t.x, r.Top+t.y]); end; 我不补充了,呵呵
procedure TForm1.Timer1Timer(Sender: TObject);var t:tpoint; hWnd,ParentHand:THandle; R:TRect; dThreadID,sThreadIDWORD; begin ParentHand:=windows.GetForegroundWindow;//当前活动form的句柄 sThreadID := GetCurrentThreadId(); dThreadID := GetWindowThreadProcessId(ParentHand, NIL); AttachThreadInput(dThreadID, sThreadID, true); hWnd := GetFocus(); GetCaretPos(t); windows.GetWindowRect(hWnd,R); //当前活动form中,焦点所在window,在桌面中的位置 caption:=format('光标位置:%d %d',[R.Left+t.x, r.Top+t.y]); end; 我不补充了,呵呵
U ufo Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-25 #9 你们想复杂了,获取鼠标在屏幕上的坐标用 GetCursorPos(p); 就可以了。以下代码调试通过procedure TForm1.Button1Click(Sender: TObject); begin timer1.Enabled:= true; end; procedure TForm1.Timer1Timer(Sender: TObject);var p: tpoint; begin GetCursorPos(p); button1.Caption:= inttostr(p.x)+ ':'+ inttostr(p.y); end; 按下按钮后移动鼠标,可以在按钮上看到坐标变化。
你们想复杂了,获取鼠标在屏幕上的坐标用 GetCursorPos(p); 就可以了。以下代码调试通过procedure TForm1.Button1Click(Sender: TObject); begin timer1.Enabled:= true; end; procedure TForm1.Timer1Timer(Sender: TObject);var p: tpoint; begin GetCursorPos(p); button1.Caption:= inttostr(p.x)+ ':'+ inttostr(p.y); end; 按下按钮后移动鼠标,可以在按钮上看到坐标变化。
F fanwendou Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-26 #12 znxia 说的有道理 “光标位置和鼠标位置是两回事” !!
Z znxia Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-26 #13 我最后部分的代码,测试后,符合你的要求,不知道你还有什么疑问?
U ufo Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-26 #14 不好意思,没看清题目。http://www.delphibbs.com/delphibbs/dispq.asp?lid=3674294这里有以前的现成代码。
F fanwendou Unregistered / Unconfirmed GUEST, unregistred user! 2009-02-26 #15 to:znxia 在你代码的基础上问题已经,十分感谢 现在开始送分了