PC Herunterfahren in einer bestimmten anzahl von Sekunden



  • Hallo ich möchte ein Programm machen wo der User selber eingeben kann nach wie viel Sekunden sein PC Heruntergefahren wird.

    #include <iostream>
    using namespace std;
    
    int start();
    
    int main()
    
    {
    start();
    getchar();
    }
    
    //---------------------------------------------------------------------------
    
        start()
        {
            string sec;
    
            cout<<"Programm zum PC Herunterfahren in einer bestimmten zeit\n";
            cout<<"\n";
    
            cout<<"Anzahl der Sekunden eingeben wann der PC herunterfahren soll: \n";
            cin>>sec;
    
            string command = "shutdown -s -t" + sec;
            system(command.c_str());
    
            return 0;
        }
    

    bis hier hin bin ich gekommen aber wenn ich jetzt z.b. eine 20 eingebe dann kommt da halt nur so ein Menü wo beschrieben wird was es noch so für Shutdown Befehle gibt.



  • müsste nach dem "-t" nicht ein leerzeichen kommen?



  • also erstmal ist das eine ganz schlechte methode 😉 aber das sei mal dahin gestellt.. versuchs mal so:

    string command = "shutdown -s -t " + sec;
    

    bei shutdown muss ein leerzeichen zwischen -t und der zeit sein. des weiteren musst du millisekunden eingeben, aber das weißt du denke ich? also 1000 für 1 sekunde.
    dann würde ich noch den parameter -f mit angeben, da sonst die programme nicht geschlossen werden und der rechner nicht runterfährt... also:

    string command = "shutdown -s -f -t " + sec;
    

    funktionierts so? kann grad nicht testen...



  • Jo funktioniert 🙂 thx

    Welche methoden wären den für so etwas besser geeignet ?



  • Evtl. eher sowas wie

    Sleep(sec * 1000);
    ExitWindowsEx(EWX_SHUTDOWN, 0);
    

    Generell gilt wie ich finde: Es macht keinen Sinn Programme zu schreiben die Programme starten (komplexe Frontends mal ausgenommen). Dafür programmieren wir doch, da können wir die benötigten Funktionen auch einfach selbst aufrufen.

    (system("pause") ist auch so ein Vertreter, der Quellcode von PAUSE.EXE hat selbst bestimmt nur drei Zeilen)



  • LordJaxom schrieb:

    Evtl. eher sowas wie

    Sleep(sec * 1000);
    ExitWindowsEx(EWX_SHUTDOWN, 0);
    

    Generell gilt wie ich finde: Es macht keinen Sinn Programme zu schreiben die Programme starten (komplexe Frontends mal ausgenommen). Dafür programmieren wir doch, da können wir die benötigten Funktionen auch einfach selbst aufrufen.

    (system("pause") ist auch so ein Vertreter, der Quellcode von PAUSE.EXE hat selbst bestimmt nur drei Zeilen)

    alles richtig.. allerdings würde ich noch

    EWX_FORCE
    

    mit angeben, da sonst, wie ich oben schon schrieb die programme etc nicht richtig beendet werden. da treten öfters probleme auf...



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ 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.



  • mhhm hab die befehle vorher noch nie gesehen 😞

    Ich hab das mal so gemacht:

    #include <iostream>
    using namespace std; 
    
    int start(); 
    
    int main() 
    
    { 
    start(); 
    getchar(); 
    } 
    
    //--------------------------------------------------------------------------- 
    
        start() 
        {
            int sec;
    
            cout<<"Programm zum PC Herunterfahren in einer bestimmten zeit\n";
            cout<<"\n"; 
    
            cout<<"Anzahl der Sekunden eingeben wann der PC herunterfahren soll: \n"; 
            cin>>sec; 
    
            Sleep(sec * 1000);
            ExitWindowsEx(EWX_SHUTDOWN, 0);
    
            return 0; 
        }
    

    Aber dann bekomme ich diese Fehlermeldungen:

    Erzeugen
    [C++ Fehler] Unit1.cpp(27): E2268 Aufruf der undefinierten Funktion 'ExitWindowsEx'
    [C++ Fehler] Unit1.cpp(27): E2451 Undefiniertes Symbol 'EWX_SHUTDOWN'



  • also ein wenig in der msdn nachsehen könntest du schonmal.. da steht eindeutig:

    Header: Declared in Winuser.h; include Windows.h.

    also:

    #include <windows.h>
    

    und dann sollte es funktionieren..



  • Das Programm staret jetzt aber wenn ich z.b. 1000 eingebe dann passier überhaupt nichts o_O

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int start(); 
    
    int main() 
    
    { 
    start();
    getchar(); 
    } 
    
    //--------------------------------------------------------------------------- 
    
        start() 
        {
            int sec;
    
            cout<<"Programm zum PC Herunterfahren in einer bestimmten zeit\n";
            cout<<"\n"; 
    
            cout<<"Anzahl der Sekunden eingeben wann der PC herunterfahren soll: \n"; 
            cin>>sec;
    
            Sleep(sec * 1000);
            ExitWindowsEx(EWX_SHUTDOWN, 0);
    
            return 0; 
        }
    


  • hast du schonmal überlegt was

    Sleep(sec * 1000);
    

    bedeutet? das heißt du musst sekunden eingeben. 🙄 bei shutdown -s -f -t x musst du millisekunden für x eingeben. sleep erwartet auch millisekunden, deswegen wird der wert, den du eingibst mit 1000 multipliziert...



  • Ich hab da jetzt mal eine 1 eingeben 1*1000 ergibt ja 1000 ^^

    Aber das funktioniert wieder nicht oder mach ich wieder was falsch -.- ?



  • och man, ich hab doch vorhin schon geschrieben, dass du EWX_FORCE mit angeben sollst. sonst fährt das prog den rechner erst runter, wenn alle programme geschlossen sind... also:

    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
    


  • Geht noch immer nicht ...........
    das einzigste was passiert das ist das dass Programm ausgeht.

    #include <windows.h>
    #include <iostream> 
    using namespace std; 
    
    int start(); 
    
    int main() 
    
    { 
    start(); 
    getchar(); 
    } 
    
    //--------------------------------------------------------------------------- 
    
        start() 
        { 
            int sec; 
    
            cout<<"Programm zum PC Herunterfahren in einer bestimmten zeit\n"; 
            cout<<"\n"; 
    
            cout<<"Anzahl der Sekunden eingeben wann der PC herunterfahren soll: \n"; 
            cin>>sec; 
    
            Sleep(sec * 1000); 
            ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
    
            return 0;
        }
    


  • Du solltest
    InitiateSystemShutdown
    verwenden!



  • Und beachte, dass Du vorher die nötigen Rechte Dir verschaffen musst!

    http://msdn2.microsoft.com/en-us/library/aa376861



  • In der MSDN steht auch warum ...

    Windows NT: To shut down or restart the system, the calling process must use theAdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, seePrivileges.

    Windows 95: ExitWindowEx does not work from a console application, as it does on Windows NT.

    Such einfach mal bei google nach ExitWindowEx da gibt es schon haufen weise fertige funktionen die das mit den Rechten usw. alles machen. Zu hause hab ich auch welche bin aber leider auf Arbeit.

    schirrmie



  • ok thx



  • Hab mal was zusammengefrickelt.. obs so funzt, weiß ich nicht...

    HANDLE hToken;
        TOKEN_PRIVILEGES tPrivs;
    
        // Token auf den aktuellen Prozess ermitteln
        OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY, &hToken);
    
        // Ermitteln der eindeutigen ID der SE_SHUTDOWN_PRIVILEGES
        LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tPrivs.Privileges[0].Luid);
    
        // Setzen des Privilegs
        tPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        tPrivs.PrivilegeCount = 1;
        AdjustTokenPrivileges(hToken, FALSE, &tPrivs, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    
        // Warten
        Sleep(sec * 1000);
    
        // Shutdown erzwingen
        ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
    



Anmelden zum Antworten