2014-04-13 100 views
3

我試圖創建一個簡單的應用程序在網絡上發送鼠標輸入來遠程控制另一臺機器,使用C#和.NET Framework 4.5Windows窗體計算三角洲鼠標移動負值

我有一個奇怪的問題,當我嘗試計算在MouseMove事件鼠標光標移動增量:下面是我提出來隔離該問題的示例代碼:

public partial class Form1 : Form 
{ 
    private Point previousPosition; 

    public Form1() 
    { 
     InitializeComponent(); 
     previousPosition = MousePosition; 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     Point mousePos = MousePosition; 
     int deltaX = (mousePos.X - previousPosition.X); 
     int deltaY = (mousePos.Y - previousPosition.Y); 


     label1.Text = "X: " + deltaX.ToString() + " Y: " + deltaY.ToString(); 
     label2.Text = "previousX: " + previousPosition.X + " currentX: " + mousePos.X; 

     previousPosition = MousePosition; 
    } 
} 

我存儲在一個類變量和在先前的光標位置MouseMove事件我計算位置差異並更新previousPosition變量。

現在奇怪的是,這隻適用於積極的三角洲(當我將鼠標移動到右側)。

我在窗體中放置了一些標籤以實時顯示座標,令我吃驚的是,當我向左移動光標時,上一個座標和當前座標始終保持不變,導致零增量!

我在這裏錯過了一些愚蠢而明顯的東西嗎?爲什麼當我向左移動光標時,previousPosition變量等於MousePosition,但是如果向右移動,它按預期工作?

+0

你的代碼工作正常,你只是更新方式太快。如果您添加一個秒錶,並且每隔500ms或每秒運行一次邏輯,它就會按預期工作。這是一個延遲的版本,所以你可以看到它的作品http://pastebin.com/xnBKqbB6 –

+1

我不知道它爲什麼這樣做,我想由於某種原因,你得到多個鼠標移動事件時左移..如果你添加'if(mousePos == previousPosition)return;',那麼你會得到預期的行爲。 – Blorgbeard

+1

當您向負方向移動時,引發的移動事件太多,每移動一個像素就會有兩個事件,其中鼠標實際並未移動。 hor和ver。奇怪的是,Windows版本肯定很重要。 –

回答

4

我複製你的問題,並通過添加重複的移動事件的支票代碼固定它:

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point mousePos = MousePosition; 

    if (mousePos == previousPosition) 
     return; 

    // .. your other code here   

    previousPosition = mousePos; 
} 

我不知道爲什麼有對於同一位置的多個鼠標移動事件,只有當向左移動。

+0

非常感謝!現在我很困惑,爲什麼MouseMove在向左移動時被多次調用。很好的提醒,有些事情發生得如此之快,以至於人眼看不到:) –

+0

一旦我完成了網絡基礎設施發送到其他客戶端的動作,我會進一步測試,如果檢查是真的必要,並在這裏發佈結果。 –