3 Stimmen

Wie schaltet man den PC über Windows API aus?

I niemals programmiert ein winapi so habe ich ein kleines Problem hier .

Ich muss meinen PC von meiner Anwendung aus abschalten.

Ich habe dieses Beispiel gefunden Linktext Dann habe ich dieses Beispiel gefunden, wie man Privilegien ändern kann Linktext

Aber ich habe ein Problem, wie ich den Parameter HANDLE hToken // Zugriffs-Token-Handle bekomme

Ich glaube, ich muss es bei der nächsten Bestellung machen, um den Parameter zu bekommen OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges aber es gibt so viele Parameter, dass ich keine Ahnung habe, was ich mit ihnen machen soll.

Vielleicht haben Sie ein Beispiel, wie ich den HANDLE hToken Parameter bekomme, damit das funktioniert.

Übrigens habe ich bereits den folgenden Beitrag gesehen Linktext

Vielen Dank an Sie alle.

8voto

Lior Kogan Punkte 18639
// ==========================================================================
// system shutdown
// nSDType: 0 - Shutdown the system
//          1 - Shutdown the system and turn off the power (if supported)
//          2 - Shutdown the system and then restart the system
void SystemShutdown(UINT nSDType)
{
    HANDLE           hToken;
    TOKEN_PRIVILEGES tkp   ;

    ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
    ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

    tkp.PrivilegeCount          = 1                   ; // set 1 privilege
    tkp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;

    // get the shutdown privilege for this process
    ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

    switch (nSDType)
    {
        case 0: ::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE, 0); break;
        case 1: ::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0); break;
        case 2: ::ExitWindowsEx(EWX_REBOOT  |EWX_FORCE, 0); break;
    }
}

5voto

Jacob Punkte 33625

Sie könnten verwenden ShellExecute() anrufen Herunterfahren.exe

4voto

Daniel Mošmondor Punkte 19346

http://msdn.microsoft.com/en-us/library/aa376868(VS.85).aspx

Versuchen Sie

ExitWindowsEx(EWX_POWEROFF, 0);

4voto

T.E.D. Punkte 42630

Das ist ein bisschen viel für die Kommentare zu Daniels Antwort, also werde ich es hier schreiben.

Es sieht so aus, als ob Ihr Hauptproblem darin besteht, dass Ihr Prozess nicht mit den erforderlichen Rechten läuft, um einen System-Shutdown durchzuführen.

Die Dokumentationen für ExitWindowsEx diese Zeile enthalten:

Zum Herunterfahren oder Neustarten des Systems, muss der aufrufende Prozess die AdjustTokenPrivileges Funktion zu Aktivierung der SE_SHUTDOWN_NAME Privileg. Für weitere Informationen, siehe Laufen mit Besondere Privilegien .

Sie haben auch einige Beispielcode . In der Not können Sie das einfach kopieren.

0voto

#include<iostream>
using namespace std;
int main(){
system("shutdown -s -f -t 0");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X