2012-07-21 120 views
0

任何人都可以告诉我,如果存在事件MousePreMove与事件通知我的游标移动方向?C#鼠标PreMove事件?

我找到一个双赢的API,以阻止任何用户输入,但它不是我要找的。

+0

听起来像你所要求的一台时间机器。保存以前已知的位置。 – 2012-07-21 18:14:22

回答

2

不,还没有一个MousePreMove事件,但你可以写上自己的东西来获得光标的方向。例如:

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; 
    } 
} 

这是一个简单的程序,显示鼠标方向与前一个鼠标位置相比较。

编辑:

如果你想阻止一个方向的鼠标移动,你应该做喜欢这里:

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

好的,但我的目标是防止鼠标移动事件只是方向。我可以使用你的代码来知道哪个方向,但是如果我的一些情况已经发生,我需要防止移动与顶部,底部,右侧或左侧。通过Cursor.Clip属性,我永远无法阻止从右向左移动。任何想法? – bit 2012-07-21 18:46:17

+0

我编辑了我的答案,它应该按你的意愿工作。 – 2012-07-21 19:03:56

+0

对不起,这不行。通过WndProc覆盖我阻止窗体关闭屏幕。例如,如果表单已达到最大宽度位置(这意味着窗体停靠在屏幕右侧),我必须能够允许所有鼠标移动,除了从左到右的方向。你现在明白我了吗? – bit 2012-07-21 20:05:43

0

我真的不明白你为什么会想停止从鼠标移动。这会造成的一个重要问题是您的用户不会移动鼠标(显然)。所以,当用户在使用你的程序的时候他们提出这个问题,他们将无法点击开始菜单。

然而,因为这是你的目标,你将得到更好的改变从“停止移动鼠标”你的思想,以“如果老鼠是不是我想要它,把它放在我做”服务。

所以,使用的OnMouseMove事件按照Fuex的代码,并且是这样的(这仅仅是伪码)

cursorPosition = e.Location;

if(cursorPosition!= alowedArea) cursorPosition = preciousCursorPostion;如果(cursorPosition!= alowedArea) cursorPosition = preciousCursorPostion; }

preciousCursorPostion = cursorPosition;

e.Location = cursorPosition;