Button in externem Programm anklicken

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Button in externem Programm anklicken

    Guten Abend!

    Ich lade mir gerade GTA über den Rockstar-Launcher (nicht über Steam) herunter. Das Problem an der Sache ist, dass ich eine schlechte Internetverbindung habe und der Download regelmäßig abbricht. Nun ist der Download-Launcher leider nicht so schlau, den Download bei wieder verfügbarer Internetverbindung fortzusetzen, sondern man muss manuell einen Button mit dem Titel "Erneut versuchen" anklicken. Ich würde die 80 GB gerne über Nacht und vormittags/mittags herunterladen, da ich dann sowieso eher nicht am PC sein kann.

    Ist es irgendwie möglich ein Programm in VisualBasic zu schreiben, welches den Klick auf den Button "Erneut versuchen" für mich übernimmt, wenn der Button halt auch da ist (also der Launcher den Download unterbrochen hat)?

    Schonmal vielen Dank im Voraus für die Antworten!

    LG
    Willkommen im Forum.
    Schau doch mal in den Thread von RfG und in den meinigen rein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank!

    Ich komme mit der Methode von RfG aktuell überhaupt nicht weiter. Mir spuckt er bei meinem Code eine Fehlermeldung aus. Ich habe einfach mal zum Test das ganze in die Funktion Form1 gepackt, nur um zu probieren, ob es funktioniert.

    Spoiler anzeigen
    //Deklarieren
    bool keepDownloadAlive = false; //Gibt an, ob die Überprüfung und Fortsetzung des Download aktiv ist.
    private Process _Process; //
    private IntPtr _MainWnd;
    public const int BM_CLICK = 0xF5;

    //Fremdprozess
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern IntPtr SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);

    public Form1()
    {
    //Prozess definieren
    Process[] prAll = Process.GetProcessesByName("GTAVLauncher");
    this._Process = prAll[0];
    this._MainWnd = prAll[0].MainWindowHandle;

    SendMessage(FindWindowEx(this._MainWnd, IntPtr.Zero, "Button", "PAUSE"), BM_CLICK, IntPtr.Zero, null);

    InitializeComponent();
    button1.Text = "Aktivieren";
    label4.Text = "Deaktiviert";
    }

    private void Button1_Click(object sender, EventArgs e)
    {
    if (keepDownloadAlive == false)
    {
    keepDownloadAlive = true;
    button1.Text = "Deaktivieren";
    label4.Text = "Aktiviert";
    } else
    {
    keepDownloadAlive = false;
    button1.Text = "Aktivieren";
    label4.Text = "Deaktiviert";
    }
    }

    private void Timer1_Tick(object sender, EventArgs e)
    {
    if (keepDownloadAlive == true)
    {
    //Button des Fremdprogramm anklicken, wenn er erscheint

    }
    }


    Ich weiß natürlich nicht genau, wie die Buttons heißen.

    Folgender Fehler kommt nach dem Debugging:
    Spoiler anzeigen
    ""return value" kann nicht gemarshallt werden: Ungültige verwaltete/nicht verwaltete Typenkombination (Int/UInt muss mit SysInt oder SysUInt kombiniert werden).."


    Ich würde mich über eine Hilfe sehr freuen. Aktuell nach zwei Tagen ist der Download bei 3,82 GB von 82 GB. Es bringt leider überhaupt nichts, ihn über Nacht laufen zu lassen, da nach spätestens zwanzig Minuten wieder dieser Button "ERNEUT VERSUCHEN" erscheint und ich den dann wohl wie einen Totmannsknopf in regelmäßigen Abständen betätigen müsste :D
    Hallo :)

    wenn es sich für eine einmalige Sache handelt würde ich dafür nicht direkt ein Programm schreiben.
    Mach dir dafür lieber ein kleines Makro, wenn du nicht am Rechner bist kannst du auch ganz simpel ein MouseClick in einem Timer packen und den Courser immer auf der Stelle stehen lassen und schlafen gehen. Oder schau nach einem ClickRecorder. Denke damit kommst du schneller zum Ziel
    Danke für den Denkanstoß auf KISS-Rückbesinnung.
    @q-es-to: Falls Du es doch mit VS machen willst, dann kannst Du damit nen Maustastenklick (linke Taste) bei Timer_Tick auslösen:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll", EntryPoint:="mouse_event")> Private Shared Sub MouseEvent(dwFlags As UInteger, dx As UInteger, dy As UInteger, dwData As UInteger, dwExtraInfo As Integer) : End Sub
    4. Private Const MOUSEEVENTF_LEFTDOWN = &H2
    5. Private Const MOUSEEVENTF_LEFTUP = &H4
    6. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    7. PerformMouseClick()
    8. End Sub
    9. Public Shared Sub PerformMouseClick()
    10. MouseEvent(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    11. MouseEvent(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    12. End Sub
    13. End Class

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    q-es-to schrieb:

    Folgender Fehler kommt nach dem Debugging:
    Das ist einfach eine Typ-Unverträglichkeit.
    Poste Deinen Code, der den Fehler erzeugt und die Deklaration der verwendeten API-Prozedur.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!