在 TextBox 中写入绝对鼠标位置
Write absolute mouse position in TextBox
我有以下问题:
我 window 有两个文本框。当我点击一个文本框然后点击其他任何地方(甚至在window之外)时,鼠标点击位置应该被写入文本框。
我找到了 MouseKeyHook
库,其中演示了如何以 windows 形式更新鼠标位置。但是我还没有设法将代码应用于我的问题。我什至不知道我应该把在演示中找到的代码写在哪里。
到目前为止我想到的是:
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);
}
}
}
这是一个文本框的代码。当我点击它时,会显示 x 和 y 坐标。它们不是绝对的,我认为这是由于GetPosition
方法中的参数this
。我必须选择什么来代替 this
?
另一件事是位置并不总是更新。当我将鼠标移动到桌面的右下角,然后通过按 Tab 键进入文本框来激活文本框时,该位置没有得到更新。
这里的步骤是什么?
首先您需要获取鼠标的绝对位置(不是相对于您的 window 或您的控件)。为此,您需要以下选项之一(来自此处:):
通过在项目中添加对 System.Windows.Forms 的引用(在解决方案资源管理器中进入引用 -> 右键单击 -> 添加引用 -> 程序集 -> 框架 -> 勾选System.Windows.Forms 附近的框)。
然后在一些class中添加这个静态函数(我们称之为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);
}
这样坐标应该是正确的。
对于您的坐标未在正确时间显示的问题,我认为您的焦点解决方案不是您要找的。
您应该尝试实现类似这样的功能: 并在每次调用 TheMouseMoved 事件时更改您的文本框值
我使用 Cursor.Position:
得到了这个结果
A Point that represents the cursor's position in screen coordinates.
例子
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);
}
}
所以和一样,还是用SetCursorPos
,但是这样更容易调用。
除此之外,它可能仅取决于您是否乐意包含对 System.Windows.Forms
的引用。
我有以下问题:
我 window 有两个文本框。当我点击一个文本框然后点击其他任何地方(甚至在window之外)时,鼠标点击位置应该被写入文本框。
我找到了 MouseKeyHook
库,其中演示了如何以 windows 形式更新鼠标位置。但是我还没有设法将代码应用于我的问题。我什至不知道我应该把在演示中找到的代码写在哪里。
到目前为止我想到的是:
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);
}
}
}
这是一个文本框的代码。当我点击它时,会显示 x 和 y 坐标。它们不是绝对的,我认为这是由于GetPosition
方法中的参数this
。我必须选择什么来代替 this
?
另一件事是位置并不总是更新。当我将鼠标移动到桌面的右下角,然后通过按 Tab 键进入文本框来激活文本框时,该位置没有得到更新。
这里的步骤是什么?
首先您需要获取鼠标的绝对位置(不是相对于您的 window 或您的控件)。为此,您需要以下选项之一(来自此处:):
通过在项目中添加对 System.Windows.Forms 的引用(在解决方案资源管理器中进入引用 -> 右键单击 -> 添加引用 -> 程序集 -> 框架 -> 勾选System.Windows.Forms 附近的框)。 然后在一些class中添加这个静态函数(我们称之为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);
}
这样坐标应该是正确的。 对于您的坐标未在正确时间显示的问题,我认为您的焦点解决方案不是您要找的。
您应该尝试实现类似这样的功能: 并在每次调用 TheMouseMoved 事件时更改您的文本框值
我使用 Cursor.Position:
得到了这个结果A Point that represents the cursor's position in screen coordinates.
例子
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);
}
}
所以和SetCursorPos
,但是这样更容易调用。
除此之外,它可能仅取决于您是否乐意包含对 System.Windows.Forms
的引用。