Entwickler-Ecke
Windows API - PC Herunterfahren/Neustarten
Trialer03 - Sa 02.02.08 01:35
Titel: PC Herunterfahren/Neustarten
Also erstmal ja ich weiß das es schon einige Themen mit Shutdowns gibt! Also mein eigentliches Problem ist folgendes: Ich hab ein Button eingerichtet und ich möchte wenn ich drauf klick, dass dann der PC Herunterfährt! Doch Wenn ich auf den Button klick passiert leider nichts! Könnt ihr mir mal bitte sagen was ich falsch mach?
Hier der Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Banner: TLabel; Ausschalten: TLabel; Label1: TLabel; Button1: TButton; Button2: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private
public
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin ExitWindowsEx (EWX_SHUTDOWN or EWX_POWEROFF, $FFFFFFFF); end;
procedure TForm1.Button2Click(Sender: TObject); begin ExitWindowsEx (EWX_REBOOT, $FFFFFFFF); end;
end. |
So und dann möchte ich noch ein Timer mit einbauen! Sprich ich möchte den PC nach ner bestimmten zeit Herunterfahren! Wie lös ich das Problem am besten?
Bitte erklärt es so, dass es auch ein Anfänger versteht!
Danke!!
Moderiert von
Christian S.: Delphi-Tags hinzugefügtModeriert von
Christian S.: Topic aus Delphi Tutorials verschoben am Sa 02.02.2008 um 00:39
Heiko - Sa 02.02.08 11:15
Hallo und :welcome: in der EE,
ich vermute mal, dass du XP/NT oder Vista hast. Korrekt? Denn unter diesen Versionen musst du dir erst die Rechte "erkaufen" um diese Aktion durchführen zu können. Unter Win95 etc. funktioniert deine Variante aber schon ;).
Wie du es unter XP zum laufen bekommst, findest du
hier [
http://www.delphi-library.de/viewtopic.php?t=8272].
@Timer: Den Delphi-Timer aufs Formular klatschen, die Zeit einstellen, ggf. gleich aktivieren. Dann Doppelklick auf den Timer - eine leere Prozedur erscheint, in der du deinen ShutDown-Befehl einfach einfügst.
Gruß
Heiko
Trialer03 - Sa 02.02.08 12:43
Ja genau hab Win XP! Wie gesagt ich fange erst an und habe auch schon den Thread von Tino gefunden doch weiß ich nicht was und wo ich bei mir noch ändern muss um die Rechte zu bekommen!
Das mit den Timer probier ich gleich mal aus und berichte dann obs geklappt hat!
Danke aber erstmal für deine schnelle Antwort!
BenBE - Sa 02.02.08 12:58
Dann les mal aufmerksam den Beitrag von Tino durch ... Außerdem solltest Du einmal GANZ GENAU vergleichen, was Tino anders macht als Du ... Beschreibt er sogar ...
g1o2k4 - Sa 02.02.08 13:39
wenns nur um shutdown geht hab ichs noch kürzer...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| function ExitWin(flag:word): Boolean; var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWord;
begin vi.dwOSVersionInfoSize:=SizeOf(vi); GetVersionEx(vi); if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then begin OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hToken); LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid); tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; h := 0; AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^,h); CloseHandle(hToken); result := ExitWindowsEx(flag,0); end else begin result := ExitWindowsEx(flag,0); end; end;
und dann mit: ExitWin(EWX_POWEROFF); den shutdown aufrufen. |
AHT - Sa 02.02.08 13:44
Trialer03 hat folgendes geschrieben: |
Ja genau hab Win XP! Wie gesagt ich fange erst an und habe auch schon den Thread von Tino gefunden doch weiß ich nicht was und wo ich bei mir noch ändern muss um die Rechte zu bekommen!
Das mit den Timer probier ich gleich mal aus und berichte dann obs geklappt hat!
Danke aber erstmal für deine schnelle Antwort! |
Schau mal hier, vielleicht hilft dir das bei deinem Problem:
http://www.delphi-forum.de/topic_TNT_80254.html
Bevor du ein Privileg aktivieren kannst, muss dein Token dieses Privileg erst einmal besitzen. Fehlt dir evtl. das SeShutdownPrivilege?
rami - Di 11.03.08 08:44
Ich würde einfach mit ShellExecute die Konsole mit "shutdown -s -f" aufrufen.
Delete - Di 11.03.08 10:14
rami hat folgendes geschrieben: |
Ich würde einfach mit ShellExecute die Konsole mit "shutdown -s -f" aufrufen. |
Um die Anwender wieder zu zwingen als Administratoren am Rechner zu arbeiten? Genau solche Programme sind es nämlich, die dazu führen, dass trotz Rechteverwaltung die Benutzer wieder als Administrator am Rechner arbeiten.
Timosch - Di 11.03.08 17:49
rami hat folgendes geschrieben: |
Ich würde einfach mit ShellExecute die Konsole mit "shutdown -s -f" aufrufen. |
Solche Ratschläge gibts hier immer öfter.
Man ruft keine externen Programme auf, um Dinge durchzuführen, für die es API-Befehle gibt.
Wenn ich den Benutzer nach etwas frage, starte ich ja auch nicht den Notepad, lasse ihn den Text eingeben und abspeichern und lese die Datei aus, sondern verwende TEdit, InputBox oder ReadLn.
Sonst ergeben sich folgende Probleme:
1. fördert das die Abhängigkeit von externen Dateien, die u.U. gar nicht existieren. Wenn ich in meine Eingabeaufforderung eingebe "shutdown -s -f" kommt "Der Befehl "shutdown" ist entweder falsch geschrieben oder konnte nicht gefunden werden." Warum wohl? Weil ich Windows 2000 verwende...
2. kostet es Zeit und Ressourcen, weil der Rechner einen neuen Prozess starten muss. Fällt zwar nicht sehr ins Gewicht, ist aber vollkommen grundlos.
3., wie Luckie schon sagte, zwingt es den Benutzer, als Admin zu arbeiten.
Das geht jetzt an alle, die mit diesem Vorschlag (und ähnlichen) in solchen Threads immer wieder ankommen: Lasst das! Bitte! So gewöhnt man Anfängern gleich verheerende Fehler an...
Der Vorschlag von Tino ist vollkommen ausreichend und löst die Frage von Trialer03 voll und ganz.
Hauptmensch - Mi 08.10.08 19:07
Heiko hat folgendes geschrieben : |
@Timer: Den Delphi-Timer aufs Formular klatschen, die Zeit einstellen, ggf. gleich aktivieren. Dann Doppelklick auf den Timer - eine leere Prozedur erscheint, in der du deinen ShutDown-Befehl einfach einfügst. |
Bleibt noch eine Frage:
Wie kann ich aus einen
Dienst heraus den unwissenden Menschen der gerade vor dem PC sitzt vorwarnen? Ich würde es nicht mögen, wenn ich durch eine Herunterfahr-Aktion meine ungespeicherten Daten verlöre.
BenBE - Do 09.10.08 14:49
InitiateSystemShutdown mit Timeout nutzen ... Dann kommt ein Fenster von Windows, mit dem der Nutzer vorgewarnt wird.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!