在TextBox中写入绝对鼠标位置

时间:2016-11-03 10:46:39

标签: c# wpf textbox mouse-position

我有以下问题:

我有两个文本框的窗口。当我单击文本框然后单击其他任何位置(甚至在窗口外)时,应将鼠标单击位置写入文本框。

我找到了*char_(' ')库,其中演示了如何在Windows窗体中更新鼠标位置。但我还没有设法将代码应用到我的问题中。我甚至不知道应该在哪里编写演示中的代码。

到目前为止我想出的是:

MouseKeyHook

这是一个textBox的代码。当我单击它时,会显示x和y坐标。它们不是绝对的,我认为这是由using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace LineClicker { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void StarttextBox_GotFocus(object sender, RoutedEventArgs e) { Mouse.Capture(StarttextBox); StarttextBox.Text = string.Format(" x {0} , y {1}", PointToScreen(Mouse.GetPosition(this)).X, PointToScreen(Mouse.GetPosition(this)).Y); } } } 方法中的参数this引起的。我必须选择什么而不是GetPosition

另一件事是该职位并不总是更新。当我将鼠标移动到桌面的右下角,然后通过选中它来激活文本框时,位置不会更新。

这里有什么步骤?

2 个答案:

答案 0 :(得分:3)

我能够使用Cursor.Position来实现此结果:

  

Point ,表示光标在屏幕坐标中的位置。

示例

using System.Windows;

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

        private void textBox_GotFocus(object sender, RoutedEventArgs e)
        {
            var postion = System.Windows.Forms.Cursor.Position;
            textBox.Text = string.Format($"{postion.X}, {postion.Y}");
        }
    }
}

您可以在the Microsoft reference source中看到Cursor.Position被定义为:

public static Point Position {
    get {
        NativeMethods.POINT p = new NativeMethods.POINT();
        UnsafeNativeMethods.GetCursorPos(p);
        return new Point(p.x, p.y);
    }
    set {
        IntSecurity.AdjustCursorPosition.Demand();
        UnsafeNativeMethods.SetCursorPos(value.X, value.Y);
    }
}

就像在yan yankelevich's answer中一样,它仍然使用SetCursorPos,但这样更容易调用。

除此之外,它可能只取决于您是否乐意将参考文献包含在System.Windows.Forms中。

答案 1 :(得分:2)

首先,您需要获得绝对鼠标位置(不是相对于您的窗口或控件)。要执行此操作,您需要以下选项之一(从此处:https://stackoverflow.com/a/4232281/4664754):

  • 通过在项目中添加对System.Windows.Forms的引用(请参阅解决方案资源管理器中的参考资料 - &gt;右键单击 - &gt;添加参考 - &gt;程序集 - &gt;框架 - &gt;勾选System.Windows.Forms附近的框。 然后在某个类中添加这个静态funtcion(让我们称之为MouseHelper.cs):

    public static Point GetMousePositionWindowsForms()
    {
        System.Drawing.Point point = Control.MousePosition;
        return new Point(point.X, point.Y);
    }
    
  • 通过在MainWindow.xaml.cs中粘贴此代码:

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool GetCursorPos(ref Win32Point pt);
    
        [StructLayout(LayoutKind.Sequential)]
        internal struct Win32Point
        {
            public Int32 X;
            public Int32 Y;
        };
        public static Point GetMousePosition()
        {
            Win32Point w32Mouse = new Win32Point();
            GetCursorPos(ref w32Mouse);
            return new Point(w32Mouse.X, w32Mouse.Y);
        }
    

无论您选择何种方式,您都需要以这种方式在OnFocusChanged中调用其中一个函数:

 private void StarttextBox_GotFocus(object sender, RoutedEventArgs e)
        {
            Mouse.Capture(StarttextBox);
            Point mouseCoord = MouseHelper.GetMousePositionWindowsForms();
            // Or if you choose the other way :
            //Point mouseCoord = GetMousePosition();
            StarttextBox.Text = string.Format(" x {0} , y {1}", mouseCoord.X, mouseCoord .Y);
        }

这样坐标应该是正确的。 对于您的坐标问题没有在合适的时间显示,我认为您的焦点解决方案不是您想要的。

你应该尝试实现这样的事情:https://stackoverflow.com/a/2064009/4664754并在每次调用TheMouseMoved事件时更改文本框值