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

Dranreb

XLDnaute Barbatruc
Bonjour.
Bien. moi je n'en ai toujours pas. Et le CopyMemory ne plante pas, écrit comme ça ?
Je subodore qu'il y a par ailleurs certains LongPtr inutiles. À ce qu'il semble, c'est inutile pour les handle Windows et les Function qui ne retournent qu'un code de bonne exécution.
 

Gégé-45550

XLDnaute Accro
Bonjour ... et bravo.
J'utilise Excel 365 Pro, donc à jour.

Pour qu'Excel ne "plante" pas, j'ai du modifier la déclaration de la Sub CopyMemory comme ceci :
VB:
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
et modifier le type de la fonction LowLevelMouseProc en LongPtr, comme ceci :
Code:
Function LowLevelMouseProc _
  (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPtr
À partir de là, ça fonctionne correctement à part quelques scories peu gênantes (par exemple, si en cours de défilement dans la TextBox, on sort le curseur de la zone de défilement puis qu'on y revient, la roulette devient inopérante).
En dehors de ces menus détails, bravo ! Quel boulot !

Cordialement,
 
C

Compte Supprimé 979

Guest
Salut Gégé+45550

Pour qu'Excel ne "plante" pas, j'ai du modifier la déclaration de la Sub CopyMemory comme ceci :
VB:
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
et modifier le type de la fonction LowLevelMouseProc en LongPtr, comme ceci :
Code:
Function LowLevelMouseProc _
  (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPtr
Etrange, su mon PC pro sur lequel j'ai également O365, le fichier que j'ai mis dans mon 1er post ne plante pas
Alors pourquoi plante t'il chez toi !?

À partir de là, ça fonctionne correctement à part quelques scories peu gênantes (par exemple, si en cours de défilement dans la Combobox, on sort le curseur de la zone de défilement puis qu'on y revient, la roulette devient inopérante).
C'est corrigé avec une amélioration... affichage et défilement directe de la liste au passage de la souris

En dehors de ces menus détails, bravo ! Quel boulot !
Merci, mais je n'ai pas été seul sur le sujet

J'ai modifié le fichier 64bits (passé en version C), comme ça plus de problèmes (normalement) avec les déclarations, pour les prochains utilisateurs

@+
 
Dernière modification par un modérateur:

Gégé-45550

XLDnaute Accro
Salut Gégé+45550


Etrange, su mon PC pro sur lequel j'ai également O365, le fichier que j'ai mis dans mon 1er post ne plante pas
Alors pourquoi plante t'il chez toi !?


C'est corrigé avec une amélioration... affichage et défilement directe de la liste au passage de la souris


Merci, mais je n'ai pas été seul sur le sujet

J'ai modifié le fichier 64bits (passé en version C), comme ça plus de problèmes (normalement) avec les déclarations, pour les prochains utilisateurs

@+
Trop top la version C ... irréprochable !!!
 

Dranreb

XLDnaute Barbatruc
J'ai vraiment l'impression qu'il ne sert à rien le CopyMemory là dedans.
En effet avec Destination As Any au lieu de ByVal Destination As LongPtr il ne faut certainement plus VarPtr(udtlParamStuct) mais simplement udtlParamStuct. Là il envoie la source dans une zone de travail irrécupérable ayant reçu le résultat de l'évaluation de VarPtr(udtlParamStuct), lequel consiste en son adresse, mais peu importe.
 
C

Compte Supprimé 979

Guest
@Dranreb Mon Ami, je pense que tu te tortures trop l'esprit
Ce qui compte, n'est-il pas d'avoir le résultat souhaité
Ceci dit, tu as certainement raison.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne me torture pas l'esprit, je me contente de signaler une absudité.
Si le résultat souhaité est obtenu, alors c'est que CopyMemory ne sert à rien, donc mets le en commentaire, ça marchera pareil.
 

Dranreb

XLDnaute Barbatruc
VB:
Option Explicit
   #If VBA7 Then
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As LongPtr)
   #Else
Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
      #End If
Sub Test()
   Const Src As Long = 1234
   Dim Dst1 As Long, Dst2 As Long, Dst3 As Long
   MoveMemory VarPtr(Dst1), Src, 4
   MoveMemory Dst2, Src, 4
   MoveMemory ByVal VarPtr(Dst3), Src, 4 ' (absurde, juste pour montrer que c'est rigoureusement équivalent)
   MsgBox "Dst1 = " & Dst1 & vbLf & "Dst2 = " & Dst2 & vbLf & "Dst3 = " & Dst3
   End Sub
 
Dernière édition:

Gégé-45550

XLDnaute Accro
J'ai vraiment l'impression qu'il ne sert à rien le CopyMemory là dedans.
En effet avec Destination As Any au lieu de ByVal Destination As LongPtr il ne faut certainement plus VarPtr(udtlParamStuct) mais simplement udtlParamStuct. Là il envoie la source dans une zone de travail irrécupérable ayant reçu le résultat de l'évaluation de VarPtr(udtlParamStuct), lequel consiste en son adresse, mais peu importe.
Bonjour le forum, bonjour Dranreb

Testé sans CopyMemory
VB:
Function GetHookStruct(ByVal lParam As Long) As MSLLHOOKSTRUCT
  ' VarPtr returns address; LenB returns size in bytes.
  'CopyMemory VarPtr(udtlParamStuct), lParam, LenB(udtlParamStuct)
  GetHookStruct = udtlParamStuct
End Function

et ça fonctionne normalement.
Bien vu Dranreb

Amicalement
 
C

Compte Supprimé 979

Guest
Bonjour.
Je ne me torture pas l'esprit, je me contente de signaler une absudité.
Si le résultat souhaité est obtenu, alors c'est que CopyMemory ne sert à rien, donc mets le en commentaire, ça marchera pareil.
Merci pour l'absurdité :rolleyes:
Perso, une instruction de plus ou de moins dans un code qui fonctionne
A moins que toi aussi tu aies envie de montrer que tu as la plus grosse
 

Gégé-45550

XLDnaute Accro
Merci pour l'absurdité :rolleyes:
Perso, une instruction de plus ou de moins dans un code qui fonctionne
A moins que toi aussi tu aies envie de montrer que tu as la plus grosse
hop hop hop ... on se calme !
Il n'y a aucun problème d'ego ici, même si les mots peuvent être parfois mal choisis, c'est juste puriste ... et instructif.

Moi, je vous admire tous les deux, vous êtes de très très loin bien plus forts que moi !!!
 

Lorenzini

XLDnaute Occasionnel
Bonsoir.
Dans les Declare sur version 64bits les arguments ByVal destinés à recevoir des expressions AddressOf ou VarPtr doivent être déclarés As LongPtr.
Et, à ma connaissance, pour CopyMemory, tous doivent l'être, y compris Length parce qu'on pourrait en théorie lui demander de déplacer une zone de mémoire dont la taille en octets dépasse la capacité d'adressage sur 32bits
Édition: Je m'aperçois que j'en avais d'ailleurs déjà parlé au poste #37.
Merci pour votre réponse, j'ai déclaré les variables As LongPtr et je n'ai effectivement plus de message d'erreur... par contre bizarrerie : la mollette fonctionne qq crans vers le bas ; pas vers le haut !?
 

Lorenzini

XLDnaute Occasionnel
Bonsoir.
Dans les Declare sur version 64bits les arguments ByVal destinés à recevoir des expressions AddressOf ou VarPtr doivent être déclarés As LongPtr.
Et, à ma connaissance, pour CopyMemory, tous doivent l'être, y compris Length parce qu'on pourrait en théorie lui demander de déplacer une zone de mémoire dont la taille en octets dépasse la capacité d'adressage sur 32bits
Édition: Je m'aperçois que j'en avais d'ailleurs déjà parlé au poste #37.
...et la déclaration qui me fait retrouver le sourire qq secondes plus tard et FAIT FONCTIONNER MA SOURIS WA MIRAAAACLE !! :))))
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
au lieu de
'Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
MERCI !!!!!
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Je ne puis puis vous aider, ne sachant comment fonctionne ce dispositif, même en 32Bits. En 64bits de surcroit, je n'aurais pas de quoi tester.
J'ai seulement pu relever une utilisation incorrecte du RtlMoveMemory dans une version résultant de corrections successives à la fois par Gégé-45550 et BrunoM45. La neutralisation de son utilisation sous prétexte qu'elle était de ce fait devenue inopérante sans pour autant gêner le fonctionnement du dispositif ne constitue probablement pas la vraie solution sérieuse garantissant un fonctionnement correct en toutes circonstances et configurations.
Le poste #54 propose un essai commençant par une utilisation incorrecte vers un Dst1 suivies de 2 utilisations correctes vers Dst2 et Dst3. Voyez le résultat montré par le MsgBox.
 
Dernière édition:

Statistiques des forums

Discussions
312 078
Messages
2 085 111
Membres
102 783
dernier inscrit
Basoje