You could try API code like this:
Option Explicit
Public Type POINTAPI
x As Long
y As Long
End Type
Private 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)
Private Const MOUSEEVENTF_MOVE = &H1
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4
Private Const MOUSEEVENTF_RIGHTDOWN = &H8
Private Const MOUSEEVENTF_RIGHTUP = &H10
Private Const MOUSEEVENTF_MIDDLEDOWN = &H20
Private Const MOUSEEVENTF_MIDDLEUP = &H40
Private Const MOUSEEVENTF_ABSOLUTE = &H8000
Public Declare Function GetCursorPos _
Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function SetCursorPos Lib _
"user32" (ByVal x As Long, _
ByVal y As Long) As Long
Sub SendMouseClick(Optional lX As Long = -1, _
Optional lY As Long = -1, _
Optional bRightClick As Boolean)
'NOTE: lX and lY are assumed to be Screen coordinates
' relative to the uper left corner (0, 0)
'----------------------------------------------------
Dim lFlags As Long
Dim Point As POINTAPI
Dim bReturn As Boolean
'get the mouse cursor position to return to
GetCursorPos Point
'Set cursor position
If lX > -1 Then
SetCursorPos lX, lY
bReturn = True
Else
lX = Point.x
lY = Point.y
End If
DoEvents
'Send the mouse event
If bRightClick Then
lFlags = MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_ABSOLUTE
Else
lFlags = MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE
End If
mouse_event lFlags, lX, lY, 0, 0
DoEvents
If bRightClick Then
lFlags = MOUSEEVENTF_RIGHTUP Or MOUSEEVENTF_ABSOLUTE
Else
lFlags = MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE
End If
mouse_event lFlags, lX, lY, 0, 0
DoEvents
'return to the old mouse position
If bReturn Then
SetCursorPos Point.x, Point.y
DoEvents
End If
End Sub
Function GetCursorPosition() As Variant
Dim Point As POINTAPI
Dim arr(1 To 2) As Long
'get the mouse cursor position to return to
GetCursorPos Point
arr(1) = Point.x
arr(2) = Point.y
GetCursorPosition = arr
End Function
Sub test()
SendMouseClick , , False
End Sub
RBS