Abbruch einer Schleife



  • Hallo!

    Ich habe ein kleines Problem.
    Ich habe mich an die Arbeit gemacht und wollte ein kleines Programm zum Autoklicken erstellen.
    Das ganze sollte so aussehen, dass wenn ich die linke Maustaste gedrückt halte, mein Rechner in dieser Zeit mit hoher Frequenz klickt.
    Das funktioniert in sofern leider nicht, dass mein Programm, einmal gestartet, nicht aufhört zu klicken. Deshalb habe ich mich informiert und ein "break" eingebaut, dieser bricht aber leider nur die innere schleife für kurze zeit und nicht die äußere. Hier ist der code, den ich bis jetzt geschrieben, bzw copiert habe...

    #include <windows.h>
    #include <iostream>
    #include <conio.h>

    using namespace std;

    using namespace std;

    int main(int argc, char* argv[])
    {
    INPUT_RECORD inRec;

    HANDLE hcon = GetStdHandle(STD_INPUT_HANDLE);

    while(1)
    { cout << "While 1" << endl;
    DWORD nCnt = 0;
    BOOL bOK = ReadConsoleInput(hcon, &inRec, 1, &nCnt);
    if(GetAsyncKeyState(VK_CONTROL))
    {
    if(bOK && nCnt == 1)
    {
    if(inRec.EventType == MOUSE_EVENT)
    {
    while(inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
    { cout << "While 2" << endl;
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    Sleep(20);
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    Sleep(20);
    if (GetAsyncKeyState(VK_CONTROL))
    {
    break;
    }
    else continue;
    }
    }
    }
    }
    }
    return 0;
    }

    ps: ich bin ein absoluter Noob im Umgang mit C++... Mit Java bin ich auch nur am Anfang...

    MFG



  • Für einfach noch eine boolsche Variable ein, zb bool keepRunning = true; und frag darauf zusätzlich in den Schleifen ab und setz sie vor/statt deinem break. 😉



  • ok danke sehr!
    werde ich gleich mal ausprobieren!



  • leider hats nicht wirklich geholfen.
    er setzt die variable zwar auf true wenn ich controle drücke, geht aber nicht in die 2. schleife...
    mein code mit bool:

    #include <windows.h>
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
      INPUT_RECORD inRec;
      bool run=false;
      HANDLE hcon = GetStdHandle(STD_INPUT_HANDLE);
      while(1)
      {          cout << "While 1" << endl;
       DWORD nCnt = 0;
       BOOL bOK = ReadConsoleInput(hcon, &inRec, 1, &nCnt);
       if(GetAsyncKeyState(VK_CONTROL))
       {
          bool run=true;
          cout << "true" << endl;
          Sleep(1000)
       }
       if(bOK && nCnt == 1)
        {
        if(inRec.EventType == MOUSE_EVENT)
         {
         while(inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED&& run==true)
          {          cout << "While 2" << endl;
          mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
          Sleep(20);
          mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
          Sleep(20);
          if (GetAsyncKeyState(VK_CONTROL))
            {
    		bool run=false;
    		}
    		else continue;
          }
          }
        }
      }
     return 0;
     }
    

    die couts sind nur dafür da, damit ich weiss in welche schleife er ist...

    MFG



  • Pack hinter die zweite Schleife ein if (run == false) break; und fertig.
    Ist zwar keine schöne Methode aber (sorry) das macht da auch keinen Unterschied. 😉



  • mindfreak schrieb:

    leider hats nicht wirklich geholfen.
    er setzt die variable zwar auf true wenn ich controle drücke, geht aber nicht in die 2. schleife...

    Was erwartest du, wenn du nicht die eigentliche Variable änderst, sondern jedesmal eine neue lokale Variable deklarierst.

    int main()
    {
        bool run = false; // Variablendeklaration mit initialisierung
        {
            bool run = true; // Variablendeklaration mit initialisierung
            // dies ist eine NEUE Variable
        }
        run = true; // So sieht eine Zuweisung aus
    }
    


  • er geht ja garnicht erst in die 2. schleife rein und ich glaub das hat was mit dem bool zutun falls ich nämlich in einer fallunterscheidung &&run==true reinpacke, wird diese nicht mehr ausgeführt...



  • sorry.. wie gesagt ich bin absoluter anfänger auf dem c++ gebiet... hab nur ein bisschen rumprobiert... aber danke ich werds ändern



  • #include <windows.h>
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
      INPUT_RECORD inRec;
    
      HANDLE hcon = GetStdHandle(STD_INPUT_HANDLE);
    
      bool run = true;
    
      while(run)
      {
       cout << "While 1" << endl;
       DWORD nCnt = 0;
       BOOL bOK = ReadConsoleInput(hcon, &inRec, 1, &nCnt);
       if(GetAsyncKeyState(VK_CONTROL))
       {
         if(bOK && nCnt == 1)
         {
           if(inRec.EventType == MOUSE_EVENT)
           {
             while(inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
             {  
               cout << "While 2" << endl;
               mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
               Sleep(20);
               mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
               Sleep(20);
               if (GetAsyncKeyState(VK_CONTROL))
               {
                 run = false;
    	     break;
               }
             }
          }
        }
      }
    }
     return 0;
     }
    


  • Vielen dank für die hilfe, aber das programm läuft nun nur einmal durch und das wars... naja.. ich danke ihnen vielmals...
    falls jemand von ihnen einen solchen autoklicker schonmal in c++ geschrieben hat kann derjenige sich vllt bei mir melden denn mit meinen ahk scripten is die ganze sache ziemlich langsam...
    hier ein beispiel von ahk:

    autoklick() 
       { 
    
    	loop	
    	{	
    
       		Click down left
       		Sleep 25
       		Click up left 
       		Sleep 25
    		GetKeyState, LButtonState, LButton, P
    		IF LButtonState = U
    		{
    		break
    		}		   
    
    	}
    
       }
    

    mit vielen freundlichen grüßen


Log in to reply