Autres toutes versions tester le scrool avec la roulette sans passer par un hooking en addressof

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
la principal raison des crash excel quand on utilise le hooking de la souris pour avoir le mouse wheel(la roulette)
c'est que le looping avec le (CallnextHook)est asynchrone avec le captage du message de la souris
donc quand une erreur se produit(on va trop vite ou autre)
le looping lui continue parfois au moins une fois même en erreur
résultat comme on déplace le block type du message en mémoire ça crash

je vous propose de tester ceci
ici on va rester dans un do/loop vba classique et le message de la souris sera récupéré par un peekmessage
si il y a une erreur (du au message de la souris non conforme) normalement on a une erreur vba classique
et donc le do/loop est interrompu
donc pas de relance avec un message de la souris erroné donc pas de crash
Vous constaterez que j'augmente l'allocation de la mémoire aussi (64 bits double (longlong ou longPtr))(+2&)

d'autant plus que la dans cette démo je met tout dans le userform
ce qui n'est pas possible avec un code de hooking bien entendu
et ça peut avoir un avantage lorsque l'on veut distribuer un interface(userform) sans devoir l'accompagner de x modules

toujours pareil pour déterminer le rectangle je me sert de ma fonction perso du calendar que j'ai modifié pour ce besoins
donc testez et si ça fonctionne je ferais une ressource au propre

merci d'avance pour votre participation

j'en connais un qui vas ouvrir grand les yeux 🤣

Patrick
 

Pièces jointes

Solution
Bonjour @jurassic pork , @Dudu2 , @Nathe
j'ai mis le controlrelease en optionnel dans la démo (fonctionne aussi dans userform)
j'en ai profité pour mettre un multipage
et dans la page 1 du multipage j'ai mi un label violet
et c'est lui qui pilote le scroll de la page
comme ca on peut mettre un fond sur chaque page vu que ce control n'a pas de propertie backcolor
bien évidemment j'ai ajouté le textbox
dans cette démo donc on a le controlrelease optionnel
et le scroll piloté par un autre control
voila comme ça on est au même niveau que la V 3.0 avec iaccessible (All control working)

patrick
moi je trouve que pour le textbox c'est sa version qui est plus sérieuse et plus pro que les nôtres
Il a sans doute des connaissances techniques approfondie que nous, moi en tous cas, je n'ai pas.
Ce n'est pas pour autant que sa version est plus "pro". Faut pas faire de complexes.
Et je te rappelle que sa version reste une boucle qui a les même problèmes que les nôtres.
Et ce n'est QUE pour un TextBox de UserForm. Quid des autres Controls, quid de la TextBox ActiveX sans ScrollBar ?
xx.gif

Y a qu'un seul Scroll qui soit "pro" car il fonctionne en évènementiel chez tout le monde (sauf chez @patricktoulon et encore j'aimerais bien vérifier) et pour tous les Controls, c'est celui de ma ressource qu'on se le dise !
1743099573912.gif
 
ma fois ma version fonctionne sur 2013 2016 64 2021 dans 365 sauf chez dudu2 😉
et pour le coup c'est testé par des pro dans l'autre monde excel
après le tiens marche chez moi sauf qu'au bout d'un moment(la durée c'est pas régulier) ça plante excel
sans me donner quoi que se soit comme indice (fermeture brutal d'excel )
 
j'ai trouvé ou ca plante chez moi avec ton truc !!!!!🙌🙌🙌🙌
c'est en greffant point par point sur le mien que j'ai trouvé

le mien
Function GetHookStruct(ByVal lParam As LongPtr) As MSLLHOOKSTRUCT
DoEvents
CopyMemory VarPtr(udtlParamStuct), lParam, LenB(udtlParamStuct)
GetHookStruct = udtlParamStuct
End Function

le tiens

#If VBA7 Then
Private Function GetHookStruct(ByVal lParam As LongPtr) As MSLLHOOKSTRUCT
#Else
Private Function GetHookStruct(ByVal lParam As Long) As MSLLHOOKSTRUCT
#End If
CopyMemory ByVal udtlParamStuct, ByVal lParam, LenB(udtlParamStuct)
GetHookStruct = udtlParamStuct
End Function

1743105363366.png
 
Dernière édition:
re
chez moi
'Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hMod As LongPtr, ByVal dwThreadId As Long) As LongPtr
' Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As Long, lParam As LongPtr) As LongPtr
Function GetHookStruct(ByVal lParam As LongPtr) As MSLLHOOKSTRUCT
DoEvents
CopyMemory VarPtr(udtlParamStuct), lParam, LenB(udtlParamStuct)
GetHookStruct = udtlParamStuct
End Function



chez toi
'Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hMod As LongPtr, ByVal dwThreadId As Long) As LongPtr

' Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As Long, lParam As any) As LongPtr

#If VBA7 Then
Private Function GetHookStruct(ByVal lParam As LongPtr) As MSLLHOOKSTRUCT
#Else
Private Function GetHookStruct(ByVal lParam As Long) As MSLLHOOKSTRUCT
#End If
CopyMemory ByVal udtlParamStuct, ByVal lParam, LenB(udtlParamStuct)
GetHookStruct = udtlParamStuct
End Function
j'ai beau essayer c'est le crashs
le copymemory ne passe pas
j'ai essayer de mettre "any "moi aussi et Byval ca crashs
 
Je suis pas sûr d'avoir saisi. Si c'est un problème de type, ça plante dès le départ, pas après une série de scrolls.
Pour rendre le type compatible, essaie de mettre:
VB:
CopyMemory ByVal VarPtr(udtlParamStuct), ByVal lParam, LenB(udtlParamStuct)
 
varptr c'est ce que j'ai chez moi et ca marche mais sur le tiens non
because
Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr

chez moi
Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As Long, lParam As LongPtr) As LongPtr
 
Hello,
En pièces jointes
1 - Le classeur de DuDu2 avec les corrections apportées par patricktoulon
Testé OK sous :
Excel 2007 Windows 7 SP1
Excel 2013 Windows 10
Excel 2016 Windows 11
Excel 2019 Windows 10
Excel 2021 64 bits Windows 11
Dans Excel 2021 , il y a parfois des phénomènes étranges comme un ralentissement dans le scrolling pouvant aller même jusqu'à l'arrêt surtout juste après un changement de contrôle. Il y a aussi parfois un plantage VBA sur EnableCancelKey. A vérifier que je suis bien parti de l'original.

2 - Le classeur de jaafar triback corrigé pour le 64 bits
En fait c'était les fonctions HiWord64 et LoWord64 qui étaient définies pour renvoyer un Long alors qu'il fallait renvoyer un Integer.
VB:
Private Function HiWord64(ByVal DWord As LongPtr) As Integer
        CopyMemory HiWord64, ByVal VarPtr(DWord) + 2&, 4&
End Function

Private Function LoWord64(ByVal DWord As LongPtr) As Integer
    CopyMemory LoWord64, DWord, 4&
End Function
Testé OK sous :
Excel 2007 Windows 7 SP1
Excel 2013 Windows 10
Excel 2016 Windows 11
Excel 2019 Windows 10
Excel 2021 64 bits Windows 11

Ami calmant, J.P
 

Pièces jointes

Planter sur l'EnableCancelKey en VBA c'est pour le moins anormal !
Je ne pense pas qu'il soit très utile là où il est donc je le retire.
Bon je n'ai plus le plantage mais par contre le phénomène de ralentissement existe toujours. Pour le reproduire :
Dans la Feuille, dans un contrôle faire bouger la molette rapidement dans les deux sens et passer dans un autre contrôle et faire la même chosee et ainsi de suite. C'est comme si il y avait une mémorisation rémanente des actions.
Cela a l'air de se produire surtout si on passe par la textbox.
 
Dans Excel 2021 , il y a parfois des phénomènes étranges comme un ralentissement dans le scrolling pouvant aller même jusqu'à l'arrêt surtout juste après un changement de contrôle
Alors ça c'est très embêtant car pour trouver la source du problème c'est quasi-impossible.
Il n'y a rien dans le code qui temporise l'exécution.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

P
Réponses
1
Affichages
834
P
Retour