2009-07-16 2 views
19

Мне нужно управлять другим приложением, моделируя движение мыши и ввод с клавиатуры. Как это сделать на C#? Возможно ли это?Управление другим приложением с использованием C#

+3

Возможно, Джон Скит - единственный, кто может это сделать :) –

+0

Похож на дубликат http://stackoverflow.com/questions/412598/how-to-interact-with-an-application-programmatically. Я обнаружил, что при поиске http://stackoverflow.com/search?q=Control+another+application –

+0

Однако принятый ответ на этот вопрос отличается от принятого ответа для дубликата (оба обеспечивают разумное решение). –

ответ

35

Вы смотрели на White TestStack?

Пример кода:

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

Button button = window.Get<Button>("save"); 
button.Click(); 

Я не думаю, что может быть лучше, чем это. Библиотека создана ThoughtWorks.

+0

- то, что плохое звено или кодплекс просто бросил концепцию? –

+0

Я пытался просмотреть документацию Белого проекта, и он начал давать ошибки! BTW, «Белый» даст вам подход OO для управления приложениями на базе Windows. – SolutionYogi

+0

Белый кажется хорошим маршрутом. Я займусь этим. – Salamander2007

1

Использовать собственный Win32 API SendMessage. DllImport этот метод из User32.dll. Вы можете использовать этот API для отправки как клавиатуры & мыши сообщений

1

Вы можете использовать P/Invoke, я украл следующий код для щелчков мыши в случайных точках на кнопке с известной ручкой:

[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); 
1

вам может использовать AutoIT, это бесплатная программа, и у нее есть версия dll, которую вы можете импортировать в C# (DllImport). Он позволяет вам нажимать на элементы управления, записывать строки для редактирования полей, делать выборки combobox и т. Д. В другом приложении с C#.

0

Я попытался сделать то же самое: использовать мышь, я использовал этот класс

(вам нужно добавить 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); 

     } 

    } 

и после того, как на ваших Form1 (предполагающее зовут form1) вы может

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(); 

}}

Чтобы иметь координаты на указатель, я использую таймер и этикетку:

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 

     } 

прекрасно работают со мной.

Смежные вопросы