2012-07-21 116 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;