簡體   English   中英

WPF窗口邊界外的光標移動事件

[英]Cursor movement event outside of wpf window boundaries

有沒有一種方法可以檢測到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();
}

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

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();
}

在獲取位置之前捕獲鼠標以獲取屏幕上任何位置的位置,然后在釋放鼠標以恢復正常的鼠標功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM