如何使用 C# 移动鼠标光标?

How to move mouse cursor using C#?

提问人:aF. 提问时间:11/8/2011 最后编辑:TermininjaaF. 更新时间:6/20/2022 访问量:209073

问:

我想每 x 秒模拟一次鼠标移动。为此,我将使用计时器(x 秒),当计时器滴答作响时,我会移动鼠标。

但是,如何使用 C# 使鼠标光标移动?

C# 鼠标光标

评论

5赞 Damien_The_Unbeliever 11/8/2011
这听起来像是你没有告诉我们的问题的一半解决方案,它可能有更优雅的解决方案。
0赞 aF. 11/8/2011
这是很有可能的!我们不明白为什么,但屏幕保护程序激活了 10 分钟。但我们把 999 分钟:P
4赞 Damien_The_Unbeliever 11/8/2011
然后,您应该寻找在应用程序运行时阻止屏幕保护程序激活的解决方案,而不是摆弄鼠标或屏幕保护程序设置。例如,p/invoke SetThreadExecutionState。我怀疑这与屏幕保护程序有关 - 编程的鼠标移动不会重置屏幕保护程序计时器。
1赞 KWallace 11/21/2021
如果他和我在同一条船上,那是因为他有一个公司的 GP,如果计算机闲置 x num 分钟,它会强制他注销。;-)

答:

102赞 James Hill 11/8/2011 #1

查看 Cursor.Position 属性。它应该能让你开始。

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

评论

1赞 Pimenta 10/31/2012
谢谢@JamesHill,我不记得该怎么做了,你的例子非常好。就我而言,我向 x 和 y 添加了一些计算,以使鼠标移动时间相关(每秒像素数)
2赞 greenoldman 10/31/2014
这是 WinForms 方法吗?
20赞 Brandon 2/13/2015
我觉得我应该提到这一点,这样就不会有人陷入我刚刚遇到的搞笑问题。 将鼠标的移动限制为 和 指定的大小。因此,上面的代码片段只允许鼠标在应用程序的边界框内移动。Cursor.ClipLocationSize
1赞 Luqqu 12/18/2020
对于 WPF:必须添加 System.Windows.Forms 引用。
3赞 Hanlet Escaño 11/17/2022
很多人发现这个代码片段在家工作很有用:D
44赞 user3290286 2/23/2014 #2

首先添加一个名为 Win32.cs 的类

public class Win32
{ 
    [DllImport("User32.Dll")]
    public static extern long SetCursorPos(int x, int y);

    [DllImport("User32.Dll")]
    public static extern bool ClientToScreen(IntPtr hWnd, ref POINT point);

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int x;
        public int y;

        public POINT(int X, int Y)
        {
            x = X;
            y = Y;
        }
    }
}

然后你可以像这样使用它:

Win32.POINT p = new Win32.POINT(xPos, yPos);

Win32.ClientToScreen(this.Handle, ref p);
Win32.SetCursorPos(p.x, p.y);

评论

1赞 RollRoll 12/2/2016
POINT类型从何而来?
0赞 barlop 6/5/2017
如何使用此方法获取鼠标光标位置?
0赞 barlop 6/5/2017
这很好。。应该注意的是,这是相对于表单的左上角。因此,它与窗体上的控件使用的坐标相同,并且与 MouseEventArgs e 中使用的坐标相同(并且 - 为了回答我在上面的评论中的问题 - 可以从中获取),例如 Form 的 MouseMove 方法。
5赞 Vance McCorkle 2/12/2021
这。句柄表示 WinForm 应用,但您可以获取当前正在运行的 WinForm 进程之外的任何正在运行的窗口的句柄。示例:IntPtr desktopWinHandle = Win32.GetDesktopWindow();其中 GetDesktopWindow 声明为 [DllImport(“user32.dll”, SetLastError = false)] public static extern IntPtr GetDesktopWindow();在 Win32 类中。另请查看 Win32 互操作方法 EnumWindows()。[DllImport(“user32.dll”)] 公共静态外部 int EnumWindows(WndEnumProc lpEnumFunc, int lParam);