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

Résolu
ilwika Messages postés 4 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 18 avril 2006 - 14 avril 2006 à 11:41
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 19 avril 2006 à 22:32
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

cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 avril 2006 à 18:30
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#
*/
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
14 avril 2006 à 13:18
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;
}
}
}
0
ilwika Messages postés 4 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 18 avril 2006
14 avril 2006 à 16:10
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 ^^
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
15 avril 2006 à 20:48
"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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 avril 2006 à 21:04
Tu as essayer avec quel contrôle ?

/*
coq
MVP Visual C#
*/
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
15 avril 2006 à 21:23
Microsoft TV ( msvidctl.dll ) par exemple..
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 avril 2006 à 21:59
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#
*/
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
16 avril 2006 à 00:00
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 !!
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 avril 2006 à 00:08
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#
*/
0
ilwika Messages postés 4 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 18 avril 2006
18 avril 2006 à 09:45
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!
0
ilwika Messages postés 4 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 18 avril 2006
18 avril 2006 à 14:01
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 ^^
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 avril 2006 à 22:32
Ba oui, il est très bien notre site !

/*
coq
MVP Visual C#
*/
0