Mouse Wheel Hook (faire défiler le contenu d'une combobox/listbox avec la roulette)

  • Initiateur de la discussion Compte Supprimé 979
  • Date de début

patricktoulon

XLDnaute Barbatruc
re
bonjour Dudu2
La détection de la position de la souris à chacun de ses mouvements
ça implique une surveillance constante et donc très gourmand en ressource

je regarderais plus en détail cette surveillance pour voir comment il fait
mais chez moi c'est sur c'est nada ça marche pas du tout
 

Dudu2

XLDnaute Barbatruc
Ok, étrange que ça ne marche pas chez toi en 2013 32 bits puisque mes tests 2010 et 2016 32 bits sont ok, mais si tu le dis...

Dans ma version (qui ne fonctionne pas non plus en 64 bits) j'avais utilisé cette méthode mais uniquement pour la sortie de la souris de la ListBox. L'entrée en Scroll étant sur l'évènement MouseMove(). Est-ce que ça plante aussi chez toi ? (fichier joint)

Concernant les ressources, j'ai regardé la CPU pendant des scrolls intensément répétés, ça monte entre 5% et 10%.
Le déplacement de la souris n'en est pas affecté, ni ralenti ni saccadé.
De toutes façons les traitements sont limités à l'analyse de coordonnées qu'on obtient assez rapidement sur une fréquence sans doute pas délirante.
 

Pièces jointes

  • VBA Scroll Souris en ListBox.xlsm
    68.3 KB · Affichages: 8
Dernière édition:

Dudu2

XLDnaute Barbatruc
Le code de Hook est plus long chez moi pour plusieurs raisons:
- J'ai ajouté la distinction VBA7 pour les Long et LongPtr ce qui rajoute des lignes​
- Le code Internet d'où je suis parti était sans doute plus long pour le Public Sub HookMouse traitant des cas spécifiques différents.​
- Je préfère ne pas mettre plusieurs instructions sur la même ligne avec le ":", donc ça rajoute aussi des lignes​
- J'ai ajouté dans Private Function LowLevelMouseProc, le code d'interception des mouvements de souris pour en comparer la position avec celle du Control en cours dans la séquence If wParam = WM_MOUSEMOVE Then pour la sortie du Scroll...qui ne marche pas en 64 bits !​

J'ai essayé ta fonction Public Sub HookMouse qui est très réduite mais quand je Scroll des ComboBox sur feuille (pas dans un UserForm), ça Scroll la ComboBox ET la feuille simultanément. Original :cool: !

Il y a un appel à une fonction dans ton code (et dans le mien auparavant) qui ne sert à rien et que tu peux mettre en commentaire.

VB:
Private Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
.../...
End If
    'LowLevelMouseProc = CallNextHookEx(0&, nCode, wParam, ByVal lParam) ---> NE SERT A RIEN
    On Error GoTo 0
End Function
 
Dernière édition:

zoumi

XLDnaute Nouveau
Bonjour,

j'ai windows 8.1 64bit et excel 2013 64 bit

j'ai l'impression que quand on passe la souris sur la listbox ca fait augmenter la charge du processeur et la mémoire au bout de quelques secondes ca fait planter Excel.
 

Pièces jointes

  • VBA Scroll Souris en ListBox.xlsm
    68.3 KB · Affichages: 4

Dudu2

XLDnaute Barbatruc
La dernière version est celle-ci qui tient une dizaine de secondes en 64 bits et finit par crasher.
Comme je suis en 32 bits où ça marche parfaitement, je ne peux pas investiguer.
 

Pièces jointes

  • VBA Scroll Souris en ListBox.xlsm
    65 KB · Affichages: 3

zoumi

XLDnaute Nouveau
La dernière version est celle-ci qui tient une dizaine de secondes en 64 bits et finit par crasher.
Comme je suis en 32 bits où ça marche parfaitement, je ne peux pas investiguer.


meme chose ca ralenti et ca doit demander un calcul de tous les point ou le curseur de la souris se déplace.
 

Pièces jointes

  • 4 modifier pour tester MouseWheelHook_v3_64bit.xlsm
    41.1 KB · Affichages: 8

Dudu2

XLDnaute Barbatruc
meme chose ca ralenti et ca doit demander un calcul de tous les point ou le curseur de la souris se déplace.
D'un point de vue algorithmique il n'y a rien de différent qu'on l'utilise en 32 bits ou en 64 bits.
En 32 bits, ça ne prend que très peu de ressource CPU et ça fonctionne. Il n'y a donc aucune raison objective pour que ça plante en 64 bits...
Sauf si des fonctions de l'API ont subi des modifs qui les rendent non fonctionnelles dans ce code.
Ou encore si des appels à ces fonctions ne sont pas faits correctement en 64 bits.
 

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
ah!! oui j'avais pas fait attention en effet même en 32 bit la version du post 127 demande beaucoup de ressource l'ors du first contact c'est un effet qui peut éventuellement faire planter excel si 4 giga de rame dans pc de serie
je viens de faire le test avec ma version et c'est un peu moins mais tout même assez lourd
je me demande si ne vaudrait il pas mettre ta liste dans un listview qui a le molette scroll en natif
certes un peu plus complexe a coder mais bon
 

biboudeli

XLDnaute Nouveau
Bonjour,

J'ai utilisé le code qu'a fait Dudu2 sur mon fichier et cela n'a pas marché comme je l'espérais : ça n'affiche même pas le déroulant :/
J'ai pourtant copié-collé, changé le nom de la combobox à chaque fois qu'il est mentionné, remplacé la plage de la liste. J'ai copié-collé à la fois ce qu'il y avait dans le code de l'userform que dans les modules. Est-ce que vous pourriez m'aiguiller sur ce que je pourrais avoir oublié ?
 

Dudu2

XLDnaute Barbatruc
Bonjour biboudeli,
C'est une vieille histoire. Ça dépend si tu es en 64 bits ou 32 bits.
Cependant, j'avais cru avoir corrigé pour que ça marche au moins en ComboBox 64 bits même si ça ne marche pas en ListBox 64 bits.
Pour les ComboBox essaie ça, sinon faut voir avec un autre code, celui de patricktoulon par exemple ou celui de chiendich

Mais avant j'aimerais bien ton retour sur ça.
 

Pièces jointes

  • VBA Scroll Souris en ComboBox.xlsm
    45.6 KB · Affichages: 9
  • VBA Scroll Souris en 3 ComboBoxes sans UserForm.xlsm
    44.7 KB · Affichages: 3
Dernière édition:

biboudeli

XLDnaute Nouveau
Merci Dudu2 :)

Je suis en 32 bits. En fait, ça marche très bien quand j'utilise ton fichier, mais quand je copie-colle tout dans le mien, ça n'a aucun effet sur la combox de mon userform.
(sauf au départ, j'avais laissé le fait que ça efface les colonne B:D pour écrire des trucs, mais j'ai dû l'enlever parce que j'ai une BDD à cet endroit dans mon fichier)

J'réessaie de retranscrire ton nouveau fichier dans le mien et j't'informe si ça marche :)
Merci beaucoup en tout cas !