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

时间:2015-04-23 11:24:45

标签: c# .net wpf c#-4.0 mouse-position

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

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

需要点2:

  1. 当鼠标不在控件内但在屏幕上时的鼠标事件。
  2. 当鼠标不在控件内但在屏幕上时鼠标位置。
  3. 应该在不使用平台调用的情况下解决。

    接下来两个人不能工作:

    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.X    
    Position.Y
    

    Point pointToWindow = Mouse.GetPosition(this);
    
    Point pointToScreen = PointToScreen(pointToWindow);
    

    没有让鼠标定位出特定的控件。

4 个答案:

答案 0 :(得分:12)

使用控件的MouseDown事件,您可以尝试:

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

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

答案 1 :(得分:8)

您可以使用PointToScreen

  

转换表示当前坐标系的Point   可视化为屏幕坐标中的一个点。

这样的事情:

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返回一个Point,PointToScreen将该点转换为屏幕坐标

修改

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

  

将鼠标输入捕获到指定的元素。

答案 2 :(得分:0)

我找不到新鲜事,

代码在下面,fisrt构建并运行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>

班级代码:

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

答案 3 :(得分:0)

为什么使事情复杂化?只需传递console.log(errorResponse.error.errors[0].message); 即可获取屏幕坐标:

null