Pausen auf Knopfdruck, ansonsten Weiter.



  • Hallo liebe C++ Profis und die, die mal welche werden wollen ;).

    Ich habe eine Frage, und weiß nicht genau, wie ich sie beschreiben soll. Ich habe schon viel im Internet gesucht, aber keine passende Antwort darauf gefunden.

    Ich weiß nicht ob ich es sagen darf, aber es ist eine Art "Bot" für ein Spiel, wo man andauernd die gleiche Mausreihenfolge abfahren muss. Deshalb dachte ich mir, ich schreibe mal ein Programm dass mir dies erledigt.

    #include <iostream>
    #include <Windows.h>
    #include <conio.h>
    
    using namespace std;
    
    // x = 1440
    // y = 900
    
    void spell()
    {
    	Sleep(1500);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    void do1()
    {
    	Sleep(1500);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
    
    	Sleep(750);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    void do3()
    {
    	Sleep(1500);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
    
    	Sleep(1000);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    void do2()
    {
    	Sleep(3000);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
    
    	Sleep(1000);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    void do4()
    {
    	Sleep(750);
    	SetCursorPos(x, y);
    	mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    	mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    int main()
    {
    	cout << "Press Enter to start in 5 seconds";
    	getch();
    	while(1)
    	{
    		Sleep(5000);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		spell();
    		Sleep(750);
    		SetCursorPos(x, y);
    		mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    		mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    		do1();
    
    		do2();
    
    		do3();
    
    		do4();
    	}
    }
    

    So, das ist der Code. Jetzt gibt es aber ein kleines Problemchen. Ich möchte wenn ich z.b. f5 drücke (oder irgendeine andere Taste), dass das Programm stoppt, bzw schließt. Ich habe aber keine Ahnung, wie ich dies tun kann. Ich dachte schonmal an sowas:

    spell();
    Sleep(750);
    SetCursorPos(x, y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    if(getch())
    {
         exit(1);
    }
    
    spell();
    Sleep(750);
    SetCursorPos(x, y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    if(getch())
    {
         exit(1);
    }
    
    spell();
    Sleep(750);
    SetCursorPos(x, y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    
    if(getch())
    {
         exit(1);
    }
    
    usw....
    

    ...dies geht aber auch nicht, da das Programm an dieser Stelle (if(getch())....) immer aufhört, und auf eine Eingabe wartet, aber es soll ja immer UNUNTERBROCHEN arbeiten... 😞

    Also nochmal zusammengefasst: Ich möchte eine Pause zwischen den verschiedenen Anweisungen machen, ABER IMMER NUR DANN, wenn ich z.B. f5 oder eine änliche Taste drücke.
    Ich hoffe auf eine Antwort

    liebe Grüße
    Tortorios 🙂



  • Das geht mit der Funktion kbhit() aus der conio.h , die überprüft, ob eine Taste gedrückt ist.

    char taste;
    if (kbhit())
    {
       taste = getch();
    }
    


  • On topic:
    Die Funktionalität in einen Thread auslagern, der per Tastendruck angehalten/fortgesetzt/abgebrochen werden kann.

    Off topic:
    Du weißt, dass man Funktionen Parameter übergeben kann? Die immer wiederkehrenden SetCursorPos/mouse_event Aufrufe kann man mit einer Funktion erschlagen.Ausserdem ist mouse_event deprecated, stattdessen sollte SendInput verwendet werden.

    Noch mehr off-topic:
    Es gibt AutoHotKey



  • Der Code kann doch nicht dein ernst sein. Du musst erstmal an deinem Stil arbeiten. Das wäre mal eine kürzere Variante (hab's nicht ausprobiert ob es läuft):

    void SleepAndMove(unsigned int iFirst, unsigned int iSecond) 
    {
        Sleep(iFirst);
        SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
        mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
    
        Sleep(iSecond);
        SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
        mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    void spell(unsigned int iTime) 
    {
        Sleep(iTime);
        SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
        mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    int main()
    {
        cout << "Press Enter to start in 5 seconds";
        cin.get();
        while(1)
        {
            Sleep(5000);
    
            for (int i = 0; i < 8; i++)
            {
                spell();
                Sleep(750);
                SetCursorPos(x, y);
                mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
                mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
            }
    
    	SleepAndMove(1500, 750);
    	SleepAndMove(3000, 1000);
    	SleepAndMove(1500, 1000);
    	spell(750);
        }
    
        return 0;
    }
    

    Ich habe aber keine Ahnung, wie ich dies tun kann.

    Probier's doch mit Alt+F4 :p
    Edit: Spaß bei Seite. probier mal die while-Bedingung mit while (cin.peek() == EOF) { zu ersetzen.

    Grüße,
    Rewind



  • danke für die schnellen antworten. muss noch testen ob es geht:)

    @[Rewind]:
    Ich bin noch nicht so gut wie du :D. muss halt noch üben ;). ich hatte auch schon an eine inkrementierung (ich glaub das is das richtige wort :D) der koordinaten gedacht, wüsste aber nicht wie ^^.

    naja, danke aufjedenfall an alle für die antworten. 🙂

    tortorios



  • Die Anmerkung von mir war nicht böse gemeint. Man sollte jedoch die grundlegenden Dinge wie Funktionen und Schleifen als Erstes verinnerlichen, weil das einem unnötige mühsame Arbeit und viel Kopfschmerzen bei der Suche von Fehlern ersparen kann.



  • Ich weiß das es nicht böse gemeint war rewind. :>

    Ich hab das Programm gerade mal getestet, und es hat alles so funktioniert, wie ich es haben wollte.

    Vielen Dank an alle 🙂



  • [Rewind] schrieb:

    Der Code kann doch nicht dein ernst sein. Du musst erstmal an deinem Stil arbeiten. Das wäre mal eine kürzere Variante (hab's nicht ausprobiert ob es läuft):

    One function, one purpose. Jede Funktion sollte genau eine Aufgabe erfüllen, daher bin ich der Meinung, dass Sleep und SimulateMouseClick zwei verschiedene Funktionen sein sollten, statt sie in einer zusammenfassen zu wollen.



  • DocShoe schrieb:

    [Rewind] schrieb:

    Der Code kann doch nicht dein ernst sein. Du musst erstmal an deinem Stil arbeiten. Das wäre mal eine kürzere Variante (hab's nicht ausprobiert ob es läuft):

    One function, one purpose. Jede Funktion sollte genau eine Aufgabe erfüllen, daher bin ich der Meinung, dass Sleep und SimulateMouseClick zwei verschiedene Funktionen sein sollten, statt sie in einer zusammenfassen zu wollen.

    Ich versteh nicht ganz was bzw. welche Funktionen zu meinst... 😕



  • Na deine SleepAndMove und spell Funktionen. Nach meinem Empfinden macht es mehr Sinn, eine mouse_click Funktion anzubieten, die einen Mausklick der entsprechenden Taste simuliert. Die spell() Funktion simuliert dann lediglich einen Mausklick, die Verzögerung hat nichts mit dem Spell zu tun und ist eigentlich Teil der Job-Queue. Gleiches gilt für die SleepAndMove Funktion.

    Aus

    void spell()
    {
      Sleep( 750 );
      mouse_event( down );
      mouse_event( up );
    }
    
    int main()
    {
       while( true )
       {
          spell();
       }
    }
    

    würde bei mir

    void mouse_click( MouseButton Button, int x, int y )
    {
      ::SetCursor( x,y );
      mouse_event( <Buttondown> );
      mouse_event( <Buttonup> );
    }
    
    void spell()
    {
       // führt alle Input Aktionen für den Zauberspruch aus
       mouse_click( spellx, spelly );
    }
    
    int main()
    {
       while( true )
       {
          // Zauberspruch ausführen
          spell();
    
          // Cooldown abwarten
          Sleep( 750 );
       }
    }
    

    Richtig sexy wird das Ganze aber erst mit dem Command Pattern und Funktionsobjekten.



  • ehm, ja. natürlich ^^.

    das ist für mich noch ein bisschen zu hoch :D.


Anmelden zum Antworten