C#WPF应用程序.NET 4.5设置鼠标位置[重复]

Posted

技术标签:

【中文标题】C#WPF应用程序.NET 4.5设置鼠标位置[重复]【英文标题】:C# WPF application .NET 4.5 Set Mouse Position [duplicate] 【发布时间】:2014-10-30 21:34:29 【问题描述】:

第一次在这里提出问题,我在这里找到的解决方案似乎由于某种原因不起作用。当窗口变为活动状态时,我的应用程序需要设置鼠标位置,我已设置功能但无法使光标属性正常工作。由于某种原因,我不能使用 Cursor.Position 或任何东西。我曾希望访问聊天室以找到解决方案,但显然在我获得 20 声望之前我无法说话。

所以我在这里问如何用类似的东西改变光标位置

this.Cursor.SetPosition(x, y);

感谢您的帮助。

编辑:已经在here 进行了测试:

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

【问题讨论】:

为什么忽略错误信息。编译器抱怨?阅读错误消息会重现它们。 示例:错误 1“System.Windows.Input.Cursor”不包含“Current”的定义,并且没有接受“System.Windows.Input”类型的第一个参数的扩展方法“Current”。可以找到光标'(您是否缺少 using 指令或程序集引用?) 它在 System.Windows.Forms 中。如文件所述。 无论如何,网络搜索都有帮助。试试这些搜索词:c# set cursor position wpf 我从未来来到这里是为了说这个 *** 现在是谷歌搜索如何在 C# WPF 中移动鼠标的热门搜索。非常感谢有帮助的 cmets 向 Google 说出答案而不是提供答案。 【参考方案1】:

您可以使用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(..)之前的xy位置将它们传递给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 外观,您可能需要考虑边框。

【讨论】:

谢谢,这行得通,我想当我尝试与另一个答案类似的东西时,他们没有提到所需的命名空间。我习惯了 Eclipse 中的 Java,它的库具有自动导入功能。 @DeadJohnDoe 很高兴它有帮助,只是...扩展我的示例。对于生产代码,我绝对不会那样写。 那么上述函数使用的光标位置是和电脑屏幕有关的,而不是程序窗口?有没有办法改用程序窗口的坐标系? @DeadJohnDoe 查看我的编辑,这样我就不必在这里输入很多内容了。

以上是关于C#WPF应用程序.NET 4.5设置鼠标位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在鼠标位置打开具有 Windows 窗体父级的 WPF 窗口?

.net 4.5 中可绑定的 WPF Richtextbox

在鼠标位置(鼠标左上角)显示 WPF 窗口的最佳方式是啥?

WPF里,怎么通过鼠标移动的位置来控制滚动条

WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

WPF:写入矩形取决于使用多重绑定的鼠标位置