Capturer les mouvements de la souris sur un contrôle ActiveX

[Résolu]
Signaler
Messages postés
4
Date d'inscription
vendredi 14 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour!!



J'explique mon problème :

Je dois capturer les événements de la souris sur un contrôle ActiveX.
Je comptais utiliser les méthodes Mousexxx (notamment MouseMove) mais
je me suis aperçu que mon contrôle ne disposait pas de ce type de
méthodes.



J'ai exploré le net mais je n'ai rien trouvé de particulier sur mon problème.



Donc, au final, est ce que quelqu'un aurait une idée, une piste ou encore mieux, une solution pour m'aider?



Merci d'avance!

12 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Et en partant de ça comme point de départ ? : IMessageFilter : événements MouseMove / MouseEnter / MouseLeave au niveau d'un contrôle, sans tenir compte des contrôles enfants
Tu devrais pouvoir partir du même principe pour appliquer la même chose seulement au contrôle ActiveX visé.

/*
coq
MVP Visual C#
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, le problème c'est que même avec un filtre de message sur l'application on ne devrait pas recevoir le message WM_MOUSEMOVE.. Tu peux installer un hook mais si tu ne connais pas ça risque d'être un peu difficile..

Y'a une solution qui est pas des plus élégante ( quoi que .. ) mais bien pratique, superpose un contrôle transparent par dessus l'activeX, même position, et même taille ( Location et Bounds ) et utilises ses événèments.

private class MouseTrap : Control
{
private const int WS_EX_TRANSPARENT = 0x00000020;


public MouseTrap( ) : base( ) { }

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}
}
Messages postés
4
Date d'inscription
vendredi 14 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Ok, je vois le principe. Mais la subtilité qui me gène, c'est que le contrôle ActiveX doit aussi récupérer les événements. Donc, avec ta méthode, est ce que le contrôle transparent capture tout et ne laisse rien au contrôle ActiveX?

Sinon, les hook, je me suis documenté dessus, j'ai essayé de comprendre des codes de démonstrations sur le net mais j'ai jamais réussi à le faire marcher. Mais si tu dit que c'est la méthode la plus propre pour y arriver, je vais me remettre dessus.

Merci pour ton aide ^^
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
"le problème c'est que même avec un filtre de message sur l'application on ne devrait pas recevoir le message WM_MOUSEMOVE.."

C'est la première chose que j'ai essayé, mais pas de messages WM_MOUSE* sur un activeX apparemment.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Tu as essayer avec quel contrôle ?

/*
coq
MVP Visual C#
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Microsoft TV ( msvidctl.dll ) par exemple..
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Chez moi ça passe.
J'avais tester sur du WebBrowser et du WMP.
Et dans le cas du WB, l'event ne fonctionne plus après un appel à Navigate (mais on voit bien défiler les WM_MOUSEMOVE dans Spy++)
J'ai dû rater qqch...

/*
coq
MVP Visual C#
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Je viens de comprendre..

J'ai testé avec ton filtre.. mais l'événement MouseMove ne se déclenchait pas, j'ai donc déduit que ça marchait pas sur les activeX.

Mais en fait j'avais pas ajouté le filtre avec Application.AddMessageFilter j'étais persuadé que ta classe le faisait dans le constructeur, surout qu'elle appelle bien Application.RemoveMessageFilter dans la méthode Dispose.. Bon en gros j'ai été un peu vite dans ma dédution mais c'est un peu de ta faute aussi.. et pis c'est tout !!
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
lol
Je pars du principe qu'on doit pouvoir initialiser l'instance sans forcément l'activer de suite, mais je vais éditer pour mettre un exemple d'utilisation, pour ceux qui ne prennent pas la peine de regarder le projet de test :p

/*
coq
MVP Visual C#
*/
Messages postés
4
Date d'inscription
vendredi 14 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Re bonjour tout le monde!

d'abord, merci de me donner des pistes ^^

J'ai pas pu essayé ca ce weekend mais je m'y met des cet aprem!

Je vous tient au courant!
Messages postés
4
Date d'inscription
vendredi 14 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Bon, je viens d'essayer le code source d'IMessageFilter...

Ca marche parfaitement, c'est ce qu'il me fallait!

Donc, merci beaucoup! Vraiment merci beaucoup!

J'ai cherché pendant longtemps et j'avais pas vu ca... alors que la solution etait sur ce site ^^

Moi yen a etre un poil boulet des fois ^^
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Ba oui, il est très bien notre site !

/*
coq
MVP Visual C#
*/