Kontroluj inną aplikację za pomocą C#

Muszę sterować inną aplikacją symulując ruch myszy i wprowadzanie klawiatury. Jak to osiągnąć w C#? Czy to w ogóle możliwe?

 19
Author: Salamander2007, 2009-07-16

6 answers

Have you look at Biały TestStack ?

Przykładowy kod:

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

Button button = window.Get<Button>("save");
button.Click();
Nie sądzę, żeby mogło być lepiej. Biblioteka jest tworzona przez ThoughtWorks.
 35
Author: SolutionYogi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-08 22:39:24

Patrz "aby wysłać naciśnięcie klawisza do innej aplikacji"na tej stronie:

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

 4
Author: Sam Harwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-16 01:34:03

Użyj SendMessage natywnego API Win32. DllImport ta metoda z User32.dll. Możesz użyć tego API do wysyłania wiadomości z klawiatury i myszy

 1
Author: abhilash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-16 01:36:14

Możesz użyć p / invoke, ukradłem następujący kod do klikania myszką w losowych miejscach na przycisku ze znanym uchwytem:

    [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
Author: Yuriy Faktorovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-16 01:36:18

Możesz użyć AutoIT, jest freeware i ma wersję dll, którą możesz zaimportować do C# (DllImport). Pozwala na klikanie na kontrolki, zapisywanie ciągów do edycji pól, dokonywanie selekcji combobox itp. w innej aplikacji z C#.

 1
Author: xavier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-29 13:50:49

Próbowałem zrobić to samo: aby użyć myszki użyłem tej klasy

(musisz dodać 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);

        }

    }

I po NA formula1 (zakładając, że nazwa to formula1) możesz

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

} }

Aby mieć współrzędne na wskaźniku, używam timera i etykiety:

 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

        }
Mi pasuje.
 0
Author: jsls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-09 10:17:27