XL 2021 VBA - Worksheet MouseMove - Gérer le hooking ?

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

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 !

Dudu2

XLDnaute Barbatruc
Bonjour,

Je suis parti de ce Post (2009) pour faire le fichier joint un peu amélioré d'une Subclass pour tracker le Worksheet.MouseMove.
Cependant, le Hooking WinProc() est toujours totalement instable et la moindre manip (réduction de la fenêtre, ...) plante Excel totalement.

J'ai trouvé sur Github une page pour faire une Class for safe subclassing windows qui laisse supposer avec le mot "safe" que les plantages seraient évités.
Quelqu'un a-t-il déjà utilisé ce code ? Parce que moi je m'y perds un peu.
 

Pièces jointes

Dernière édition:
Salut,
pour faire l'équivalent de ce que tu veux faire , j'ai un système 100% VBA, 100% Safe, sans addressOf, qui consomme peu de CPU :

Moniteur.gif

Nullosse
 
Bonsoir @patricktoulon,
l'astuce la moins gourmande apart le hook trop instable c'est celle de la commandebar classé je te l'ai déjà donnée me semble til
Je sais pas. Tu parles du timer basé sur CommandBar et capter la position curseur ?

Sinon ta ressource basée sur la gestion des erreurs sur lien hypertexte, mouais...

Je n'ai hélas pas de réponse de @nullosse qui doit sans doute utiliser ses UIAutomation et autres bidules mystérieux. Dommage en démo ça a l'air super.
 
J'ai repris ma fonction SetTimer emballée / sécurisée pour gérer le Worksheet.MouseMove.
C'est correct mais puisque c'est une boucle, on a le curseur qui s'agite tout seul de temps à autres ce qui n'est très agréable.
En tous cas bien plus sûr que le Subclassing de 1er post.
 

Pièces jointes

change le curseur wait pendant qu'il tourne tu verra plus rien avec les api bien sur car c'est wait et ou work qui faut mettre en pointeur normal ainsi il change il clignote mais toi tu le vois pas tralalalèere
Attention le settimer n'aime pas les sélection de cellules gestion d'erreur oblige ce qui implique des légers accros dans le rythme
 
VB:
Private Declare PtrSafe Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As LongPtr, ByVal lpCursorName As Long) As LongPtr

Private Declare PtrSafe Function SetCursor Lib "user32" (ByVal hCursor As LongPtr) As LongPtr

Private Const IDC_WAIT = 32514
Private Const IDC_ARROW = 32512
 Dim hCursor As LongPtr
 
Sub CurseurAttente()
     hCursor = LoadCursor(0, IDC_WAIT)
    SetCursor hCursor
End Sub


Sub CurseurInitial()
    Dim hCursor As LongPtr
    hCursor = LoadCursor(0, IDC_ARROW)
    SetCursor hCursor
End Sub

'sinon tu a
Sub CurseurAttenteExcel()
    Application.Cursor = xlWait
End Sub

Sub CurseurNormalExcel()
    Application.Cursor = xlDefault
End Sub
'mais c'est moins syncro que le remplacement provisoire avec les api
'surtout avec les app d'office  qui sont des fenêtres à la C..  avec leur propre sysmenu dont les parmêtre du  curseur font parti aussi
bref ca peut quand même atténuer le clignotement
 
OK, merci je ne connaissais pas ces fonctions.
Mais même mises au début et à la fin du traitement du Timer la curseur clignote quand même.

J'ai modifié le fichier du Post #7 pour détecter quand le curseur est stable dans une cellule (1 seconde dans la même cellule).
En cas de traitement à faire, c'est sur la cellule désignée par un curseur stable qu'il faut agir.
 
Dernière édition:
des fois c'est comme les userform il faut le gigoter pour que ca fasse effet
VB:
Private Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal dwData As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_MOVE = &H1

Sub changecursor()
    hCursor = LoadCursor(0, IDC_ARROW)
    SetCursor hCursor
    mouse_event MOUSEEVENTF_MOVE, 1, 0, 0, 0
End Sub
 
Salut,
Moi aussi j'utilise un Timer mais il y a une grosse astuce. Ce n'est pas un Timer Système dangereux pour la stabilité mais une boucle qui tourne dans une autre instance d'Excel dans un complément xlam. La difficulté majeure c'était la communication entre cette instance et le classeur courant. Il y avait possibilité de passer par une cellule mais cela obligeait de réserver et protéger cette cellule. Alors j'ai pensé à la barre de status Excel : Elle n'est pas souvent mise à jour et est lisible de l'extérieur. J'ai posé la question à ChatGpt, il m'a dit que c'était une bonne idée et simple à mettre en oeuvre par rapport par exemple aux "named pipes". En plus dans la barre de status du classeur principal , on voit dans quel état est le timer.
En pièce jointe un classeur de test + le complément xlam. A voir si cela fonctionne sur toutes les versions d'Excel.
Attention il y a du code dans le Workbook pour arrêter le timer si on sort avant d'arrêter le Timer. Normalement il ne doit pas y avoir d'instance Excel fantômes même si on quitte Excel avant d'avoir arrêter le Timer. Dans le classeur de test la résolution du Timer est de 50 ms (Ne pas descendre en dessous). Le code du complément est optimisé pour que l'instance Excel ne consomme pas beaucoup de CPU ou de GPU.
Peut être que cela ne fonctionne pas avec toutes les versions d'Excel oû cela plante mais sur ma version , je n'ai jamais de plantage ou de dysfonctionnement et pas de clignotement curseur.
Nullosse
 

Pièces jointes

Dernière édition:
- 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
Retour