2012-07-21 6 views
0

Quelqu'un peut-il me dire s'il existe un événement MousePreMove avec un eventargs qui m'informe de la direction du mouvement des curseurs?C# Mouse PreMove Evénement?

J'ai trouvé une API Win pour bloquer toute entrée de l'utilisateur mais ce n'est pas ce que je cherche.

+0

On dirait que vous demandez une machine à voyager dans le temps. Stockez la position précédemment connue à la place. –

Répondre

2

Non, il n'y a pas d'événement MousePreMove, mais vous pouvez écrire quelque chose par vous-même pour obtenir la direction du curseur. Par exemple:

public partial class Form1 : Form { 

    Point cursorPosition; 
    Direction cursorDirection, previousCursorPosition; 

    public event EventHandler<MouseDirectionEventArgs> DirectionChanged; 

    public Form1() { 
     InitializeComponent(); 
     cursorPosition = PointToClient(Cursor.Position); 

     DirectionChanged += new EventHandler<MouseDirectionEventArgs>(Form1_DirectionChanged); 
    } 

    void Form1_DirectionChanged(object sender, MouseDirectionEventArgs e) { 
     MessageBox.Show(e.MouseDirection.ToString()); 
    } 

    protected override void OnMouseMove(MouseEventArgs e) { 

     if (e.X > cursorPosition.X && e.Y > cursorPosition.Y) 
      cursorDirection = Direction.RightDown; 
     else if (e.X > cursorPosition.X && e.Y < cursorPosition.Y) 
      cursorDirection = Direction.RightUp; 
     else if (e.X < cursorPosition.X && e.Y > cursorPosition.Y) 
      cursorDirection = Direction.LeftDown; 
     else if (e.X < cursorPosition.X && e.Y < cursorPosition.Y) 
      cursorDirection = Direction.LeftUp; 

     OnDirectionChanged(new MouseDirectionEventArgs(cursorDirection)); 

     previousCursorPosition = new Point(cursorPosition.X, cursorPosition.Y); 
     cursorPosition = e.Location; 

     base.OnMouseMove(e); 
    } 

    protected virtual void OnDirectionChanged(MouseDirectionEventArgs e){ 
     if (DirectionChanged != null) 
      DirectionChanged(this, e); 
    } 
} 

enum Direction { 
    LeftUp, 
    LeftDown, 
    RightUp, 
    RightDown 
} 

class MouseDirectionEventArgs : EventArgs { 
    public readonly Direction MouseDirection { 
     get; 
     set; 
    } 

    public MouseDirectionEventArgs(Direction direction) { 
     MouseDirection = direction; 
    } 
} 

C'est un programme simple qui montre la direction de la souris par rapport à la position de la souris précédente.

EDIT:

Si vous voulez éviter le déplacement de la souris dans une direction que vous devez faire comme ici:

void Form1_DirectionChanged(object sender, MouseDirectionEventArgs e) { 
    if(e.MouseDirtection == Direction.LeftUp) //example 
     Cursor.Position = PointToScreen(previousCursorPosition); 
} 
+0

Ok, mais mon but est d'empêcher l'événement de déplacer la souris pour seulement la direction. Je peux utiliser votre code pour savoir quelle est la direction, mais si ma condition se produit, je dois empêcher le mouvement par rapport au haut, au bas, à droite ou à gauche. Grâce à la propriété Cursor.Clip, je ne pourrai jamais bloquer le mouvement de droite à gauche. Une idée? – bit

+0

J'ai édité ma réponse, cela devrait fonctionner comme vous voulez. –

+0

Je suis désolé que ça ne marche pas. Grâce aux remplacements WndProc, j'empêche la forme hors écran. Si le formulaire a atteint, par exemple, la position de largeur maximale (cela signifie que la forme est ancrée à droite de l'écran), je dois être en mesure d'autoriser tous les mouvements de la souris, sauf de gauche à droite. Avez-vous maintenant me comprendre? – bit

0

Je ne comprends vraiment pas pourquoi vous voulez arrêter la souris de en mouvement. Un problème important que cela créera est que votre utilisateur ne pourra pas déplacer la souris (évidemment). Ainsi, lorsque vous implémentez ceci pendant que l'utilisateur utilise votre programme, ils ne pourront pas cliquer sur le menu Démarrer par exemple. Cependant, comme c'est votre objectif, vous serez mieux servi en changeant votre façon de penser de «arrêter le déplacement de la souris» vers «si la souris n'est pas là où je le veux, placez-le où je veux».

, utilisez un événement OnMouseMove selon le code fuex, et quelque chose comme ça (c'est juste psuedocode)

cursorPosition = e.Location;

si (cursorPosition! = AlowedArea) { cursorPosition = preciousCursorPostion; }

preciousCursorPostion = cursorPosition;

e.Location = cursorPosition;