【问题标题】:C# Mouse PreMove Event?C# 鼠标 PreMove 事件?
【发布时间】:2012-07-21 17:31:39
【问题描述】:

谁能告诉我是否存在带有 eventargs 的事件 MousePreMove 来通知我光标的移动方向?

我找到了一个 Win API 来阻止任何用户输入,但这不是我想要的。

【问题讨论】:

  • 听起来你在要求时间机器。改为存储先前已知的位置。

标签: c# winforms winforms-interop


【解决方案1】:

不,没有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 );
}

【讨论】:

  • 好的,但我的目标是防止鼠标移动事件仅用于方向。我可以使用你的代码来知道哪个是方向,但是如果我的某些情况发生了,我需要防止移动与顶部、底部、右侧或左侧。通过 Cursor.Clip 属性,我将永远无法阻止从右到左的移动。有什么想法吗?
  • 很抱歉,它不起作用。通过 WndProc 覆盖,我阻止了屏幕外的表单。例如,如果表单已达到最大宽度位置(这意味着表单停靠在屏幕右侧),我必须能够允许所有鼠标移动,除了从左到右的方向。你现在了解我了吗?
【解决方案2】:

我真的不明白你为什么要阻止鼠标移动。这将产生的一个重要问题是您的用户将无法移动鼠标(显然)。因此,当您在用户使用您的程序时实现此功能时,他们将无法单击“开始”菜单。

但是,由于这是您的目标,您最好将您的想法从“停止鼠标移动”改为“如果鼠标不在我想要的位置,就将它放在我想要的位置”。

所以,按照 Fuex 的代码使用 OnMouseMove 事件,类似这样(这只是伪代码)

cursorPosition = e.Location;

如果(光标位置!= alowedArea) { cursorPosition = 珍贵的CursorPostion; }

preciousCursorPostion = cursorPosition;

e.Location = cursorPosition;

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多