“VBA结合Windows API方法追踪鼠标下的对象”总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
很早之间,就有小伙伴提出想学习如何通过屏幕坐标捕获鼠标位置。一直以来也没有太好的案例,因为针对Excel中数据处理,单元格就是最好的坐标,无需多此一举,因此该需求就搁置了
刚好,最近在处理word文档,会通过与鼠标配合,快速、精准地定位并捕获所需的文字,那就一起聊一聊吧
在打开电脑的瞬间,我们早已习惯了用鼠标在屏幕上“指指点点”。但你是否想过:鼠标在Word文档上滑过时,其背后竟然还隐藏着一套精密的“定位系统”呢?它不仅能告诉我们光标在哪里,更能像一位敏锐的侦探,瞬间锁定鼠标下的字、词,甚至整个段落
在Word测试文档中,通过工具栏上的“开发工具”“宏”,打开宏对话框,并选择宏名“MainPro”执行,操作步骤同Excel宏类似
在“MainPro”执行过程中,我们只需要轻轻移动鼠标,就能获取到鼠标指向的文字,即鼠标指针下方的文字想要实现以上功能,所需技能:VBA结合Windows API通过API获取鼠标的实时屏幕坐标,然后再使用Word的 ActiveWindow.RangeFromPoint 方法,实现快速、精准地获取到鼠标指向的文字2.1 操作步骤
- 选择 “插入” -> “模块”,将文中代码复制粘贴到新模块中
- 回到Word文档窗口,通过“开发工具”“宏”,选择宏名“mainPro”运行
以上操作完成后,就可以通过移动鼠标位置获取word中的文字了。为了让用户有充足的操作时间,读取时间控制在5秒钟(Sleep 5000),可根据实际情况自行调整
那有的小伙伴就说了,我的Word文档工具栏里没有“开发工具”,也不需要担心,只需要点击【文件】顺次选择【更多...】 【选项】,在打开的选项界面,选中【自定义功能区】,找到【开发工具】,打勾后选择确定即可2.2 代码实现
代码参考:
' 在模块顶部声明API函数和自定义类型,兼容32位和64位系统#If VBA7 Then Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long#Else Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long#End IfPrivate Type POINTAPI X As Long Y As LongEnd Type' 声明必要的API函数,用于延时#If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)#Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)#End IfSub MainPro() Dim endTime As Double Dim durationSeconds As Long durationSeconds = 20 ' 设置跟踪时长(秒) endTime = Timer + durationSeconds Do While Timer < endTime Sleep 5000 GetObjectByMouse ' 调用函数 DoEvents ' 转让控制权,避免程序无响应 Loop MsgBox "鼠标跟踪结束。"End SubSub GetObjectByMouse() Dim lppt As POINTAPI Dim res As Long Dim objUnderMouse As Object Dim resultText As String ' 获取当前鼠标光标在屏幕上的位置 res = GetCursorPos(lppt) ' 使用屏幕坐标,通过RangeFromPoint获取该点的对象 Set objUnderMouse = ActiveWindow.RangeFromPoint(lppt.X, lppt.Y) ' 检查获取到的对象,并选中它 If Not objUnderMouse Is Nothing Then If TypeName(objUnderMouse) = "Range" Then ' 获取指向的文字 If objUnderMouse.Words.Count > 0 Then resultText = "鼠标指向了: " & objUnderMouse.Words(1).Text Else resultText = "鼠标位置没有文字。" End If End If End If MsgBox "坐标(" & lppt.X & ", " & lppt.Y & "): " & resultTextEnd Sub
其中,在模块最上方声明了两个API函数GetCursorPos和Sleep,分别用来获取屏幕坐标和延时;接着,还声明了一个自定义类型POINTAPI,用于记录二维平面上坐标位置(屏幕左上角为原点(0,0))
由于RangeFromPoint方法可能返回"Range" 或"Shape",也可能返回 Nothing,所以使用前必须用 If 语句进行判断,并用 TypeName 函数区分类型
除了使用objUnderMouse.Words获取鼠标当前位置的字/词外,还可以通过objUnderMouse.Paragraphs获取鼠标当前位置的整个段落。有需要的小伙伴可以尝试一下
好了,今天的编程知识到此结束了,又到每日冷知识小分享时间了
今天分享的是“鼠标”:最早的鼠标是一个由木头制成的小盒子,底部装有金属滚轮,并通过一条长长的导线连接到计算机。正是这条拖在后面的长导线,让发明它的人联想到了老鼠的尾巴。于是便戏称这个新发明为“Mouse”(“老鼠”)。当这一设备传入中国后,人们根据其英文和酷似老鼠的外形,将其巧妙地意译为“鼠标”,既保留了原名的神韵,又准确反映了其作为屏幕光标定位指示器的功能
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识