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.
-
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 mitGetKeyState(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