Controlla un’altra applicazione usando C #

Devo controllare altre applicazioni simulando il movimento del mouse e l’input da tastiera. Come posso realizzare questo in C #? È ansible?

Hai guardato White TestStack ?

Codice d’esempio:

Application application = Application.Launch("foo.exe"); Window window = application.GetWindow("bar", InitializeOption.NoCache); Button button = window.Get 

Non penso che possa andare meglio di così. La libreria è creata da ThoughtWorks.

Vedere “Per inviare una sequenza di tasti a un’altra applicazione” in questa pagina:

http://msdn.microsoft.com/en-us/library/ms171548.aspx

Utilizzare l’API Win32 Native SendMessage . DllImport questo metodo da User32.dll. Puoi utilizzare questa API per inviare sia i messaggi della tastiera che quelli del mouse

Puoi usare p / invoke, ho rubato il seguente codice per i clic del mouse in punti casuali su un pulsante con un handle noto:

  [Flags] public enum MouseEventFlags { LEFTDOWN = 0x00000002, LEFTUP = 0x00000004, MIDDLEDOWN = 0x00000020, MIDDLEUP = 0x00000040, MOVE = 0x00000001, ABSOLUTE = 0x00008000, RIGHTDOWN = 0x00000008, RIGHTUP = 0x00000010 } [StructLayout(LayoutKind.Sequential)] public struct Rectangle { public int X; public int Y; public int Width; public int Height; } private static void Click(IntPtr Handle) { lock (typeof(MouseAction)) { Rectangle buttonDesign; GetWindowRect(Handle, out buttonDesign); Random r = new Random(); int curX = 10 + buttonDesign.X + r.Next(100 - 20); int curY = 10 + buttonDesign.Y + r.Next(60 - 20); SetCursorPos(curX, curY); //Mouse Right Down and Mouse Right Up mouse_event((uint)MouseEventFlags.LEFTDOWN, curX, curY, 0, 0); mouse_event((uint)MouseEventFlags.LEFTUP, curX, curY, 0, 0); } } [DllImport("user32.dll")] static extern bool SetCursorPos(int X, int Y); [DllImport("user32.dll")] private static extern void mouse_event( long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); [DllImport("user32.dll")] static extern bool GetWindowRect(IntPtr hWnd, out Rectangle rect); 

puoi usare AutoIT , è freeware e ha una versione dll che puoi importare in C # (DllImport). Ti consente di fare clic sui controlli, scrivere stringhe per modificare caselle, effettuare selezioni di caselle combinate, ecc. Su un’altra applicazione da C #.

Ho provato a fare lo stesso: per usare il mouse ho usato questa class

(è necessario aggiungere using System.Runtime.InteropServices; )

 public class MouseClick1 //public is important here** { [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo); private const int MOUSEEVENTF_LEFTDOWN = 0x02; private const int MOUSEEVENTF_LEFTUP = 0x04; private const int MOUSEEVENTF_RIGHTDOWN = 0x08; private const int MOUSEEVENTF_RIGHTUP = 0x10; public int CoordX { get; set; } public int CoordY { get; set; } public void Click1() { Cursor.Position = new Point(CoordX, CoordY); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } } 

e dopo sul form1 (presumendo che il nome sia form1) puoi farlo

  public partial class form1 : Form { MouseClick1 button1 = new MouseClick1(); MouseClick1 button2 = new MouseClick1(); 

[…]

  public void Simulate_button1and2_Click(object sender, EventArgs e) { button1.CoordX = 1652; //random coordinates button1.CoordY = 225; button2.CoordX = 1650; button2.CoordY = 250; button1.Click1(); button1.Click2(); 

}}

Per avere le coordinate sul puntatore, utilizzo un timer e un’etichetta:

  private void timer1_Tick(object sender, EventArgs e) { Coord.Text = Cursor.Position.X.ToString() + " : " + Cursor.Position.Y.ToString(); //Premet d'avoir les coord en direct } 

Funziona bene con me.