Bonjour Dudu2, Bonjour Patrick et les autres lolJ'ai amélioré la réactivité du Scroll pour la rendre totale en réduisant le contrôle d'intervalle d'appels de la LowLevelMouseProc callback function. Maintenant seuls les appels sur un Timer identique sont ignorés.
De plus, j'ai placé en priorité la condition de fermeture de la fenêtre VBE pour le 64Bits que je n'arrive toujours pas à faire avec l'API lorsque l'Accès approuvé au modèle d'objet du projet VBA n'est pas coché. Je suis obligé de le faire en activant la fenêtre VBE et en faisant Alt + F4.
Je vais placer un fichier à l'intention de toute personne souhaitant résoudre ce problème.
Là je pense qu'on approche la formule qui va bien.
'-------------------------------------------------
'Sub interne pour fermer la fenêtre VBE avec l'API
'-------------------------------------------------
Private Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim pos As POINTAPI, obj As Object, r As Range, CtL
On Error Resume Next
GetCursorPos pos
If pos.Y < rct2.Top Or pos.Y > rct2.Bottom Or pos.X < rct2.Left Or pos.X > rct2.Right Then
If TypeName(CtrlHooked.Parent) = "Worksheet" Then
If TypeName(CtrlHooked) = "ComboBox" Then
With ActiveSheet: If .OLEObjects(1).Name <> CtrlHooked.Name Then .OLEObjects(1).Activate Else .OLEObjects(2).Activate
End With
End If
Else
If Not FenpParent Is Nothing Then If FenpParent.Controls(1).Name <> CtrlHooked.Name Then FenpParent.Controls(1).SetFocus Else FenpParent.Controls(2).SetFocus
End If
UnHookMouse
Exit Function
End If
If (nCode = HC_ACTION) Then
If wParam = WM_MOUSEWHEEL Then
'LowLevelMouseProc = True 'JE BLOQUE LE CALLBACK
With CtrlHooked
Select Case TypeName(CtrlHooked) ' déplace l'ascenseur en fonction de la molette ' l'info est stockée dans lParam
Case "ListBox", "ComboBox": If GetHookStruct(lParam).mouseData > 0 Then .TopIndex = .TopIndex - 1 Else .TopIndex = .TopIndex + 1
Case "Frame": If GetHookStruct(lParam).mouseData > 0 Then .ScrollTop = .ScrollTop - 3 Else .ScrollTop = .ScrollTop + 3
End Select
End With
End If
Exit Function
End If
DoEvents
' JE FAIT UN NOUVEL APPEL AVEC CALLNEXTHOOKEX
LowLevelMouseProc = CallNextHookEx(0&, nCode, wParam, ByVal lParam)
On Error GoTo 0
End Function
Oui c'est dududu, et je suis très fier de l'avoir codée il y a 1 ou 2 ans, elle m'a servi à plusieurs reprises.intéressant la fonction "GetWindowByPartialName" ca peut servir pour plein de chose
Bonsoir Dudu2Assez rigolé les Scrollers fous !Revenons, aux choses sérieuses.
J'ai trouvé par hasard sur Internet ici, un appel d'API qui ferme la fenêtre VBE sans faire de dégâts collatéraux comme le DestroyWindow (après on peut plus rien faire car Mémoire insuffisante) ou le SendMessage WM_CLOSE (qui ferme tout Excel).
Les 64Bits, essayez d'ouvrir l'éditeur VBA (Alt + F11) puis positionnez la souris sur un Control sous Scroll, vous verrez, je vais vous le dézinguer vite fait Regarde la pièce jointe 1154149.
Du coup, je couvre proprement la fermeture du VBE de manière rapide et transparente même si l'accès aux macros n'est pas autorisé. Ceci dit je ne contrôle la présence de la fenêtre VBE que toutes les 3 secondes.
Et là, je vois plus trop ce que je pourrais améliorer.