Konsole stürzt bei CTRL-C ab



  • Hallo, ich möchte in mein Konsolenprogramm das beenden mit CTRL-C verhindern, doch hierbei stürzt es immer ab. Was habe ich falsch gemacht?

    #include <windows.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    BOOL WINAPI ConsoleHandler(DWORD CEvent)
    {
        switch(CEvent)
        {
    		case CTRL_C_EVENT: return( FALSE ); break;
    		case CTRL_CLOSE_EVENT: return( FALSE ); break;
        }
    	return( FALSE );    
    }
    
    int main()
    {
    	string command = "";
    
    	//Verhindert das Beenden mit STR+C
    	SetConsoleCtrlHandler(ConsoleHandler, TRUE);
    
    	do
    	{
    		cout << "Eingabe:";
    		getline(cin, command);
    
    	}while(1);
    
    return 0;
    }
    


  • // schmarrn



  • Bitte kann mir keiner helfen, will unbedingt wissen was falsch ist und was geändert werden soll.



  • Was heißt denn "hierbei stürzt es immer ab" genau?



  • Wenn ich es mit Visual Studio 2008 Express Edition kompiliere und ausführe und dann in der Konsole CTRL-C drücke dann kommt ein Fehlermeldung von VS:

    Eine Ausnahme (erste Chance) bei 0x7c875565 in handler.exe: 0x40010005: Control-C.

    Ich will das wenn man CTRL-C drückt, dass die Prompt Ausgabe wieder erscheint wie bei cmd.exe



  • kernel64 schrieb:

    Wenn ich es mit Visual Studio 2008 Express Edition kompiliere und ausführe und dann in der Konsole CTRL-C drücke dann kommt ein Fehlermeldung von VS:

    Eine Ausnahme (erste Chance) bei 0x7c875565 in handler.exe: 0x40010005: Control-C.

    Das ist kein Absturz, und hat auch nichts mit deinem Code zu tun. Du benutzt den Debugger. Der bekommt solche Ereignisse immer als Erster mit. Dieses Verhalten kannst du aber unter Debug -> Exceptions ändern.



  • Jagut aber wie kann man verhindern, dass das Konsolenfenster schließt bei CTRL-C, möchte das es dann weiterläuft.



  • kernel64 schrieb:

    Jagut aber wie kann man verhindern, dass das Konsolenfenster schließt bei CTRL-C, möchte das es dann weiterläuft.

    Na dann schau dir noch mal genau die Dokumentation zu SetConsoleCtrlHandler (bzw. HandlerRoutine) an. Wenn du das Ereignis bearbeitest und nicht willst, dass danach noch andere Handler aufgerufen werden, musst du TRUE zurückgeben.

    Außerdem solltest du nach getline cin.clear() aufrufen, um eventuelle Fehlerflags des Streams zurückzusetzen.



  • Habs nun korrigiert, gibts noch Verbesserungsvorschläge`?

    #include <windows.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    BOOL WINAPI ConsoleHandler(DWORD CEvent)
    {
        switch(CEvent)
        {
    		case CTRL_C_EVENT: return( TRUE ); break;
    		case CTRL_CLOSE_EVENT: return( FALSE ); break;
        }
    	return( FALSE );    
    }
    
    int main()
    {
    	string command = "";
    
    	//Verhindert das Beenden mit STR+C
    	SetConsoleCtrlHandler(ConsoleHandler, TRUE);
    
    	do
    	{
    		cout << "Eingabe:";
    		getline(cin, command);
    		cin.clear();
    		cout << endl;
    
    	}while(1);	
    
    return 0;
    }
    

Anmelden zum Antworten