C#WPF应用程序.NET 4.5设置鼠标位置
本文关键字:设置 鼠标 位置 应用程序 NET C#WPF | 更新日期: 2023-09-27 18:20:54
第一次在这里提问时,由于某种原因,我在这里找到的解决方案似乎不起作用。当窗口变为活动状态时,我的应用程序需要设置鼠标位置,我已经设置了功能,但无法使光标属性正常工作。由于某种原因,我不能使用Cursor.Position或任何东西。我本来希望去聊天室寻找解决方案,但显然,在我有20个名声之前,我不能说话。
所以我在这里问如何用之类的东西来改变光标的位置
this.Cursor.SetPosition(x,y);
谢谢你的帮助。
编辑:在这里已经尝试过这个测试:
private void MoveCursor()
{
// Set the Current cursor, move the cursor's Position,
// and set its clipping rectangle to the form.
this.Cursor = new Cursor(Cursor.Current.Handle);
Cursor.Position = new Point(Cursor.Position.X - 50, Cursor.Position.Y - 50);
Cursor.Clip = new Rectangle(this.Location, this.Size);
}
但是编译器抱怨Current,Position,Clip,Location,Size
最终解决方案:
using System.Runtime.InteropServices;
...
[DllImport("User32.dll")]
private static extern bool SetCursorPos(int X, int Y);
...
Point relativePoint = MouseCaptureButton.TransformToAncestor(this)
.Transform(new Point(0, 0));
Point pt = new Point(relativePoint.X + MouseCaptureButton.ActualWidth / 2,
relativePoint.Y + MouseCaptureButton.ActualHeight / 2);
Point windowCenterPoint = pt;//new Point(125, 80);
Point centerPointRelativeToSCreen = this.PointToScreen(windowCenterPoint);
SetCursorPos((int)centerPointRelativeToSCreen.X, (int)centerPointRelativeToSCreen.Y);
您可以使用InteropServices
很容易地实现这一点:
// Quick and dirty sample...
public partial class MainWindow : Window
{
[DllImport("User32.dll")]
private static extern bool SetCursorPos(int X, int Y);
public MainWindow()
{
InitializeComponent();
SetCursorPos(100, 100);
}
}
只需确保包含System.Runtime.InteropServices
命名空间即可。还有很多其他方法,比如上面重复链接中指出的方法。使用最适合你的。
编辑:
根据评论中的请求,有一种方法可以使其成为应用程序窗口坐标系,而不是全局坐标系:
public partial class MainWindow : Window
{
[DllImport("User32.dll")]
private static extern bool SetCursorPos(int X, int Y);
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
SetCursor(200, 200);
}
private static void SetCursor(int x, int y)
{
// Left boundary
var xL = (int)App.Current.MainWindow.Left;
// Top boundary
var yT = (int)App.Current.MainWindow.Top;
SetCursorPos(x + xL, y + yT);
}
}
我不认为你会这么做。。。但请确保在初始化阶段(在构造函数中)不要尝试获取Window
坐标。等待它加载,类似于我上面所做的操作;否则,您可能会得到某些值的NaN
。
如果你想将其限制在窗口的限制范围内,一个简单的方法是将System.Windows.Forms
添加到你的引用中,并使用重复链接中提供的代码。然而,如果你想使用我的方法(都是关于个人偏好……我使用我喜欢的……我喜欢PInvoke
),你可以在将SetCursor(..)
中的x
和y
位置传递给SetCursorPos(..)
之前检查它们,类似于此:
private static void SetCursor(int x, int y)
{
// Left boundary
var xL = (int)App.Current.MainWindow.Left;
// Right boundary
var xR = xL + (int)App.Current.MainWindow.Width;
// Top boundary
var yT = (int)App.Current.MainWindow.Top;
// Bottom boundary
var yB = yT + (int)App.Current.MainWindow.Height;
x += xL;
y += yT;
if (x < xL)
{
x = xL;
}
else if (x > xR)
{
x = xR;
}
if (y < yT)
{
y = yT;
}
else if (y > yB)
{
y = yB;
}
SetCursorPos(x, y);
}
请注意,如果应用程序使用Windows外观,则可能需要考虑边框。