【发布时间】:2012-07-21 17:31:39
【问题描述】:
谁能告诉我是否存在带有 eventargs 的事件 MousePreMove 来通知我光标的移动方向?
我找到了一个 Win API 来阻止任何用户输入,但这不是我想要的。
【问题讨论】:
-
听起来你在要求时间机器。改为存储先前已知的位置。
标签: c# winforms winforms-interop
谁能告诉我是否存在带有 eventargs 的事件 MousePreMove 来通知我光标的移动方向?
我找到了一个 Win API 来阻止任何用户输入,但这不是我想要的。
【问题讨论】:
标签: c# winforms winforms-interop
不,没有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 );
}
【讨论】:
我真的不明白你为什么要阻止鼠标移动。这将产生的一个重要问题是您的用户将无法移动鼠标(显然)。因此,当您在用户使用您的程序时实现此功能时,他们将无法单击“开始”菜单。
但是,由于这是您的目标,您最好将您的想法从“停止鼠标移动”改为“如果鼠标不在我想要的位置,就将它放在我想要的位置”。
所以,按照 Fuex 的代码使用 OnMouseMove 事件,类似这样(这只是伪代码)
cursorPosition = e.Location;
如果(光标位置!= alowedArea) { cursorPosition = 珍贵的CursorPostion; }
preciousCursorPostion = cursorPosition;
e.Location = cursorPosition;
【讨论】: