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
Si t'es obligé d'arrêter le Scroll à la moindre manip, c'est plus jouable. Le code n'est plus standard.
Bon, tout n'est pas négatif, car j'ai beaucoup appris sur le localisation des Controls par leur position ou par UIAutomation.
Mais quand même... !
 
J'ai ajouté les UserForm, Frame et MultiPage dans ma ressource de Scroll avec Hook. Ça a l'air de très bien fonctionner.
Dans un code pour un "utilisateur" utilisé pour test, je n'ai pas les ennuis que j'ai avec le code sans Hook développé ici qui n'est pas évènementiel.

Même si le Scroll Hook a l'inconvénient de parfois planter Excel violemment si il est actif et qu'une erreur VBA survient (pendant les tests en principe), je n'ai jamais eu de problème rapporté avec ma ressource de Scroll Hook ni pour mes "utilisateurs".

Donc pour moi, le Scroll Hook reste la référence, et c'est bien dommage car on avait bien travaillé !
 
re
ma fois tu a de la chance
car ton module plante chez moi et chez des clients qui l'ont dans leur projet avec diverses configs donc ce n'est pas propre a ma config mais a autre choses que j'ignore et que tu maitrise pas
cela dit setnexthook et callnexthook n'ont pas leur réputation pour rien même MS déconseille de faire du hooking en vba
et ça c'est pas arrangé avec les version récentes d'office

pour info j'ai essayé de remplir des textbox par vba pendant que ça tourne sur un autre controls et ça fonctionne
donc chez toi si ça ne fonctionne pas c'est qu'il y a un soucis avec le doevents qui ne joue pas son role

après tu fait comme tu veux
 
pour te donner une idée de la fiabilité plus que douteuse
cette déclaration qui fonctionne sur toute les version que l'on a fait ici32/64 bits
VB:
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
ne fonctionne pas dans le module de hooking

celle ci oui fonctionne dans le hooking
Code:
'Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
et ce n'est qu'un exemple parmi tant d'autres
 
Bonjour la polémique,
et ce n'est qu'un exemple parmi tant d'autres
J'ai mis LongPtr dans le CopyMemory parce que je passe les arguments en direct.
Si je déclare Any je préfixe les arguments par ByVal
VB:
CopyMemory ByVal VarPtr(udtlParamStuct), ByVal lParam, LenB(udtlParamStuct)
Ah oui alors ça c'est bien "exemple parmi tant d'autres" ! Quand on ne sait pas de quoi on parle, on ne la ramène pas.

car ton module plante chez moi et chez des clients qui l'ont dans leur projet
Les "clients" dont tu parles j'aimerais bien savoir de qui il s'agit.
Chez mes "clients" à moi qui sont bien réels et qui utilisent mes macros, ça fonctionne parfaitement. Et chez les 256 personnes qui l'ont téléchargé. Alors que ça ne marche pas chez toi (que tu dis) ben c'est dommage mais ça ne me fait pas bouger l'autre ! 😎

Edit: reste que le système avec la boucle de Scroll est boiteux. Des choses fonctionnent en parallèle mais pas tout, je l'ai expérimenté sur un contexte moins simple que du Scroll de base et ça bloque. En tous cas c'est une source d'emm*rdes et pour une utilisation générale mon choix de méthode est fait. Après chacun choisit.
 
Dernière édition:
reste que le système avec la boucle de Scroll est boiteux
Par contre, si on déporte le code dans une Classe, ça va beaucoup mieux car il n'y a pas de compétition entre la Classe et les Modules VBA.
Le cas bloquant cité ci-dessus dans un contexte plus complexe qu'un simple Scroll ne l'est plus avec la Classe.
Il faut encore le valider avec des tests complémentaires mais c'est peut-être la solution.
 

Pièces jointes

re
je te jure que des fois je n'ai pas envie de me creuser la tète et je met ton module
surtout pour des personne qui utilisent des versions récentes
tous m'ont rappelé

les deux exemple que je t'ai donné ne vienne pas de ton code mais des miens
j'en ai avec any et d'autres avec long ou longPtr
et les deux fonctionnent
pourtant j'envoie bien un varptr(xxxx) dans les deux et any est sensé tout accepter
par contre ca ne fonctionne dans le sans hook

et vice et versa le longptr ne fonctionne pas dans le model sans hook
va comprendre charle

après avec le hook j'ai mon model que tu trouve ici sous mon nouveau pseudo sur DVP qui est plus stable mais moins
performant que le sans hook
je n'ai pas encore reçu de retour negatifs avec celui là
mais on le voit bien ce n'est pas fluide comme avec le tien d'ailleurs
je suis sur que tu a du faire la comparaison avec le scroll de ton modèle avec hooket tu a du voir la différence non?


pour la classe oui c'est évident qu'il y a moins d'interférence avec le reste du vba
j'y pensait hier d'ailleurs quand tu a commencer a soulever ce détail
 
tous m'ont rappelé
Alors ils téléchargent ma Ressource et au lieu de poster un message dans la Discussion de la Ressource ou de m'envoyer un mail perso, ils te contactent toi ! Tu dois être une vrai célébrité ! 😅

Sinon, j'ai testé la Classe en lançant du code en parallèle et c'est pas encore ça.

Test avec Hook -> Quand on Scroll, le code s'exécute en parallèle (la colonne F se remplit)
test2.gif


Test avec Loop-> Quand on Scroll, le code NE s'exécute PAS en parallèle (la colonne F se remplit uniquement quand on sort du Scroll)
test1.gif


Donc la Classe -> Faux espoir
 
re
non il ne télécharge pas c'est moi qui leur ai mi dans leur fichiers

bon ben alors on saura que du code ne peut s'executer en parallèlle

je vais reprendre mon module hook et faire ce que l'on a fait ici
a savoir traiter le scrollable rectangle,etc avant de looper dans la procc
on verra bien

actuellement
ton module hook chez moi avant de me cracher excel scroll 5/7 fois pour 10 crans de roullette
le mien a peine un peu plus 6/8 mais ne crashe pas chez moi
ceux d'ici sans hook tes versions ou les miennes c'est quasiment du perfect
 
ton module hook chez moi avant de me cracher excel scroll 5/7 fois pour 10 crans de roullette
Comme je te l'ai déjà dit, y a que chez toi que ça plante. Pas pour mes "utilisateurs" ni pour les 250+ personnes qui l'ont téléchargé.

Pour ceux qui voudraient le vérifier, le fichier est à télécharger ici.
Il inclut maintenant le Scroll UserForm, Frame et MultiPage et les derniers modules de détection des RECT des Controls.
 
- 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
801
P
Retour