Autres tester le scroll de la frame

patricktoulon

XLDnaute Barbatruc
bonjour à tous
est ce que plusieurs d'entre vous pourraient tester le scroll de la frame avec la mollette sur des versions 365 2019 et 2021 svp
merci pour les retours
 

Pièces jointes

  • scrollexemple 2.xlsm
    25.8 KB · Affichages: 13

patricktoulon

XLDnaute Barbatruc
remplacer tout le cod e
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'*******************************************
'hook mouse simplifié (molete souris sur frame)
'défilement dans controls liste frame
'author:patricktoulon

'Sub Frame2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' rouletambour Frame2
'End Sub
'**********************************

Option Explicit

Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As LongPtr, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As LongPtr) As LongPtr
Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As LongPtr, ByVal wParam As LongPtr, lParam As LongPtr) As LongPtr
Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As LongPtr
Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Type POINTAPI: X As Long: Y As Long: End Type
Private Type MSLLHOOKSTRUCT:
    pt As POINTAPI
         mouseData As Long
    flags As Long
    time As Long
    dwExtraInfo As Long
End Type
Const HC_ACTION = 0
Const WH_MOUSE_LL = 14
Const WM_MOUSEWHEEL = &H20A
Public udtlParamStuct As MSLLHOOKSTRUCT
Public plHooking As Long         ' permet de savoir si le hook est activé ou pas
Public CtrlHooked As Object         ' sera associé à la ListBox

Public pos As POINTAPI
Public EpC As Variant

Sub rouletambour(obj)
    'si ca n'a pas démarrer on demarre  le hook
    If Not CtrlHooked Is Nothing Then If CtrlHooked.Name <> obj.Name Then UnHookMouse
    Call HookMouse(obj)
End Sub
'
Function GetHookStruct(ByVal lParam As Long) As MSLLHOOKSTRUCT
    CopyMemory VarPtr(udtlParamStuct), lParam, LenB(udtlParamStuct)
    GetHookStruct = udtlParamStuct
End Function

Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'On Error Resume Next    'en cas de mouvement très rapide,'évitons les crash en désactivant les erreurs
    Dim Criter, i&
    GetCursorPos pos
    Criter = pos.X > EpC(0) And pos.X < EpC(2) And pos.Y > EpC(1) And pos.Y < EpC(3)    'recupère les coordonnée en pixel (left/top/right/bottom du control)
    If Not Criter Then UnHookMouse  'quand on est plus dans le périmètre du control bye bye !!
    If (nCode = HC_ACTION) Then
        If wParam = WM_MOUSEWHEEL Then
            LowLevelMouseProc = True
            With CtrlHooked
                If GetHookStruct(lParam).mouseData > 0 Then .ScrollTop = .ScrollTop - 45 Else .ScrollTop = .ScrollTop + 45
            End With
        End If
        Exit Function
    End If
    'LowLevelMouseProc = CallNextHookEx(0&, nCode, wParam, ByVal lParam)
    On Error GoTo 0
End Function
Public Sub HookMouse(ByVal ControlToScroll As Object, Optional ByVal FormName As String)
    If plHooking < 1 Then    ' active le hook s'il n'avait pas déjà été activé
        EpC = EmplacementControl(ControlToScroll)    'on choppe le rectangle du control par raport à l'ecran(pas du parent!!!!) du control dans un array
        Set CtrlHooked = ControlToScroll
        plHooking = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, 0, 0)
    End If
End Sub
Public Sub UnHookMouse()
    ' désactive le hook s'il existe
    If plHooking <> 0 Then UnhookWindowsHookEx plHooking: plHooking = 0: Set CtrlHooked = Nothing
End Sub
' fonction du calendar reconvertie
Function EmplacementControl(obj As Object)
    If Not obj Is Nothing Then
        Dim Lft As Double, Ltop As Double, P As Object, PInsWidth As Double, PInsHeight As Double, K As Double, PPx, A, z
        Lft = obj.Left: Ltop = obj.Top: Set P = obj.Parent    ' Normalement Page, Frame ou UserForm
        With CreateObject("WScript.Shell"): PPx = 1 / (.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager\LastLoadedDPI") / 72): End With
        Do
            PInsWidth = P.InsideWidth: PInsHeight = P.InsideHeight        ' Le Page en est pourvu, mais pas le Multipage.
            If TypeOf P Is MSForms.Page Then Set P = P.Parent        ' Prend le Multipage, car le Page est sans positionnement.
            K = (P.Width - PInsWidth) / 2: Lft = (Lft + P.Left + K): Ltop = (Ltop + P.Top + P.Height - K - PInsHeight)
            If Not (TypeOf P Is MSForms.Frame Or TypeOf P Is MSForms.MultiPage) Then Exit Do
            Set P = P.Parent
        Loop
        EmplacementControl = Array(Lft / PPx, Ltop / PPx, (Lft + obj.Width) / PPx, (Ltop + obj.Height) / PPx)
    End If
End Function
 

patricktoulon

XLDnaute Barbatruc
ben oui mais que veux tu
si il faut faire deux modules je suis pas d'accords
il me manque juste ça (juste pour 64) on a beau faire selon les version c'est longlong d'autre c'est longptr
au moins avec 32 pas de soucis
pour 4 api qui se battent en duel c'est la Bérézina sur 64
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
Bon ça se précise
je me suis rendu compte que le problème etait dans la structure du hook de la souris
en effet quand on arrive a le faire marcher sur 64 (même si on a que la descente et que ça plante pas )
c'est en modifiant la variable type pour la structure
du coup avec mes expériences j'ai réussi a causer les même problèmes qu'avec 64(la mollette descend dans les deux sens)
ce qui m'a permis de cibler sur quoi m'attaquer
alors du coup j'ai regardé un peu partout
donc les point c'est bien "As pointApi" et non LongLong
cela dit flag et time sont visible générateur d'erreur en addressof ça pardonne pas vous connaissez le résultat
dont pour ceux qui serait intéressés a aller jusqu'au bout et faire marcher ce code simple en 64
je les invite a faire des tes et des recherches en parallèle
merci à ceux qui s'invertiront dans cette quête
VB:
'Switch 64/32 pour la structure du hook de la souris
#If Win64 Then
    Private Type MSLLHOOKSTRUCT:
       'c'est dans cette partie qu'il faut trouver la faille
        pt As POINTAPI
        mouseData As Long
        flags As Long
        time As Long
        dwExtraInfo As LongPtr
    End Type
#Else
    Private Type MSLLHOOKSTRUCT:
        'valable pour tout les version 32 d'excel vba7 ou vba 6
        'pour 32 ne pas déplacer mousedata et dwExtraInfo car soit ça crashe soit le scroll  ne fonctionne qu'en descente
        pt As POINTAPI
        mouseData As Long
        flags As Long
        time As Long
        dwExtraInfo As Long
    End Type
#End If
 

Pièces jointes

  • scrollexemple 2.xlsm
    27.6 KB · Affichages: 2
Dernière édition:

Cousinhub

XLDnaute Barbatruc
Inactif
Hello,
Débogage/Compiler le projet :

1716274286379.png
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 139
Membres
112 669
dernier inscrit
Guigui2502