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
Sur mon Excel 2016 64 bits Desktop, c'est bien ce que me dit Everyting -> C:\Program Files\Microsoft Office\root\vfs\System
Par contre sur mon Laptop excel 2016 32 bits, Everyting le liste en C:\Windows\SysWOW64. Le Setup date de 2022.

1742567746797.png
 
Sur mon Excel 2016 64 bits Desktop, c'est bien ce que me dit Everyting -> C:\Program Files\Microsoft Office\root\vfs\System
Par contre sur mon Laptop excel 2016 32 bits, Everyting le liste en C:\Windows\SysWOW64. Le Setup date de 2022.

Regarde la pièce jointe 1214956
tu n'as pas de répertoire Microsoft Office\root\vfs dans Program Files(x86) (et pas dans Program Files) avec ton Excel 2016 32 bits ? Moi avec mon Excel 2016 32 bits j'en ai un.
 
Ah si, en forçant la reconstruction de l'index d'Everything, c'est aussi dans C:\Program Files(x86)\Microsoft Office\root\vfs\SystelX86, tu as raison ! Et c'est bien la même version 16.0.18429.20044, bien plus récente que dans C:\Windows\SysWOW64
 
re
j'ai remplacé la fm120 par celle de @Dudu2 j'ai renommer l'original en back dans le syswow64
j'ai retelechagé un fichier de dudu en page 24
et ca double plus
mai je comfirme que ce scroll que la combobox
1742575738763.png

je parle du fichier de ce post
 
bonjour
tu dis ça comme si je le faisait exprès
c'est peut être tout simplement impossible entre deux version office trop éloignées
et qui sait c'est peut être aussi qu'il faut changer les 3 et pas seulement la FM20 mais aussi la FM20NU et la FM20FRA etc...
 
tu dis ça comme si je le faisait exprès
Bien sûr que non, mais je sais par expérience que ton environnement est assez particulier.

Je pourrais d'ailleurs faire une 3ème version qui n'utiliserait que ces 2 fonctions à la place du IUIAElement.CurrentBoundingRectangle.
Sitôt tôt dit sitôt fait ! C'est exactement la même logique qu'avec l'UIAutomation mais au lieu de chopper le RECT des Controls avec IUIAElement.CurrentBoundingRectangle. on l'obtient avec les 2 fonctions:
- GetActiveXControlRECT
- GetUserFormControlRECT

Le WindowFromPoint() n'est là que pour récupérer la Window de la ComboBox DropDown, sinon tout est basé sur le RECT de ces 2 fonctions.

Edit: il faut faire attention à une chose pour les Controls de UserForm.
Si on ferme le UserForm alors qu'un Scroll est en cours et que la souris reste sur le RECT du Control scrollé (qui a disparu), un petit tour de molette va provoquer une erreur évidemment. Il faut donc protéger ce cas.

Fichier -> voir plus loin
 
Dernière édition:
Hello,
n'importe comment la listBox dans Excel2013 a des soucis avec Windows 10 et les changements de résolution et de mise à l'échelle.
J'ai créé un classeur qu'avec une ListBox sous Excel 2013 res 1920x1080 mae : 100% et avec un FM20.dll 15.0 (celle d'Excel 2013)
SI je me mets en échelle 125 % voici ce qui se passe pour la ListBox :
ListBoxXl2013.gif


Ami calmant, J.P
 
re
@jurassic pork je pense ça vient de windows aussi

alors pour la V4
SANS LIBRAIRIE A PART CELLE POUR LE PEEKMESSAGE
le principe :
  1. j'utilise ma fonction getrectangle (pointsToScreenPixels(x,y) pour les controls sur feuille
  2. j'utilise ma fonction GetURectangle(issue du calendar et reconverti) pour les controls dans userform
  3. les rectangles sont mémorisés des le first move
  4. la fonction IsScrollable contrôle seulement si le curseur se trouve dans ce rectangle
  5. si oui on reste dans le do/loop avec le peekmessage
  6. sinon on sort et on réinitialise les variables (Actualcontrol=nothing,etc..)


néanmoins POUR LA COMBOBOX!!
comme je n’ai pas de moyen de détecter si elle est développé des le first move(comme avec le Iccessible et le .accRole=33) il m'a fallu trouver la parade sinon des le first move le do/loop est lancé et je ne peux plus la développer
et bien j'utilise un event en plus qui est le dropbutton_Click
et dans cet events je change simplement le dropbutton style (de la flèche je passe au trait d'union)
parti de la dans la mousewheel , j'ai le moyen de déterminer si elle est développée ou pas pour lancer le do/loop ou sortir ou arrêter si elle est en cours de route

Terminé
 
- 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