首页
社区
课程
招聘
[求助]vb获取光标位置
发表于: 2009-3-27 20:15 14485

[求助]vb获取光标位置

2009-3-27 20:15
14485
看了 【求助】请问:除了用GetCaretPos还有没有别的方法获取光标位置?
除了用GetCaretPos还有没有别的方法获取光标位置 的文章,我也想用VB做一个,但是,不行。请大家看看那?

参考易语言的代码?
FoHandle<>取窗口句柄,中
取窗口句柄 不懂是什么意思?
谢谢

'获得拥有输入焦点的窗口的句柄
Private Declare Function GetFocus Lib "user32" _
                () As Long
'获得前台窗口的句柄。这里的“前台窗口”是指前台应用程序的活动窗口
Private Declare Function GetForegroundWindow Lib "user32" _
                () As Long
'通常,系统内的每个线程都有自己的输入队列。本函数(既“连接线程输入函数”)允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态

Private Declare Function AttachThreadInput Lib "user32" _
                (ByVal idAttach As Long, _
                                           ByVal idAttachTo As Long, _
                                           ByVal fAttach As Long) As Long
'获取当前线程一个唯一的线程标识符
Private Declare Function GetCurrentThreadId Lib "kernel32" _
                () As Long
'获取与指定窗口关联在一起的一个进程和线程标识符
Private Declare Function GetWindowThreadProcessId Lib "user32" _
                (ByVal hwnd As Long, _
                                                  lpdwProcessId As Long) As Long
'暂停线索
Private Declare Sub Sleep Lib "kernel32" _
                (ByVal dwMilliseconds As Long)

'判断插入符的当前位置
Private Declare Function GetCaretPos Lib "user32" _
                (lpPoint As POINTAPI) As Long
Private Type POINTAPI
    x As Long
    y As Long
End Type

'判断窗口内以客户区坐标表示的一个点的屏幕坐标
Private Declare Function ClientToScreen Lib "user32" _
                (ByVal hwnd As Long, _
                                        lpPoint As POINTAPI) As Long

Sub main()

Dim FoHandle As Long
Dim PHandle As Long
Dim ThisPoint As Long
Dim Point As POINTAPI
FoHandle = GetFocus
PHandle = GetForegroundWindow
AttachThreadInput GetCurrentThreadId, GetWindowThreadProcessId(PHandle, 0), 1
ThisPoint = GetCaretPos(Point)

ClientToScreen FoHandle, Point

Sleep 2

Debug.Print Point.x, Point.y, ThisPoint

  
   If FoHandle = PHandle Then  '这里是否有问题???
  Form1.Visible = False
  
Form1.Visible = True
Form1.Left = Point.x
Form1.Top = Point.y
DoEvents
Else
Form1.Visible = False
End If

End Sub

Private Sub Form_Load()
main
End Sub

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (1)
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
除了用GetCaretPos还有没有别的方法获取光标位置 的文章,我也想用VB做一个,好像可以在IE 和word中跟随的?

参考易语言的代码

'参考:http://bbs.pediy.com/showthread.php?t=61157&highlight=GetCaretPos+%E9%99%A4%E4%BA%86+%E4%BA%86%E7%94%A8+%E7%94%A8%E8%BF%98+%E8%BF%98%E6%9C%89+%E6%9C%89%E6%B2%A1+%E6%B2%A1%E6%9C%89+%E6%9C%89%E5%88%AB+%E5%88%AB%E7%9A%84+%E7%9A%84%E6%96%B9+%E6%96%B9%E6%B3%95+%E6%B3%95%E8%8E%B7+%E8%8E%B7%E5%8F%96+%E5%8F%96%E5%85%89+%E5%85%89%E6%A0%87+%E6%A0%87%E4%BD%8D+%E4%BD%8D%E7%BD%AE
'【求助】请问:除了用GetCaretPos还有没有别的方法获取光标位置?      易语言

'获得拥有输入焦点的窗口的句柄
Private Declare Function GetFocus Lib "user32" _
                () As Long
'获得前台窗口的句柄。这里的“前台窗口”是指前台应用程序的活动窗口
Private Declare Function GetForegroundWindow Lib "user32" _
                () As Long
'通常,系统内的每个线程都有自己的输入队列。本函数(既“连接线程输入函数”)允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态

Private Declare Function AttachThreadInput Lib "user32" _
                (ByVal idAttach As Long, _
                                           ByVal idAttachTo As Long, _
                                           ByVal fAttach As Long) As Long
'获取当前线程一个唯一的线程标识符
Private Declare Function GetCurrentThreadId Lib "kernel32" _
                () As Long
'获取与指定窗口关联在一起的一个进程和线程标识符
Private Declare Function GetWindowThreadProcessId Lib "user32" _
                (ByVal hwnd As Long, _
                                                  lpdwProcessId As Long) As Long
'暂停线索
Private Declare Sub Sleep Lib "kernel32" _
                (ByVal dwMilliseconds As Long)

'判断插入符的当前位置
Private Declare Function GetCaretPos Lib "user32" _
                (lpPoint As POINTAPI) As Long
Private Type POINTAPI
    x As Long
    y As Long
End Type

'判断窗口内以客户区坐标表示的一个点的屏幕坐标
Private Declare Function ClientToScreen Lib "user32" _
                (ByVal hwnd As Long, _
                                        lpPoint As POINTAPI) As Long
'这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最顶部状态
Private Declare Function SetWindowPos Lib "user32" _
                (ByVal hwnd As Long, _
                                      ByVal hWndInsertAfter As Long, _
                                      ByVal x As Long, _
                                      ByVal y As Long, _
                                      ByVal cx As Long, _
                                      ByVal cy As Long, _
                                      ByVal wFlags As Long) As Long
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_NOSIZE = &H1
Public Const SWP_SHOWWINDOW = &H40
Public Const HWND_TOPMOST = -1

 Sub Main()
 
Dim FoHandle As Long
 Dim PHandle As Long
 Dim ThisPoint As Long
 Dim Point As POINTAPI
 FoHandle = GetFocus
 PHandle = GetForegroundWindow
 AttachThreadInput GetCurrentThreadId, GetWindowThreadProcessId(PHandle, 0), 1
 ThisPoint = GetCaretPos(Point)
 
 ClientToScreen FoHandle, Point
 
 If FoHandle <> Form1.hwnd Then  '自己搞懂了,是实现了,好开心-:)
  
 Debug.Print Form1.Left
 SetWindowPos Form1.hwnd, HWND_TOPMOST, Point.x, Point.y, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_SHOWWINDOW
 
 DoEvents

 End If

 End Sub

Private Sub Timer1_Timer()
Timer1.Interval = 100 '设置成每秒触发一次事件
Call Main
End Sub
上传的附件:
2009-4-3 18:04
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册