2011-11-08 20 views
58

Voglio simulare il movimento del mouse ogni x secondi. Per quello, userò un timer (x secondi) e quando il timer spunta farò il movimento del mouse.Come spostare il cursore del mouse usando C#?

Ma come posso spostare il puntatore del mouse con C#?

+2

questo suona come una mezza soluzione ad un problema che non ci stai raccontando , che probabilmente ha soluzioni più eleganti. –

+0

È possibile! Non capiamo perché, ma il salvaschermo è attivato passa 10 minuti. Ma mettiamo 999 minuti: P –

+2

Quindi dovresti cercare soluzioni che impediscano l'attivazione dello screen saver quando l'applicazione è in esecuzione, piuttosto che manipolare il mouse o le impostazioni dello screensaver. Per esempio. P/Invoke [SetThreadExecutionState] (http://stackoverflow.com/questions/3665332/how-do-i-prevent-screen-savers-and-sleeps-during-my-program-execution/3665545#3665545). Sospettavo che si trattasse di un salvaschermo: i movimenti programmati del mouse non resettano il timer dello screensaver. –

risposta

52

Dai uno sguardo allo Cursor.Position Property. Dovresti iniziare.

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

Grazie a @JamesHill, non ricordavo come fare questo e il tuo esempio è eccellente. Nel mio caso ho aggiunto alcuni calcoli a xey per rendere il movimento del mouse correlato al tempo (pixel al secondo) – Pimenta

+2

Questo approccio di WinForms? – greenoldman

+7

Mi sento come se dovessi menzionarlo così qualcuno non entra nel divertente problema che ho appena avuto. 'Cursor.Clip' limiterà i movimenti del tuo mouse alle dimensioni specificate da' Location' e 'Size'. Quindi il frammento sopra permetterà solo al tuo mouse di muoversi all'interno del riquadro di delimitazione dell'applicazione. – Brandon

19

First Aggiungi classe (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; 
    } 
} 

Poi chiamare da evento:

Win32.POINT p = new Win32.POINT(); 
p.x = Convert.ToInt16(txtMouseX.Text); 
p.y = Convert.ToInt16(txtMouseY.Text); 

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

Anche in WinForm è possibile utilizzare Cursor.Position = new Point (x, y); – user3290286

+0

da dove viene il tipo POINT? – RollRoll

+0

@ThePoet È una struttura utilizzata dal codice nativo. –

Problemi correlati