Dudu2
XLDnaute Barbatruc
Bonjour,
Pour une certaine application, j'ai été amené à autoriser le Scroll dans une ComboBox.
Le problème de ces Hook Mouse, c'est que si on sort du cadre de la ComboBox et qu'on n'a pas défait le Hook, les scrolls d'Excel et des applications ne fonctionnent plus, d'où la nécessité de bien contrôler ce système.
Pour info, je me suis livré à quelques essais et d'une manière extrêmement simple et avec 1 seul évènement on peut avoir un contrôle à 100% du Scroll ComboBox à condition d'accepter qu'il ne commence que lorsqu'on clique sur la flèche droite de la ComboBox faisant apparaitre la drop down list (plutôt que par un "Mouse Over"), ce qui est cohérent avec la logique de ce Control. De toutes façons l'évènement ComboBox1_MouseMove() n'affiche pas la drop down list donc on n'y gagne rien.
Le fichier ci-dessous affiche 2 UserForms.
- Le 1er UserFormTrace donne des infos sur les évènements liés à la ComboBox et le setting ON/OFF du Hook Mouse
- Le 2ème, UserFormModèle, est celui qui donne la manière de gérer le Scroll dans le UserForm sur la base du Module_HookMouse. qui est la bidouille savante de Hook Mouse qu'on trouve un peu partout.
Malheureusement, pour la ListBox, il n'y a pas de moyen sûr à 100% de garantir la sortie du Hook Mouse quand on sort de la ListBox.
Le seul moyen efficace d'activer le Scroll sur la ListBox c'est d'utiliser l'évènement ListBox1_MouseMove().
Le seul moyen pas très efficace de désactiver le Scroll quand on sort de la ListBox c'est d'utiliser l'évènement UserForm_MouseMove().
Hélas, si les espaces entre la ListBox et le UserForm sont faibles ou que la souris est bougée rapidement, l'évènement UserForm_MouseMove() ne se déclenche pas.
Il faut donc sécuriser la désactivation du Scroll sur les évènements ListBox1_Exit() et UserForm_QueryClose().
Mais entre-temps, si on n'est pas passé par l'évènement UserForm_MouseMove(), le Scroll des applications, y compris Excel (UserForm ouvert en vbModeless), ne fonctionne plus.
Il y aurait une façon de davantage sécuriser la sortie de ListBox, c'est de tester la position du curseur par rapport à la ListBox ou du UserForm à intervalles réguliers ou lors des Scroll. Pas forcément facile.
Edit: Je m'y suis quand même aventuré histoire de vérifier ce que ça donne. Faut voir le message 88 pour les fichiers qui font ça !
Pour une certaine application, j'ai été amené à autoriser le Scroll dans une ComboBox.
Le problème de ces Hook Mouse, c'est que si on sort du cadre de la ComboBox et qu'on n'a pas défait le Hook, les scrolls d'Excel et des applications ne fonctionnent plus, d'où la nécessité de bien contrôler ce système.
Pour info, je me suis livré à quelques essais et d'une manière extrêmement simple et avec 1 seul évènement on peut avoir un contrôle à 100% du Scroll ComboBox à condition d'accepter qu'il ne commence que lorsqu'on clique sur la flèche droite de la ComboBox faisant apparaitre la drop down list (plutôt que par un "Mouse Over"), ce qui est cohérent avec la logique de ce Control. De toutes façons l'évènement ComboBox1_MouseMove() n'affiche pas la drop down list donc on n'y gagne rien.
Le fichier ci-dessous affiche 2 UserForms.
- Le 1er UserFormTrace donne des infos sur les évènements liés à la ComboBox et le setting ON/OFF du Hook Mouse
- Le 2ème, UserFormModèle, est celui qui donne la manière de gérer le Scroll dans le UserForm sur la base du Module_HookMouse. qui est la bidouille savante de Hook Mouse qu'on trouve un peu partout.
Malheureusement, pour la ListBox, il n'y a pas de moyen sûr à 100% de garantir la sortie du Hook Mouse quand on sort de la ListBox.
Le seul moyen efficace d'activer le Scroll sur la ListBox c'est d'utiliser l'évènement ListBox1_MouseMove().
Le seul moyen pas très efficace de désactiver le Scroll quand on sort de la ListBox c'est d'utiliser l'évènement UserForm_MouseMove().
Hélas, si les espaces entre la ListBox et le UserForm sont faibles ou que la souris est bougée rapidement, l'évènement UserForm_MouseMove() ne se déclenche pas.
Il faut donc sécuriser la désactivation du Scroll sur les évènements ListBox1_Exit() et UserForm_QueryClose().
Mais entre-temps, si on n'est pas passé par l'évènement UserForm_MouseMove(), le Scroll des applications, y compris Excel (UserForm ouvert en vbModeless), ne fonctionne plus.
Il y aurait une façon de davantage sécuriser la sortie de ListBox, c'est de tester la position du curseur par rapport à la ListBox ou du UserForm à intervalles réguliers ou lors des Scroll. Pas forcément facile.
Edit: Je m'y suis quand même aventuré histoire de vérifier ce que ça donne. Faut voir le message 88 pour les fichiers qui font ça !
Dernière édition: