2014-03-04 57 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可能... –