我创建了一个简单的WPF应用程序,它试图捕获鼠标,但是当鼠标离开窗口后,它就停止获取mousemove事件。
我尝试了几种不同的mousecapture,但都不起作用。我还尝试了监视MouseLost事件,当鼠标超出窗口时,我看不到它。它只在我释放鼠标按钮时看到它。
这是我的MainWindow类。只要鼠标在窗口中,我就得到鼠标移动事件,但是如果我单击并将鼠标拖动到窗口外,我就停止得到移动事件。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MouseDown += MainWindow_MouseDown;
MouseUp += MainWindow_MouseUp;
MouseMove += MainWindow_MouseMove;
LostMouseCapture += MainWindow_LostMouseCapture;
}
private void MainWindow_LostMouseCapture(object sender, MouseEventArgs e)
{
Debug.WriteLine("Lost Mouse");
}
private void MainWindow_MouseMove(object sender, MouseEventArgs e)
{
Debug.WriteLine("P: " + Mouse.GetPosition(this));
}
private void MainWindow_MouseUp(object sender, MouseButtonEventArgs e)
{
Debug.WriteLine("Releasing");
ReleaseMouseCapture();
}
private void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
{
Debug.WriteLine("Capturing");
CaptureMouse();
// This does not work either: Mouse.Capture(this, CaptureMode.SubTree);
}
}
我希望看到所有的mousemove事件,这样我就可以拖动窗口,但我只看到mouseup事件外,mousemove只发生在光标在窗口内。
2条答案
按热度按时间vjrehmav1#
经过一番研究,我对这个问题有了一个答案。WPF应用程序在鼠标离开应用程序窗口时看不到鼠标,所以如果你想有一些自定义的拖动行为,有必要使用interrop全局捕获鼠标。我创建了下面的类来为任何WPF窗口启用DPI感知的跨多个显示器的窗口拖动:
jckbn6z72#
你必须在对象本身上使用鼠标捕获,所以在
MouseDown
中你需要((IInputElement)sender).CaptureMouse()
,在MouseUp
中需要((IInputElement)sender).ReleaseMouseCapture()
。也可以使用
MainWindow.CaptureMouse()
。