如何在Excel VBA中模拟对外部应用特定区域的右键点击?
解决Excel VBA模拟外部应用右键点击的问题
嘿,我懂你现在的麻烦——SendKeys确实搞不定右键点击,它压根没对应的按键指令。要搞定外部应用的右键模拟,得靠Windows API来实现鼠标的物理点击动作,这才是靠谱的路子。
第一步:先在VBA模块顶部添加API声明
把这段代码放在所有子过程的外面(比如模块最开头),它用来调用系统的鼠标控制功能:
#If VBA7 Then Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long #Else Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long #End If Const MOUSEEVENTF_RIGHTDOWN = &H8 Const MOUSEEVENTF_RIGHTUP = &H10
这段代码兼容32位和64位的Office,不用怕版本问题。
第二步:在你需要右键的位置插入核心代码
把下面这段代码替换掉你注释的'this is where I would like to put the right click code部分:
' 1. 先把鼠标移动到外部应用的目标位置(这里的X、Y是屏幕绝对坐标,你需要自己改成实际位置) SetCursorPos 100, 200 ' 示例坐标,你得换成你要点击的位置的真实坐标 Sleep 200 ' 给鼠标移动留一点时间,确保到位 ' 2. 模拟右键按下和释放的动作 mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 Sleep 100 mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 Sleep 300 ' 等待右键菜单弹出
小提示:怎么获取目标位置的坐标?
你可以用Windows自带的「放大镜」工具(打开后在选项里勾选「显示鼠标指针位置」),或者随便找个小的鼠标坐标工具,把鼠标移到外部应用的目标位置,记下对应的X、Y数值就行。
修改后的完整代码参考
' 先放API声明和常量(模块顶部) #If VBA7 Then Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long #Else Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long #End If Const MOUSEEVENTF_RIGHTDOWN = &H8 Const MOUSEEVENTF_RIGHTUP = &H10 Sub YourMacroName() ' 替换成你的宏名称 Set DataSheet = Workbooks("Deactivate Lines v 1 Jan 2020.xlsm").Sheets("Deactivation") Dim ItemCode As String Dim Status As String ItemCode = ActiveCell.Value Status = ActiveCell.Offset(0, 1) AppActivate "Boots - KiSoft NAVIGATOR" Sleep 350 Application.SendKeys "{F3}", True Sleep 1000 Application.SendKeys "{tab 2}", True Sleep 350 Application.SendKeys (ItemCode), True Sleep 350 Application.SendKeys ("~"), True Sleep 350 ' --- 这里是插入的右键点击代码 --- SetCursorPos 100, 200 ' 替换成实际目标坐标 Sleep 200 mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 Sleep 100 mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 Sleep 300 ' --- 右键点击代码结束 --- ' 如果需要从右键菜单选选项,后面可以继续用SendKeys,比如按方向键+回车 ' 示例:Application.SendKeys "{DOWN 2}", True ' 向下选2个选项 ' Application.SendKeys "~", True End Sub
额外注意事项
- 一定要确保
Sleep的时间足够,因为外部应用的响应速度可能不一样,要是菜单没弹出来就按按键,肯定没用。 - 如果你的外部应用窗口位置会变化,那固定坐标就不太好用了,这时候可能需要额外的API来获取窗口的位置,再计算相对坐标,但这个是进阶需求,先搞定固定坐标的情况再说。
内容的提问来源于stack exchange,提问作者jamieake
相关产品推荐
相关产品推荐

