Schleife aktivieren und deaktivieren mit 2 Tasten



  • Hallo zusammen,
    ich bin noch C++ Anfänger und Programm zu schreiben, dass eine Schleife per Tastendruck aktiviert und zu deaktiviert. Eine zweite Taste soll die Schleife immer deaktivieren und die erste Taste zurücksetzen. das klappt auch alles bis auf das zurücksetzen. Hat irgendwer eine Idee wie man das umsetzen könnte? Mir fällt absolut nichts mehr ein, habe einige Keystate und AsyncKeystate Varianten durch.

    bool loopy = false;

    int main()
    {
    while (true)
    {
    if (GetKeyState(VK_XBUTTON2) > 0) {
    loopy = true;
    }
    else {
    loopy = false;
    }
    if (GetKeyState(VK_XBUTTON1) < 0) {
    loopy = false;
    //BYTE keystate[256] = { 0 };
    //SetKeyboardState(keystate);
    }
    if (loopy) {
    //do stuff
    }
    }
    }



  • Du wertest die Rückgabe von GetKeyState falsch aus (einmal > 0, einmal < 0).
    Teste direkt das High-Order-Bit:

    if (GetKeyState(VK_XBUTTON1) & 0x8000)
    

    PS: Falsches Unterforum (WinAPI wäre besser).
    Und deinen Code solltest du auch mit Code-Tags formatieren.



  • ok danke dir schonmal ich versuchs mal so zu lösen. Weißt du wie ich das Thema verschieben kann ins WinAPI Forum?



  • Das muß ein Moderator machen (war auch als Hinweis für dich gedacht, daß deine Frage mit C++/CLI überhaupt nichts zu tun hat).

    Das Editieren deines Code kannst du aber selber über das Menü mit den 3 Punkten -> "Bearbeiten" vornehmen. Dann deinen Code markieren und den Button "</>" drücken.



  • @Ezah sagte in Schleife aktivieren und deaktivieren mit 2 Tasten:

    if (GetKeyState(VK_XBUTTON2) > 0) {
    loopy = true;
    }
    else {
    loopy = false;
    }

    So bewirkt jetzt VK_XBUTTON2 das "Aktivieren" und das "Deaktivieren" von loopy. Wenn du mit VK_XBUTTON2 nur "Aktivieren" willst, dann mach den else Zweig weg.

    Ich frage mich auch ob du einen Message-Loop hast, in dem Code den du zeigst ist auf jeden Fall keiner zu sehen. Wenn du keinen hast, bzw. einen hast aber davon unabhängig sein willst, dann solltest du GetAsyncKeyState statt GetKeyState verwenden.

    Und natürlich die Sache mit 0x8000, was @Th69 schon geschrieben hat.

    In Kombination:

    bool loopy = false;
    
    int main()
    {
        while (true)
        {
            if (GetAsyncKeyState(VK_XBUTTON2) & 0x8000) {
                loopy = true;
            }
            if (GetAsyncKeyState(VK_XBUTTON1) & 0x8000) {
                loopy = false;
            }
            if (loopy) {
                //do stuff
            }
        }
    }
    


  • Hey danke euch! Das funktioniert gut, aber ich hätte nun auch gerne zusätzlich die Möglichkeit den Loop mit Button2 zu stoppen. Hat jemand eine Idee wie das funktionieren könnte?



  • @Ezah sagte in Schleife aktivieren und deaktivieren mit 2 Tasten:

    Hey danke euch! Das funktioniert gut, aber ich hätte nun auch gerne zusätzlich die Möglichkeit den Loop mit Button2 zu stoppen.

    Dann schreib mal auf, bei welchen Zuständen der Tasten welche Aktion ausgeführt werden soll.

    Bei einer Eintastenlösung wäre ja dauerhaft gedrückt "läuft", nicht gedrückt "läuft nicht"
    Bei einer Zweitastenlösung wäre Taste1 gedrückt "start", Taste2 gedrückt "stop"

    Du willst irgendwas dazwischen. Welche Taste hat da Vorrang?



  • Erklär bitte genau was alle Tasten machen sollen.
    z.B. was meinst du mit "Loop stoppen"?



  • mit Loop stoppen meine ich:
    if (loopy) {
    //do stuff
    }
    diesen Part zu überspringen.

    Taste1: Start
    nochmal Taste 1: Stop
    Taste 2: immer Stop und Taste 1 resetten, sodass beim nächsten mal Taste 1 drücken der Loop auf jeden Fall startet.

    Sorry weiß nicht wie ich das besser beschreiben kann. xD Taste 2 soll quasi ein Programmneustart sein. Alles auf Off

    Im Moment ist es so, dass wenn ich Taste 2 drücke der Loop stoppt, aber ich muss danach immer 2 mal Taste 1 drücken weil die quasi noch auf true ist.



  • OK. Zeig mal deinen Code.



  • bool loopy = false;
    
    LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if (wParam == WM_XBUTTONDOWN) {
    		if (HIWORD(((PMSLLHOOKSTRUCT)lParam)->mouseData) == XBUTTON2)
    		{
    			loopy = !loopy;
    			return true;
    		}
    		else if (HIWORD(((PMSLLHOOKSTRUCT)lParam)->mouseData) == XBUTTON1)
    		{
    			loopy = false;
    			return true;
    		}
    	}
    
    	return CallNextHookEx(0, nCode, wParam, lParam);
    }
    
    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
    	while (true)
    	{
    		if (loopy)
    		{
    			// do stuff
    		}
    	}
    }
    
    int main(void)
    {
    	SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandle(0), 0);
    
    	CreateThread(0, 0, ThreadProc, 0, 0, 0);
    
    	while(GetMessage(0, 0, 0, 0));
    
    	ExitProcess(EXIT_SUCCESS);
    }


  • Achje, das ist ja nun wieder komplett anders als was du ursprünglich gepostet hast.



  • @hazE ooooh nice !! funktioniert perfekt, tausend Dank!
    Jetzt muss ich nur noch die Dokumentation durchforsten und versuchen dahinterzusteigen wie du das gemacht hast 😄
    Danke an alle! 👏


Anmelden zum Antworten