Daten automatisiert in ein fremdes Programm eintragen.



  • Hallo,

    ich würde gerne ein fremdes Programm fernsteuern, bzw. automatisieren. Ist das von C# aus möglich?

    Konkretet geht es um eine Eishockey Simulation, bei der ich für meine Freunde die Aufstellung und die Taktik einstelle, welche mir per ICQ geschickt wurde. Da mir das tägliche eintragen der Daten ehrlich gesagt langsam lästig wird, würde ich dies gerne folgendermaßen automatisieren:

    Man kann online die Daten (die Aufstellung + Taktik) in ein Formular eintragen, welche mit PHP in eine Datei (jeweils 1 pro Team) geschrieben werden. Nun lade ich nur noch diese Dateien auf beispielsweise meinen Desktop und starte mein C#-Programm. Dieses startet die fremde Anwenung, lädt den Spielstand, und trägt nach und nach die Einstellungen ein.

    Wäre das umsetzbar? Ich weiß nur das man Nachrichten an Programme schicken kann welche Button klicks simulieren (habe bisher nur C++ beispiele gefunden), sowie das man Excel mit C# fernsteuern kann. Für Exel sind allerdings schon Methoden im Framework vorhanden.



  • AutoIt habe ich gerade gefunden, wäre mein Anliegen damit umzustzen?



  • AutoIt ist eine Möglichkeit aber schwer in C# einbindbar, vllt hilft dir diese Klasse weiter

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace Click
    {
        public class Win32Input
        {
            [DllImport("user32.dll", EntryPoint = "SendInput", SetLastError = true)]
            static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
    
            [DllImport("user32.dll", EntryPoint = "GetMessageExtraInfo", SetLastError = true)]
            static extern IntPtr GetMessageExtraInfo();
    
            private enum InputType
            {
                INPUT_MOUSE = 0,
                INPUT_KEYBOARD = 1,
                INPUT_HARDWARE = 2,
            }
    
            [Flags()]
            private enum MOUSEEVENTF
            {
                MOVE = 0x0001,  // mouse move 
                LEFTDOWN = 0x0002,  // left button down
                LEFTUP = 0x0004,  // left button up
                RIGHTDOWN = 0x0008,  // right button down
                RIGHTUP = 0x0010,  // right button up
                MIDDLEDOWN = 0x0020,  // middle button down
                MIDDLEUP = 0x0040,  // middle button up
                XDOWN = 0x0080,  // x button down 
                XUP = 0x0100,  // x button down
                WHEEL = 0x0800,  // wheel button rolled
                VIRTUALDESK = 0x4000,  // map to entire virtual desktop
                ABSOLUTE = 0x8000,  // absolute move
            }
    
            [StructLayout(LayoutKind.Sequential)]
            private struct MOUSEINPUT
            {
                public int dx;
                public int dy;
                public int mouseData;
                public MOUSEEVENTF dwFlags;
                public int time;
                public IntPtr dwExtraInfo;
            }
    
            [StructLayout(LayoutKind.Sequential)]
            private struct INPUT
            {
                public InputType type;
                public MOUSEINPUT mi;
            }
            /// <summary>
            /// Diese Funktion bewegt den Mauscursor an einen bestimmten Punkt.
            /// </summary>
            /// <param name="x">X Koordinate der Position als absoluter Pixelwert</param>
            /// <param name="y">Y Koordinate der Position als absoluter Pixelwert</param>
            /// <returns>Liefert 1 bei Erfolg und 0, wenn der Eingabestream schon blockiert war zurück.</returns>
            static public uint Move(int x, int y)
            {
                // Bildschirm Auflösung
                float ScreenWidth = Screen.PrimaryScreen.Bounds.Width;
                float ScreenHeight = Screen.PrimaryScreen.Bounds.Height;
    
                INPUT input_move = new INPUT();
                input_move.type = InputType.INPUT_MOUSE;
    
                input_move.mi.dx = (int)Math.Round(x * (65535 / ScreenWidth), 0);
                input_move.mi.dy = (int)Math.Round(y * (65535 / ScreenHeight), 0);
                input_move.mi.mouseData = 0;
                input_move.mi.dwFlags = (MOUSEEVENTF.MOVE | MOUSEEVENTF.ABSOLUTE);
                input_move.mi.time = 0;
                input_move.mi.dwExtraInfo = GetMessageExtraInfo();
    
                INPUT[] input = { input_move };
                return SendInput(1, input, Marshal.SizeOf(input_move));
            }
    
            /// <summary>
            /// Diese Funktion simuliert einen einfach Mausklick mit der linken Maustaste an der aktuellen Cursurposition.
            /// </summary>
            /// <returns>Liefert 2 zurück, wenn beide Aktionen (Maus down und Maus up) erfolgreich waren. Andernfalls 1 oder 0.</returns>
            static public uint Click()
            {
                INPUT input_down = new INPUT();
                input_down.type = InputType.INPUT_MOUSE;
    
                input_down.mi.dx = 0;
                input_down.mi.dy = 0;
                input_down.mi.mouseData = 0;
                input_down.mi.dwFlags = MOUSEEVENTF.LEFTDOWN;
                input_down.mi.time = 0;
                input_down.mi.dwExtraInfo = GetMessageExtraInfo();
    
                INPUT input_up = input_down;
                input_up.mi.dwFlags = MOUSEEVENTF.LEFTUP;
    
                INPUT[] input = { input_down, input_up };
                return SendInput(2, input, Marshal.SizeOf(input_down));
            }
    
        }
    
    }
    


  • Es gibt auch noch das UI Automation Framework seit .Net 3.0. ich weiß allerdings nicht ob es damit geht, da ich damit noch nicht gearbeitet habe.

    P.S. UISpy und Spy++ solltest Du dir auch unbedingt mal anschauen.



  • Danke, die Klasse sieht nach einem kurzen überfliegen interessant aus, vielen Dank. 🙂

    UISpy und Spy++, sowie die im Framework vorhandenen Methoden zur UI-Controlle werde ich mir auch mal angucken.



  • Hallo,

    wenn Du es einfach haben möchtest, mach es mit dem White Framework, wenn Du es minimal komplizierter, aber schneller haben möchtest, mache es wie schon beschrieben mit dem WPF UIAutomation Framework - entgegen des Names kann man damit außer WPF-Anwendungen auch Windows Forms Anwendungen, und Win32 Anwendungen steuern.

    Ein Beispiel für das White Framework findet man hier: http://www.scip.be/index.php?Page=ArticlesNET19 und ein Beispiel für den anderen Vorschlag findet man hier: http://www.scip.be/index.php?Page=ArticlesNET20&Lang=EN

    Für den Einstieg sind die meiner Meinung nach gut geeignet.


Anmelden zum Antworten