光标移动事件在wpf窗口边界之外

时间:2014-03-04 09:33:37

标签: c# wpf cursor mouseevent mouse

有没有办法在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 个答案:

答案 0 :(得分: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();
}

在获取位置之前捕获鼠标以获取屏幕上的任何位置,并在恢复正常鼠标功能后释放它。