Bonjour LouReed
Mais ne comprenant pas tout ce que dit patrickT, je ne sais pas si cela suffira pour vous,
ce que je veux dire c'est que VBA7 n'est pas le 64 bit
et donc ptrsafe en 64 ne suffit pas
en 64 il faut mettre les variables longlong ou Longptr
et non seulement ça mais il y a des api ou les argument sont de type différent pour le 32/64 bits
par exemple tu comprendra mieux ici on va prendre l'api Windowfrompoint
tu constatera que dans ce cas je suis bien obligé de distinguer le VBA 6 du VBA7
mais aussi le 32 du 64 en VBA7
car nonseulement elle n'ont pas le même type mais en plus les arguments sont de nombres différents
et qu'il faut passer par une conversion
#If VBA7 Then 'office 2010 à 2021
#If Win64 Then 'les versions VBA7 en 64 bits
Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal point As LongLong) As LongPtr
#Else 'les versions VBA7 en 32 bits
Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As LongPtr, ByVal yPoint As LongPtr) As LongPtr
#End If
'ici pour 32 et 64 VBA
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#Else 'VB6 office 2003 à 2007
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#End If
'ce qui implique une conversion longlong to point en 64 bits
#If Win64 Then
Function PointToLongLong(point As POINTAPI) As LongLong
Dim ll As LongLong, cbLongLong As LongPtr
cbLongLong = LenB(ll)
If LenB(point) = cbLongLong Then
CopyMemory VarPtr(ll), VarPtr(point), cbLongLong
End If
PointToLongLong = ll
End Function
#End If
Private Type POINTAPI
X As Long
Y As Long
End Type
'ce qui implique que dans les macros ou fonctions utilisant cet api ,
'qu'on puissent faire le jump en 32 et 64 bits selon la version de l'utilsateur utilsant le fichier
Sub test()
Dim PA As POINTAPI
Dim hWnd As LongPtr
'Cursor position
GetCursorPos PA
#If Win64 Then
hWnd = WindowFromPoint(PointToLongLong(PA))
#Else
hWnd = WindowFromPoint(PA.X, PA.Y)
#End If
End Sub
et ce n'est qu' un exemple parmi tant d'autre