Il y a certainement un moyen pratique de le faire: p>
J'ai mis en place une "fenêtre de déplacement" sur le comportement de glisser de la souris sur ma forme principale,
et j'aimerais que l'événement de MouseClick / Déplacement soit intercepté par le formulaire, pas par des contrôles qui y sont. P >
J'aimerais trouver un équivalent à / reproduire la propriété "KeyPreview" pour les événements de la souris P>
En outre, je veux éviter de rediriger l'événement de la souris sur la méthode de la forme principale 12 fois dans les événements de la souris de 12 commandes individuellement (ce qui est le solide laid que j'ai trouvé jusqu'à présent) p>
Des idées? P>
4 Réponses :
Basé sur vos commentaires, P>
Implémentez la fonctionnalité de redirection de l'événement de la souris dans une classe de base, puis effectuez toutes les commandes dérivent de cette classe de base. p>
Ainsi, vous implémentez uniquement la fonctionnalité une fois que toutes vos commandes seront "réthrow" l'événement de la souris à capter par la forme principale. p>
J'espère que cela aide. P>
Yup j'ai pensé à ça ... mais cela me fait changer de code hérité plus que ce que je suis prêt à. Je me demandais simplement s'il n'y avait pas de moyen de contourner complètement les contrôles ...
Abonnez-vous à toutes les commandes Événements MouseMove (Considérez-le de manière récursive pour les commandes imbriquées)
private void RedirectMouseMove(object sender, MouseEventArgs e)
{
Control control = (Control)sender;
Point screenPoint = control.PointToScreen(new Point(e.X, e.Y));
Point formPoint = PointToClient(screenPoint);
MouseEventArgs args = new MouseEventArgs(e.Button, e.Clicks,
formPoint.X, formPoint.Y, e.Delta);
OnMouseMove(args);
}
Comme indiqué dans un autre commentaire, je me demandais s'il n'y avait pas de moyen de contourner complètement les contrôles ...
Mais KeyPreview fonctionne presque de la même manière (s'attendre à ce que la propriété manutentionnée de l'argument de l'événement) - elle contourne d'abord les contrôles et gérer d'abord le niveau de formulaire.
remplacer la méthode Control.PrreProcessMessage: P>
Il semble que le préprocessage peut ne pas fonctionner pour les événements de la souris. Essayez plutôt de remplacer WNDPRC. Il peut intercepter des messages de souris à coup sûr, mais vous devez voir s'il les intercepte dans l'ordre souhaité: p>
http://bytes.com/topic/c-shaparp/answers/ 752144-PREPROCESSMESSAGE P>
Où dois-je faire ça? Sur la forme principale? Cela contournerait les contrôles?
Vous pouvez utiliser Bibliothèque GlobalMouseKeyhook à facilement Système d'interception Système large Souris Strong> Position. sur la souris cliquant Vous devez alors vérifier si l'emplacement de la souris Pour faire ce dernier chose que vous avez besoin de windowfrompoint Fonction API: P> [DllImport( "user32.dll", SetLastError = true )]
public static extern IntPtr WindowFromPoint( [In] POINTAPI Point );
private void _mouseListener_MouseClick( object sender, MouseEventArgs e )
{
var localPoint = this.PointToClient( e.Location );
bool containsPoint = this.ClientRectangle.Contains( localPoint );
var windowHandle = WindowFromPoint( e.Location );
var ctl = (Form)Form.FromHandle( windowHandle );
bool mainFormClicked = ctl != null && ctl.Handle == this.Handle;
if( containsPoint && mainFormClicked )
{
//form click is intercepted!
}
}
Les contrôles de l'enfant gèrent également les événements du clic de la souris / Déplacer?
Certains d'entre eux, pas tous. Et je veux certainement éviter de rediriger l'événement de la souris sur la méthode de la forme principale 12 fois sur 12 contrôles
Vous pouvez utiliser un filtre de message . (Réponse triviale convertie en commentaire automatiquement.)