Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Molette Scroll sur ListBox

gg13

XLDnaute Occasionnel
Bonjour,

Je commence un nouveau projet pour lequel je devrai utiliser des ListBox et ComboBox.
Ces listes seront longues et je voudrais utiliser le scroll de la molette plutôt que les ascenseurs.

Après renseignement sur le site j’ai voulu utiliser ce post :
Mouse Wheel Hook (faire défiler le contenu d'une combobox/listbox avec la roulette)

Je galère depuis 2 jours et malgré plusieurs essais je n’arrive pas à intégrer ces différentes macros, plusieurs messages d’erreurs ….
Je ne comprends pas tout.
Si vous pouvez m’aider un peu je vous remercie d’avance.

Je joins le fichier exemple avec les listBox .

GG13
 

Pièces jointes

  • NBA1.3.xlsm
    37.6 KB · Affichages: 9

patricktoulon

XLDnaute Barbatruc
Allez tu es prêt?
voila je reprend ton fichier 9
1 je met tout ce tointoin de gasestion d'erreur en commentaire
2 j'ajoute le callback au bon endroit!!!!!!!!!!!!
3 je bloque en comentaire ausi le callnexthook DEFINITIVEMENT(du moins pour les tests )

voici ta fonction(ca fait beaucoup de vert )
VB:
'https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644986(v=vs.85)
Private Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Dim Bool As Boolean
    Dim ErrNumber As Long
    'Dim Obj As Object
    Dim TopIndex As Long
    'Dim DoNotCallNextHook As Boolean
   ' Static LastTimer As Single
    
    'Test validité du ControlHooked
    'On Error Resume Next
    'Set Obj = ControlHooked
    'ErrNumber = Err.Number: Debug.Print "ControlHooked est le control: erreur " & ErrNumber
    'On Error GoTo 0
    
    'Le ControlHooked a disparu (UserForm fermé Alt + F4 par exemple)
    'If ErrNumber <> 0 Or ControlHooked Is Nothing Then
       ' Call UnHookMouse
   ' Else
        If nCode = HC_ACTION Then
            'If Int((Timer - LastTimer) * 100) >= 0 Then
                If wParam = WM_MOUSEMOVE Then
                     'Debug.Print "addresse structure hookmouse:" & lParam
                    'DoNotCallNextHook = True
                    
                    'Either on WM_MOUSEMOVE or on WM_MOUSEWHEEL
                    GoSub CheckMouseIsOverTheBox
                End If
                
                If wParam = WM_MOUSEWHEEL Then
                  LowLevelMouseProc = 1 ' la fonction est récursive!!!!!!!!!!!!!!!!!
                    'DoNotCallNextHook = True
                    
                    'Either on WM_MOUSEMOVE or on WM_MOUSEWHEEL
                    'GoSub CheckMouseIsOverTheBox

                    If Not plHooking = 0 Then
                    
                        With ControlHooked
                            'Is the Window still there ?
                            TopIndex = .TopIndex
                            
                            On Error Resume Next
                            .TopIndex = 0: Debug.Print "erreur topindex"
                            ErrNumber = Err.Number
                            On Error GoTo 0
                            
                            If ErrNumber <> 0 Then
                                Call UnHookMouse
                                Exit Function
                            End If
                            
                            .TopIndex = TopIndex
                            
                            'Moves the ScrollBar depending on the mouse wheel, Info is stored in lParam
                                If GetHookStruct(lParam).mouseData > 0 Then
                                  If .TopIndex < ScrollStep Then .TopIndex = 0 Else .TopIndex = .TopIndex - ScrollStep
                                Else
                                .TopIndex = .TopIndex + ScrollStep
                                End If
                        End With
                    End If
                'End If
            'End If
        End If
    End If

    'If Not DoNotCallNextHook Then
        'Debug.Print "rappel de secour"
        'LowLevelMouseProc = CallNextHookEx(0&, nCode, wParam, ByVal lParam)
    'End If
    
    'LastTimer = Timer
    Exit Function
    
CheckMouseIsOverTheBox:
    If Not ControlHooked Is Nothing Then
        On Error Resume Next
        Bool = MouseIsOverTheBox: Debug.Print "MouseIsOverTheBox " & Bool
        ErrNumber = Err.Number:: Debug.Print "MouseIsOverTheBox " & ErrNumber
        On Error GoTo 0

        'Run time Error 57097: le résultat de l'appel à la fonction MouseMoveFunction() n'est pas significatif, on oublie !
        If ErrNumber <> 57097 Then
            If ErrNumber = 0 Then
                'The mouse is not anymore over the ControlHooked Object
                If Not Bool Then
                    Call UnHookMouse
                End If
            End If
        End If
    End If
    Return
End Function

maintenant je vais tester avec le VBE ouvert et tout i couinti



alors tu va m'ecouter non de dieu ou pas ????
 

Dudu2

XLDnaute Barbatruc
Sinon, je me suis donné la peine de ré-installer mon vieil Office 2013 32 Bits.


Ben vous savez quoi ? Ça fonctionne parfaitement sans aucune modif .


Alors vous savez quoi ?
Les config à la mors moi le nez qui soit disant Scroll tout, pas la peine de se prendre la tête, on va bypasser et dire qu'on ne traite pas ce genre de cas .

Et voilà. Maintenant je reviens sur mon Office 2016 64 Bits.
Mission terminée.
 

Dudu2

XLDnaute Barbatruc
En fait, cette histoire de WM_MOUSEWHEEL qui parvient à la feuille, ça n'a sans doute pas à voir avec Office.
C'est un truc très probablement Windows puisqu'on parle ici des fonctions API utilsées pour Hooker.
 

Dudu2

XLDnaute Barbatruc
Bon, mon @patricktoulon, pour appliquer ton système de Return True de la LowLevelMouseProc(), je l'ai mis en place pour le WM_MOUSEWHEEL uniquement. Car si je l'applique au WM_MOUSEMOVE la souris ne bouge plus une fois dans le Control.

Peux-tu me dire ce que ça donne chez toi ?
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox.xlsm
    67.4 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
re
et bien sur !!!!!que c'est sur le mousewell!!!!
c'est levent qui nous concerné non ???


quand je dis que tu lis pas vraiment mes messages post #346

apres tu essaie de me faire passer pour un "C..."



et bien sur que ca marche maintenant


Alléluia!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

alors on en a besoins du callnexthook ou pas

 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…