Enfermer la souris dans une fenêtre [Résolu]

Signaler
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Est-il possible de bloquer la souris dans une certaine zone en C#?

Je voudrais "enfermer" la souris pour qu'elle ne dépasse pas la fenêtre pendant que le click gauche est enfoncé..

Comment faire pour "l'enfermer" ?

4 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
peut etre un peu barbarre comme solution mais pas mieux pour l'instant :
l'idée est de repositionner le curseur au dernier point "correct" connu des que le curseur quitte le Form :

MouseEventHandler m_mouseMoveEventHandler;
EventHandler m_mouseLeaveEventHandler;
Point m_lastPoint;

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
// abonnement à l'event MouseMove
this.MouseMove  += m_mouseMoveEventHandler;
// enregistrement du premier point
m_lastPoint = new Point(e.X, e.Y);
}

private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
// plus besoin de l'event MouseMove
this.MouseMove  -= m_mouseMoveEventHandler;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
// on vérifie si le point est dans la zone cliente du Form
if ( !this.ClientRectangle.Contains(e.X, e.Y) )
Cursor.Position = this.PointToScreen(m_lastPoint);	// non : retour au dernier point correct connu
else
m_lastPoint = new Point(e.X, e.Y);  // oui : enregistrement du point
}


et dans le constructeur du Form :
m_mouseMoveEventHandler = new MouseEventHandler(Form1_MouseMove);


Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
hum, oublie le "EventHandler m_mouseLeaveEventHandler", il ne sert à rien là

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Merci ca marche !!

Très bonne idée pour la solution du code !
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Je ne sais pas si c'est ce que tu recherches, mais cet event permet de stopper un drag (touche droite) si la souris sors d'une certaine surface (en loccurance, une form) ...
Je te copie juste une méthode que j'avais faite au sein d'un programme :


/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/// <summary>
/// Cancel the drag if the mouse moves off the form.
/// </summary>
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private void dataGridFAPList_QueryContinueDrag(object sender, System.Windows.Forms.QueryContinueDragEventArgs e)
{
DataGrid dg = sender as DataGrid;
if(dg != null) 
{
Form f = dg.FindForm();
int x = Control.MousePosition.X - _screenOffset.X;
int y = Control.MousePosition.Y - _screenOffset.Y;

/* Cancel the drag if the mouse moves off the form. The screenOffset takes into account any 
 * desktop bands that may be at the top or left side of the screen. */
if((x < f.DesktopBounds.Left) || (x > f.DesktopBounds.Right) || (y < f.DesktopBounds.Top) || (y > f.DesktopBounds.Bottom)) 
e.Action = DragAction.Cancel;
}
}