2014-03-04 58 views
2

有沒有辦法檢測WPF窗口之外的光標移動事件?我沒有試圖找出光標是否移動到窗口之外,我只是試圖繼續訂閱移動事件,即使鼠標移動到wpf窗口邊界之外。我已經能夠找到很多處理窗口內移動的東西,但沒有任何東西(至少沒有任何實際工作)。即使問題是關於外部運動的問題,它們本質上都只在窗口內工作。wpf窗口邊界之外的光標移動事件

因爲到目前爲止我還沒有找到解決方案,所以我一直在使用下面我想到的代碼。我不確定這個代碼有多高效。我認爲,如果系統已經檢查鼠標移動,那麼添加單獨的檢查將是低效的。但是,我一直無法進入系統部分,因爲我找不到任何好的參考。

注意:我想弄清楚這樣做的現有方法。我的代碼工作正常,但效率可能不高,因爲如果系統中已經有一個事件產生代碼,我可以訂閱,這個額外的計時器循環是浪費的額外資源。我沒有試圖檢測鼠標是否移動到邊界之外,我只是試圖記錄座標,而不管鼠標在屏幕上移動的位置。所以,如果鼠標移動到第二臺顯示器上,遠離我的應用程序窗口,我仍然希望事件觸發併發生通知。我的計時器實現報告一直都在報告座標,但是我想確保我沒有在已經完成的工作之上添加額外的圖層。這似乎是基於那些評論和我收到的答案的重大混淆。

public MainWindow() 
{ 
    InitializeComponent(); 
    InitializeCursorMonitoring(); 
} 

private void InitializeCursorMonitoring() 
{ 
    var point = System.Windows.Forms.Cursor.Position; 
    var timer = new System.Windows.Threading.DispatcherTimer(); 

    timer.Tick += delegate 
    { 
     if (point != System.Windows.Forms.Cursor.Position) 
     { 
      point = System.Windows.Forms.Cursor.Position; 

      System.Diagnostics.Debug.WriteLine(String.Format("X:{0} Y:{1}", 
               System.Windows.Forms.Cursor.Position.X, 
               System.Windows.Forms.Cursor.Position.Y)); 
     } 
    }; 

    timer.Interval = new TimeSpan(0, 0, 0, 0, 100); 
    timer.Start(); 
} 
+1

試着捕捉鼠標.. – Sankarann

+0

@Sankarann你能詳細點嗎? –

+0

看看它... http://stackoverflow.com/questions/942357/what-does-it-mean-to-capture-the-mouse-in-wpf –

回答

0

正如其他人所提到的,您需要捕獲鼠標。以下是根據您的代碼進行說明的樣本:

private void InitializeCursorMonitoring() 
{ 
    var point = Mouse.GetPosition(Application.Current.MainWindow); 
    var timer = new System.Windows.Threading.DispatcherTimer(); 

    timer.Tick += delegate 
    { 
     Application.Current.MainWindow.CaptureMouse(); 
     if (point != Mouse.GetPosition(Application.Current.MainWindow)) 
     { 
      point = Mouse.GetPosition(Application.Current.MainWindow); 
      Console.WriteLine(String.Format("X:{0} Y:{1}", point.X, point.Y)); 
     } 
     Application.Current.MainWindow.ReleaseMouseCapture(); 
    }; 

    timer.Interval = new TimeSpan(0, 0, 0, 0, 100); 
    timer.Start(); 
} 

獲得位置得到的位置在屏幕任意位置並將其釋放後恢復正常的鼠標功能之前捕獲鼠標。

+0

你的代碼可以防止任何拖動窗口 - 這不是我想要的。捕捉鼠標到底做了什麼?你沒有提到這一點。你所說的實質上是「像其他人一樣說」,並且描述了你在代碼中寫下的內容而不解釋它。我的實現已經報告了鼠標移動的座標,所以你的代碼如何幫助我處理任何事情? –

+1

前段時間,捕獲鼠標將鼠標消息(WM_MOUSEMOVE,WM_CLICK,WM _...)發送到程序的消息隊列,而不是將它們發送到其他程序的隊列。顯然這個行爲被改變了:'如果鼠標光標在另一個線程創建的窗口上,那麼只有當鼠標按鈕關閉時,系統纔會將鼠標指針指向指定的窗口。因此,我懷疑你拖延了你的觀察問題。 – FredP

+0

@FredP可能... –