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: 10

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

demo.gif


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.
1667485227655.png


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


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
1667485514388.gif
.

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

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
:mad:
apres tu essaie de me faire passer pour un "C..."

1667492002905.png


et bien sur que ca marche maintenant
demo.gif


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

alors on en a besoins du callnexthook ou pas
:mad:

:mad::mad::mad::mad:
 

Statistiques des forums

Discussions
314 667
Messages
2 111 705
Membres
111 264
dernier inscrit
Monnoye