有没有办法在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();
}
答案 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();
}
在获取位置之前捕获鼠标以获取屏幕上的任何位置,并在恢复正常鼠标功能后释放它。