如何在 WPF 中获取鼠标在屏幕上的位置?

How to get mouse position on screen in WPF?

它在特定的控件内工作,但它不能解决特定的控件。

如何直接从屏幕(没有平台调用)独立于任何控件获取鼠标位置和使用鼠标事件?

2 需要点数:

  1. 鼠标不在控件内但在屏幕上时的鼠标事件。
  2. 鼠标不在控件内但在屏幕上时的鼠标位置。

不用Platform Invoke应该可以解决

接下来两个不工作:

System.Windows.Input.Mouse.GetPosition(this)

无法将鼠标位置移出特定控件。

System.Windows.Forms.Cursor.Position.X

System.Windows.Forms.Cursor.Position 不起作用,因为它在 WPF 应用程序中没有类型,但它在 Windows 表单应用程序中起作用。

IntelliSense 获取 System.Windows.Forms.Cursor.Position,但它没有获取任何类型的 Position,因此我无法获取:

Position.X    
Position.Y

Point pointToWindow = Mouse.GetPosition(this);

Point pointToScreen = PointToScreen(pointToWindow);

无法将鼠标位置移出特定控件。

使用控件的 MouseDown 事件你可以试试这个:

var point = e.GetPosition(this.YourControl);

编辑: 您可以使用 Mouse.Capture(YourControl); 将鼠标事件捕获到特定控件,这样即使它不在该控件上,它也会捕获鼠标事件。这是 link

您可以使用PointToScreen

Converts a Point that represents the current coordinate system of the Visual into a Point in screen coordinates.

像这样:

private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
    var relativePosition = e.GetPosition(this);
    var point= PointToScreen(relativePosition);
    _x.HorizontalOffset = point.X;
    _x.VerticalOffset = point.Y;
}

请注意Mouse.GetPosition returns一个点,PointToScreen将点转换为屏幕坐标

编辑:

您可以使用Mouse.Capture(SepcificControl);。来自 MSDN

Captures mouse input to the specified element.

我没有什么新发现,

代码如下,首先构建和运行 Window,

然后只需在 window 上滚动鼠标一次即可调用鼠标位置的无限屏幕检测。

(因此我在问题的第二点没有找到检测鼠标事件不受控制的方法,但类似使用无限线程。)

但我只是用了一点技巧在 WPF 项目中启用 Windows.Forms,只需在纯方法中使用 Forms 代码,然后在事件代码块中引用该方法。

.

代码如下:

添加两个对项目的引用:

System.Drawing 
System.Windows.Forms

Xaml 部分:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:g="clr-namespace:Gma.UserActivityMonitor;assembly=Gma.UserActivityMonitor"
        Title="MainWindow" Height="350" Width="525" 
        MouseWheel="MainWindow_OnMouseWheel">
    <Grid>
       <TextBlock Name="TBK" /> 
    </Grid>
</Window>

Class代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public void KeepReportMousePos()
        {
            //Endless Report Mouse position
            Task.Factory.StartNew(() =>
            {
                while(true){
                    this.Dispatcher.Invoke(
                        DispatcherPriority.SystemIdle,
                        new Action(() =>
                        {
                            GetCursorPos();
                        }));
                }
            });
        }
        public void GetCursorPos()
        {
            //get the mouse position and show on the TextBlock
            System.Drawing.Point p = System.Windows.Forms.Cursor.Position;
            TBK.Text = p.X + " " + p.Y;
        }

        private void MainWindow_OnMouseWheel(object sender, MouseWheelEventArgs e)
        {
            //invoke mouse position detect when wheel the mouse
            KeepReportMousePos();
        }
    }

为什么要把事情复杂化?只需传递 null 即可获取屏幕坐标:

private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
    var screenPos = e.GetPosition(null);
    // ...
}