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
re
je pense avoir compris l'erreur critique du scroll
dans nos versions le scrolling est effectué dans la procc relancée d'elle même
et l'erreur qui fait planter c'est l'erreur combobox
quand je sort tout dans une sub scrolling et je l'appelle de la proc
l'erreur est bien gérée par le on error resume next mais n'atteint pas la session de la procc

ce n'est pas que chez moi dudu2 et les associations dans les quelles j'ai mis ton module il ont quasiment tous 365 et 2019/2021

bon dans n'importe quel cas le fait de passer par peekmessage nous a appris beaucoup de choses en tout cas pour moi

du coup j'ai sorti tout les case dans une sub a part
1742812198413.png

et je n'ai plus du tout d'erreur grave ou moins grave dans la procc dans le debug c'est vide
demo1.gif
 
re
intéressant cet idée si le code est executé dans un autre stack memoire et si c'est possible
moi je cherche autre chose que l'api setnexthook ou set timer pour proceder de la même manière que le hook mais avec peekmessage j'ai déjà des pistes
mais pour essayer l'idée j'ai essayé avec settimer ca marche
 
Avec l'API CreateThread() je n'y arrive pas. Dans le Thread créé qui appelle la fonction de gestion du Scroll d'un Control, je perds plein d'info de contexte VBA (Le RECT du Control est tout à 0, Control.TopLeftCell est en erreur, etc...) et ça plante violemment.
Faudrait peut-être ne laisser que la boucle dans le Thread après avoir tout défini avant.
Mais je n'ai pas le courage de passer des heures d'investigation là-dessus.
 
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.
Hello,
tout d'abord il y a deux erreurs dans le code :
1 - il y a une ligne en trop au début du code dans la partie déclaration dans le #Else du #If VBA7 Then :
Code:
Private PtrSafe Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long, lpRect As RECT) As Long
A supprimer car cela fait planter la compilation.
2 - Pour le VBA 6 (ex Excel 2007) au début de CloseVBEWindow() il y a :
Code:
Dim hWnd As LongPtr
qui fait planter la compilation pour Excel 2007. Mettre à la place :
Code:
#If VBA7 Then
    Dim hWnd As LongPtr
#Else
    Dim hWnd As Long
#End If
patricktoulon, il faudrait me dire comment tu fais planter le classeur de Dudu2 , parce que moi je n'ai eu aucun plantage avec :
Excel 2007 Windows 7 SP 1
Excel 2013 32 bits Windows 10
Excel 2016 32 bits Windows 11
Excel 2021 64 bits Windows 11
Sachant qu'il ne faut pas "bricoler" ou "déboguer" dans l'Editeur VBA quand du code bas niveau est appelé.
Ami calmant, J.P
 
Dernière édition:
Avec l'API CreateThread() je n'y arrive pas. Dans le Thread créé qui appelle la fonction de gestion du Scroll d'un Control, je perds plein d'info de contexte VBA (Le RECT du Control est tout à 0, Control.TopLeftCell est en erreur, etc...) et ça plante violemment.
Faudrait peut-être ne laisser que la boucle dans le Thread après avoir tout défini avant.
Mais je n'ai pas le courage de passer des heures d'investigation là-dessus.
Pour le multithreading tu peux jeter un oeil ici mais je crois que c'est plutôt pour exécuter des calculs en parallèle. Sinon il y a peut-être la solution à Sancarn qui consiste à exécuter du code dans une nouvelle instance d'Excel. Voir son module de classe stdTimer.cls.
 
Dernière édition:
Bonjour @jurassic pork
le classeur de dudu plante au bout de 15/20 scroll c'est tout et quand ca plante malheureusement ca crash excel
si non les 20 premiers coups ca scroll

et que ce soit ma version ou celle de dudu2 elle ont un défaut majeur
c'est le captage du lparam asynchrone avec le looping en addressOf
ce qui fait que le scroll est très lent si on scroll vite

démonstration

version dudu2 avant que ca plante
comme vous le voyez il descend doucement pourtant je scroll comme un malade
demo1.gif

version patricktoulon
demo1.gif


maintenant si je scroll doucement la version de dudu2 dure un peu plus longtemps avant de planter
allez je scroll doucement
demo1.gif


pareil avec ma version mais doucement
demo1.gif


voila c'est bien pour ça que dans la version sans hook j'ai éliminé le plus possible d'action dans le looping
pour qu'il y ai le plus possible de captage du lparam
et visiblement avec les api de hooking c'est compliqué

avec settimer qui execute la proc en addressOf j'ai de meilleurs résultats
 
Bonjour @jurassic pork,
tout d'abord il y a deux erreurs dans le code :
Merci pour le signalement de ces 2 erreurs de déclarations non VBA7. J'ai corrigé la Ressource.
Pour le multithreading tu peux jeter un oeil ici
Dans mes recherches j'avais vu ce site. Mais je n'ai pas trouvé où ce type a planqué son "VBA Multithreading Tool" (free and open source tool) !
On ne fait que boucler sur la même page ou la page de Download où il n'y a rien à télécharger et juste un renvoi sur un AddIn qu'on peut effectivement télécharger.
exécuter du code dans une nouvelle instance d'Excel
Tous les exemples de MultiThreading Excel que j'ai vus sont basés sur l'exécution de plusieurs instances d'Excel.
Et quand on regarde le code de l'Addin ci-dessus, ça y ressemble fortement.

En fait je n'ai jamais vu un exemple fonctionnel de MultiThreading Excel basé sur l'API CreateThread().
Le seul exemple que j'ai trouvé se crash à la 2ème exécution et n'a pas d'intérêt puisqu'il ne fonctionne que si le créateur du Thread se met en attente de la fin du Thread, ce qui est le contraire d'un traitement parallèle.

Donc le MultiThreading Excel, à part la lourdeur des instances d'Excel, il faut oublier.
 
heu sans vouloir offenser personne là on est dans une discussion de scrolling sans hooking
si on commence a repartir sur autre chose le lecteur ne va pas comprendre
je dis ça moi je dis rien hein
peut être ouvrir une discussion sur le multithread pour un scrolling control
d'ailleurs supplanter le scrolling dans un autre thread n'est ce pas du hooking mais cette fois du thread vba lui même
enfin bref
surtout que si l'on doit revenir sur des eventuelles futures decouvertes(SANS HOOKING!!!) la lecture du post va être coupée par
des tests qui n'ont rien avoir ici
difficile de suivre la discussion dans ce cas là
trouvons la solution du code qui prime , si il y en a une ,après on pourra se lâcher sur diverses autres solutions
 
Et quel est le code que tu veux mettre dans ton thread. Je peux peut-être faire un essai avec ExcelDNA ( dotnet) ?
Mets n'importe quoi, une boucle de 1 à 10000 de Doevents.

heu sans vouloir offenser personne là on est dans une discussion de scrolling sans hooking
si on commence a repartir sur autre chose le lecteur ne va pas comprendre
Le lecteur ça fait longtemps qu'il est largué vu qu'on a fait de jolis codes qui servent à rien.
Et le MultiThread est directement lié à ces jolis codes pour tenter de les faire servir à quelque chose.

Quand tu auras fait ton code avec Hook pour Pseudo-Hook, envoie un fichier qu'on essaie.
Le mien avec Hook n'a pas bougé de place. A propos @jurassic pork, une fois les déclarations corrigées, ça marche chez toi ?
 
perso j'ai créé une autre discussion sur le problème du asynchrone avec le geste sur la mollette pour la version avec hooking
par ce c'est flagrant et j'ai testé avec tout les modules que j'ai pu trouvé sur la toile
y compris celui de @Dudu2
y compris le mien
tous sans exception ont le même défaut
pour savoir si c’était le code eventuellement a l'interieur du looping en addressOf qui ferait des calculs
j'ai tout sorti du looping apart le captage
j'ai remis le callnexthook pour le 64 bits

rien y fait c'est ici
 
je parles du defaut asynchrone avec le geste sur la roulette
tu lis pas mes messages ou quoi?
si je roule trop vitre par exemple 30 petits crans de roulette je scroll que de 1/4 item ou de 1/4 (le pas pour la frame et autre control ayant le scrolltop)
autrement dis si je vais trop vite ça scrolle 1/4
par contre quand je vais plus doucement ça scroll plus
autrement dit il y a des looping de la proc en addressof qui ne mettent pas ajour le lparam ou il n'est pas capté
mais tout ça ça se discute dans l'autre , discussion
ici pas de soucis avec le peekmessage c'est du 17/18 sur 20
 
- 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