Option Explicit
Private WithEvents LB As MSForms.ListBox
Private Type POINTAPI
X As Long
Y As Long
End Type
#If VBA7 Then
Private Declare PtrSafe Function DispCallFunc Lib "OleAut32.dll" ( _
ByVal pvInstance As LongPtr, _
ByVal oVft As LongPtr, _
ByVal cc As Long, _
ByVal vtReturn As Integer, _
ByVal cActuals As Long, _
ByVal prgvt As LongPtr, _
ByVal prgpvarg As LongPtr, _
ByVal pvargResult As LongPtr _
) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
Private lEventProcAddr As LongPtr
#Else
Private Declare Function DispCallFunc Lib "OleAut32.dll" ( _
ByVal pvInstance As Long, _
ByVal oVft As Long, _
ByVal cc As Long, _
ByVal vtReturn As Integer, _
ByVal cActuals As Long, _
ByVal prgvt As Long, _
ByVal prgpvarg As Long, _
ByVal pvargResult As Long _
) As Long
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
Private lEventProcAddr As Long
#End If
Private Sub LB_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Const CC_STDCALL = 4&
Dim tCurPos As POINTAPI, oiA As IAccessible, vKid As Variant
Dim vArgArray(5) As Variant, varTypes() As Integer, result As Variant, i As Long
#If Win64 Then
Dim varPointers() As LongLong
#Else
Dim varPointers() As Long
#End If
If Button = 1 Then
GetCursorPos tCurPos
Set oiA = LB
vKid = oiA.accHitTest(tCurPos.X, tCurPos.Y)
Set vArgArray(0) = CVar(LB)
vArgArray(1) = CVar(vKid - 1)
vArgArray(2) = CVar(Shift)
vArgArray(3) = CVar(X)
vArgArray(4) = CVar(Y)
For i = 0 To 4
ReDim Preserve varTypes(i)
ReDim Preserve varPointers(i)
varTypes(i) = VarType(vArgArray(i))
varPointers(i) = VarPtr(vArgArray(i))
Next i
Call DispCallFunc( _
0, _
lEventProcAddr, _
CC_STDCALL, _
VbVarType.vbDouble, _
5, _
VarPtr(varTypes(0)), _
VarPtr(varPointers(0)), _
VarPtr(result))
End If
End Sub
#If Win64 Then
Public Sub Attatch(ByVal ListBox As MSForms.ListBox, ByVal ClickEventProcAddr As LongLong)
#Else
Public Sub Attatch(ByVal ListBox As MSForms.ListBox, ByVal ClickEventProcAddr As Long)
#End If
Set LB = ListBox
lEventProcAddr = ClickEventProcAddr
End Sub