Capturer les mouvements de la souris sur un contrôle ActiveX [Résolu]

ilwika 4 Messages postés vendredi 14 avril 2006Date d'inscription 18 avril 2006 Dernière intervention - 14 avril 2006 à 11:41 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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!
Afficher la suite 

12 réponses

Répondre au sujet
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 avril 2006 à 18:30
+3
Utile
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#
*/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 14 avril 2006 à 13:18
0
Utile
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;
}
}
}
Commenter la réponse de Lutinore
ilwika 4 Messages postés vendredi 14 avril 2006Date d'inscription 18 avril 2006 Dernière intervention - 14 avril 2006 à 16:10
0
Utile
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 ^^
Commenter la réponse de ilwika
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 15 avril 2006 à 20:48
0
Utile
"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.
Commenter la réponse de Lutinore
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 avril 2006 à 21:04
0
Utile
Tu as essayer avec quel contrôle ?

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

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.