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


81

我想模拟每x秒的鼠标移动。为此,我将使用一个计时器(x秒),当计时器计时时,我将移动鼠标。

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


3
这听起来像是您没有告诉我们的问题的一半解决方案,它可能有更优雅的解决方案。
Damien_The_Unbeliever

很有可能!我们不明白为什么,但是屏幕保护程序激活已过了10分钟。但是我们把999分钟:P
aF。

3
然后,您应该寻找能够防止应用程序运行时激活屏幕保护程序的解决方案,而不是动摇鼠标或屏幕保护程序设置。例如P / Invoke SetThreadExecutionState。我怀疑这与屏幕保护程序有关-编程的鼠标移动不会重置屏幕保护程序计时器。
Damien_The_Unbeliever

Answers:


86

看看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
感谢@JamesHill,我不记得该怎么做,您的例子很好。以我为例,我已经对x和y添加了一些计算,以便使鼠标移动时间相关(每秒像素)
Pimenta 2012年

2
这是WinForms方法吗?
greenoldman

14
我觉得我应该提到这一点,这样就不会有人陷入我刚才遇到的搞笑问题。Cursor.Clip会将鼠标的移动限制为Location和指定的大小Size。因此,上面的代码段仅允许您的鼠标在应用程序的边界框内移动。
布兰登

Cursor.Position如果用于虚拟机,则可能需要进行某些设置。
Pollitzer

正常工作,并且如果删除了Cursor.Clip行,则在最小化窗口时也可以工作。

30

首先添加一个名为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);

同样在WinForm中,您可以使用Cursor.Position = new Point(x,y);
user3290286

POINT类型来自哪里?
RollRoll's

如何使用此方法获取鼠标光标的位置?
barlop

这很好。应注意,这是相对于表格的左上角。因此,这是例如窗体上的控件所使用的相同坐标,以及例如Form的MouseMove方法中的MouseEventArgs e(以及-可以在上面的评论中回答我的q)所使用的相同坐标。
barlop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.