如何获得光标位置??

我和我的蓝天白云 2004-06-19 12:23:18
不知怎样可获得光标所在窗口的句柄,注意:不是鼠标,
有没有类似GetCursorPos的API函数可用,直接得到光标的屏幕坐标?
然后用WindowFromPoint得到窗口句柄?

请教各位高手!
...全文
202 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
难道与操作系统有关?
应该没有关系的呀!

请高手解答................
  • 打赏
  • 举报
回复
我用WIN2000,乞求大虾回音.............
pigpag 2004-06-20
  • 打赏
  • 举报
回复
你是什么操作系统?
pigpag 2004-06-20
  • 打赏
  • 举报
回复
晕,实验证明:有效
Office 2003 Word

骗你是小猫猫……


没办法给你做测试阿
  • 打赏
  • 举报
回复
我用的是word 2002 ,确实无效,骗你是小狗狗!!!!!
  • 打赏
  • 举报
回复
word编辑区有什么独特之处,为什么取不到光标,也取不到编辑区窗口句柄,奇了,
老美真绝!我就不信,破,破.....
pigpag 2004-06-20
  • 打赏
  • 举报
回复
晕,实验证明:有效

Office 2003 Word
pigpag 2004-06-20
  • 打赏
  • 举报
回复
……是的,本来就是无效的。

我看看有什么解决办法没有
kmzs 2004-06-20
  • 打赏
  • 举报
回复
我二弟好强。。。。。。。
  • 打赏
  • 举报
回复
谢谢 pigpag 大虾,不过对word的编辑区好象无效,
请指点!
pigpag 2004-06-20
  • 打赏
  • 举报
回复
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Declare Function GetCaretPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetFocus Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function AttachThreadInput Lib "user32.dll" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function GetClientRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT) As Long
'Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
'Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
'Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'Private Const EM_GETRECT As Long = &HB2

Private Sub Timer1_Timer()
Dim K As POINTAPI, hwnd As Long, retVal As Long, dX As Long, dY As Long
Dim idAttach As Long, R As RECT
hwnd = GetForegroundWindow()
idAttach = GetWindowThreadProcessId(hwnd, 0)
If idAttach = App.ThreadID Then
hwnd = GetFocus()
GetCaretPos K
Else
If AttachThreadInput(App.ThreadID, idAttach, 1) <> 0 Then
hwnd = GetFocus()
GetCaretPos K
AttachThreadInput App.ThreadID, idAttach, 0
Else
If Err.LastDllError <> 1400 Then MsgBox Err.LastDllError ' 1400是INVALID_HANDLE,切换的时候会发生,正常
End If
End If
GetWindowRect hwnd, R
dX = R.Right - R.Left
dY = R.Bottom - R.Top
K.x = R.Left + K.x
K.y = R.Top + K.y
GetClientRect hwnd, R
dX = (dX - R.Right) \ 2
dY = (dY - R.Bottom) \ 2
K.x = R.Left + K.x + dX
K.y = R.Top + K.y + dY
Label1 = "Caret Position - X: " & CStr(K.x) & " Y: " & CStr(K.y)
End Sub


放上一个Label1、一个Timer1,Interval小一点即可
supergreenbean 2004-06-20
  • 打赏
  • 举报
回复
呵呵,前段时间我也刚写过一个,如果明天早上还没有答案的话,我找找看...
  • 打赏
  • 举报
回复
顶,高手们快来帮我一下呀。
  • 打赏
  • 举报
回复
光GetFocus是取不到的,还要AttachThreadInput,然后再用ClientToScreen转化


能否给出点源代码?谢谢!
pigpag 2004-06-20
  • 打赏
  • 举报
回复
我都回答过同样的问题……

光GetFocus是取不到的,还要AttachThreadInput,然后再用ClientToScreen转化
supergreenbean 2004-06-20
  • 打赏
  • 举报
回复
用GetFocus,建议你搜索一下,因为以前有人问过同样的问题
  • 打赏
  • 举报
回复
哈哈,无人知晓???

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧