¿Cómo mover el cursor del mouse usando C #?

81

Quiero simular el movimiento del mouse cada x segundos. Para eso, usaré un temporizador (x segundos) y cuando el temporizador haga tictac haré el movimiento del mouse.

Pero, ¿cómo puedo hacer que el cursor del mouse se mueva usando C #?

aF.
fuente
3
Esto suena como una solución a medias para un problema del que no nos habla, que probablemente tenga soluciones más elegantes.
Damien_The_Unbeliever
¡Es muy posible! No entendemos por qué, pero el protector de pantalla se activa después de 10 minutos. Pero ponemos 999 minutos: P
aF.
3
Entonces debería buscar soluciones que eviten que el protector de pantalla se active cuando su aplicación se está ejecutando, en lugar de jugar con el mouse o la configuración del protector de pantalla. Por ejemplo, P / Invoke SetThreadExecutionState . Sospeché que esto estaba relacionado con el protector de pantalla: los movimientos programados del mouse no restablecen el temporizador del protector de pantalla.
Damien_The_Unbeliever

Respuestas:

86

Eche un vistazo a la Cursor.Positionpropiedad . Debería ayudarte a empezar.

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);
}
James Hill
fuente
1
Gracias @JamesHill, no recordaba cómo hacer esto y tu ejemplo es excelente. En mi caso, he agregado algunos cálculos axey para hacer que el tiempo de movimiento del mouse esté relacionado (píxel por segundo)
Pimenta
2
¿Es este el enfoque de WinForms?
greenoldman
14
Siento que debería mencionar esto para que nadie se meta en el divertido problema que acabo de tener. Cursor.Cliprestringirá el movimiento del mouse al tamaño especificado por Locationy Size. Entonces, el fragmento de arriba solo permitirá que su mouse se mueva dentro del cuadro delimitador de la aplicación.
Brandon
Cursor.Positionpuede requerir una cierta configuración si se usa en una máquina virtual .
Pollitzer
Funciona bien, y si se quita la línea Cursor.Clip, también funciona cuando la ventana está minimizada.
Ben
30

Primero agregue una clase llamada 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;
        }
    }
}

Puedes usarlo entonces así:

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

Win32.ClientToScreen(this.Handle, ref p);
Win32.SetCursorPos(p.x, p.y);
user3290286
fuente
También en WinForm puede usar Cursor.Position = new Point (x, y);
user3290286
¿De dónde es el tipo de PUNTO?
RollRoll
¿Cómo se obtiene la posición del cursor del mouse con este método?
Barlop
esto es bueno ... debe notarse que esto es relativo a la parte superior izquierda del formulario. Por lo tanto, son las mismas coordenadas utilizadas, por ejemplo, por un control en un formulario, y las mismas coordenadas utilizadas en (y, para responder a mi q en mi comentario anterior, que se pueden obtener), MouseEventArgs e, por ejemplo, el método MouseMove de Form.
Barlop