Programm per Tastendruck stoppen/starten.



  • Ich möchte dass das Programm wenn man F9 drückt stoppt und wenn man auf F10 drückt wieder weiter macht. Wie mache ich das am besten? 😕
    Ihr könnt mir ja auch noch ein paar Tipps für den rest des Codes geben weil er nicht wirklich der beste ist. 😉

    /*© Copyright Enitin*/
    #include <conio.h>
    #include <Windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int Zeit = 0;
    
    	cout << "----------------------" << endl;
    	cout << "| © Copyright Enitin |" << endl;
    	cout << "----------------------\n" << endl;
    	cout << "Druecken Sie eine Taste um das Programm zu starten." << endl;
    	getch();
    
    Anfang:
    
    	while (Zeit < 5)
    	{
    		Sleep (500);
    		Zeit++;
    		keybd_event(VK_SPACE,0,0, 0);
    	}
    
    	Zeit = 0;
    	keybd_event(VkKeyScan('3'),0,0,0);
    	Sleep (500);
    	keybd_event(VkKeyScan('3'),0,0,0);
    	goto Anfang;
    
    	return 0;
    }
    


  • goto ?

    #include <conio.h>
    #include <Windows.h>
    #include <iostream>
    
    int main()
    {
            std::cout << "Druecken Sie eine Taste um das Programm zu starten.\n";
            getch();
    
            for(;;)
            {
                    for(int Zeit = 0;Zeit < 5;++Zeit)
                    {
                            Sleep (500);
                            keybd_event(VK_SPACE,0,0, 0);
                    }
    
                    keybd_event(VkKeyScan('3'),0,0,0);
                    Sleep (500);
                    keybd_event(VkKeyScan('3'),0,0,0);
            }
    }
    

    Und zu deinem "Problem": Das geht so nicht. Entweder du fragst zu bestimmten Zeiten mit GetKeyState(VK_F9) >> 15 ab, oder nicht. Das synchron laufen zu lassen sieht problematisch aus, gerade für einen Anfänger wie dich.



  • Es muss doch eine Möglichkeit geben das Programm mit einer Taste zu pausieren und bei einem erneutem druck wieder weiter laufen zu lassen. 😞



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Enitin schrieb:

    Es muss doch eine Möglichkeit geben das Programm mit einer Taste zu pausieren und bei einem erneutem druck wieder weiter laufen zu lassen. 😞

    Klar geht das. Das einfachste ist Du pollst und sendest Deine Tasten in Zylen, die Du selber mit GetTickCount ermittelst...



  • Martin Richter schrieb:

    Enitin schrieb:

    Es muss doch eine Möglichkeit geben das Programm mit einer Taste zu pausieren und bei einem erneutem druck wieder weiter laufen zu lassen. 😞

    Klar geht das. Das einfachste ist Du pollst und sendest Deine Tasten in Zylen, die Du selber mit GetTickCount ermittelst...

    Meinst du Zyklen? 😃



  • Du bist einfach ein Vollpfosten.



  • Und wie geht das wenn ich fragen darf? Genau erklären bitte. 🙂



  • Enitin schrieb:

    Ich möchte dass das Programm wenn man F9 drückt stoppt und wenn man auf F10
    drückt wieder weiter macht. Wie mache ich das am besten? 😕
    Ihr könnt mir ja auch noch ein paar Tipps für den rest des Codes geben weil er nicht wirklich
    der beste ist. 😉

    Sone schrieb:

    Und zu deinem "Problem": Das geht so nicht. Entweder du fragst zu bestimmten
    Zeiten mit GetKeyState(VK_F9) >> 15 ab, oder nicht. Das synchron laufen zu lassen sieht
    problematisch aus, gerade für einen Anfänger wie dich.

    Das Gerüst ist schonmal besser als das des Fragestellers.

    Mit einem Handler würde man wohl ereignisgesteuert sowas hinbekommen. Unter WinXP sind bei mir
    zunächst ganz andere Dinge aufgerufen worden. Das lässt sich möglicherweise mit
    SetConsoleMode() noch nachbessern. Die Ereignisse zu den Funktionstasten kommen allerdings
    immer noch nicht an. Auch ReadConsole() scheint die Funktionstasten nicht zu mögen; um fertig
    zu werden habe ich nun auf getch() zurückgegriffen.

    Hier eine lauffähige Version - leider ohne Handler, aber mit Thread und Funktionstasten
    F9 und F10.

    #include <Windows.h> 
    #include <iostream> 
    #include <tchar.h>
    
    #include <stdio.h>
    #include <conio.h> 
    
    using namespace std;
    
    // Statt Tastaturpolling ;-)
    bool iskeypressed( unsigned timeout_ms = 0 )
      {
      return( WaitForSingleObject(
        GetStdHandle( STD_INPUT_HANDLE ), timeout_ms) == WAIT_OBJECT_0);
      } 
    
    DWORD WINAPI MyThread( LPVOID lpParam )
    { 
        // lpParam not used in this example
        UNREFERENCED_PARAMETER(lpParam);
    
        for( ;; )
        { 
        cout << "running" << endl;
        Sleep(100);
        }
    
        return TRUE;  // never used here
    }
    
    int _tmain() 
    { 
    HANDLE hstdin = GetStdHandle( STD_INPUT_HANDLE );
    
    // Switch Consolemode
    GetConsoleMode( hstdin, &fmodeold );
    SetConsoleMode( hstdin, fmodeold & !ENABLE_LINE_INPUT );
    
    // cin.clear();  cin.ignore(cin.rdbuf()->in_avail()); cin.get(); (http://m.c-plusplus.net/80672-full)
    FlushConsoleInputBuffer(hstdin); 
    
    // Tastaturhandler installieren
    // if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) ) 
    //     { cout << "Control Handler installed.  Try pressing Ctrl+C" << endl; }
    // else {
    //      cout << "ERROR: Could not set control handler" << endl; 
    //     return 1;
    //     }
    
    cout << "Druecken Sie eine Taste um das Programm zu starten.\n"; 
    iskeypressed();  // getch(); 
    
    DWORD ThreadID;
    HANDLE hThread = CreateThread( 
            NULL,       // default security attributes
            0,          // default stack size
            (LPTHREAD_START_ROUTINE) MyThread, 
            NULL,       // no thread function arguments
            0,          // default creation flags
            &ThreadID); // receive thread identifier
    
    union {
        struct  { unsigned char hi, low; } ch;
        unsigned short i;
    } keycode;
    
    // Handle Keyboard
    for(;;) 
    { 
        if(iskeypressed())
            {
            // TCHAR buffer[1];
            int buffer[2];
            DWORD nAnzChars;
            // BOOL result = ReadConsole(hstdin, &buffer, 1*sizeof(TCHAR), &nAnzChars, NULL);
            keycode.ch.low = _getch();
    
            if(keycode.ch.low != 0) {
                keycode.ch.hi  = 0;
            }
            else {
                keycode.ch.hi  = keycode.ch.low;
                keycode.ch.low = _getch();
            }
    
            switch(keycode.i)
            {
            case  0x4300:  {   // F9-Key
                    DWORD chk = SuspendThread( hThread );
                    break;
                    }
    
            case  0x4400:  {   // F9-Key
                    DWORD chk = ResumeThread( hThread );
                    break;
                    }
            }
        }
        else
            Sleep(100);
    }
    
    return 0;
    }
    

    Anstatt des Thread zu suspendieren könnte man ihn auch mit einem Mutex anhalten,

    siehe auch: Registering a Control Handler Function
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms685049(v=vs.85).aspx


Anmelden zum Antworten