2011-11-08 114 views
58

我想模擬每x秒的鼠標移動。爲此,我將使用一個計時器(x秒),當計時器滴答時,我將使鼠標移動。如何使用C#移動鼠標光標?

但是,如何使鼠標光標移動使用C#?

+2

這聽起來像半個解決方案,你不告訴我們的一個問題,這可能有更優雅的解決方案。 –

+0

這很有可能!我們不明白爲什麼,但屏幕保護程序激活通過10分鐘。但是我們放了999分鐘:P –

+2

然後,您應該尋找解決方案,以防止在應用程序運行時屏幕保護程序無法啓動,而不是擺弄鼠標或屏幕保護程序設置。例如。 P/Invoke [SetThreadExecutionState](http://stackoverflow.com/questions/3665332/how-do-i-prevent-screen-savers-and-sleeps-during-my-program-execution/3665545#3665545)。我懷疑這是相關的屏幕保護程序 - 編程的鼠標移動不會重置屏幕保護程序計時器。 –

回答

52

看看Cursor.Position Property。它應該讓你開始。

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

謝謝@詹姆斯希爾,我不記得如何做到這一點,你的例子非常好。我的情況我爲x和y添加了一些計算,以便使鼠標移動時間相關(像素每秒) – Pimenta

+2

這是WinForms方法嗎? – greenoldman

+7

我覺得我應該提到這個,所以有人不會進入我剛纔的搞笑問題。 'Cursor.Clip'會限制鼠標移動到'Location'和'Size'指定的大小。所以上面的代碼片段只允許你的鼠標在應用程序的邊界框內移動。 – Brandon

19

首先添加類(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; 
    } 
} 

然後調用它從事件:

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

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

+0

POINT類型來自哪裏? – RollRoll

+0

@ThePoet它是本地代碼使用的結構。 –