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

正如其他人所说,您需要捕获鼠标。下面是一个基于代码的示例:

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

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

最新更新