Autor |
Beitrag |
Trialer03
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 02.02.08 01:35
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:
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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Sa 02.02.08 11:15
Hallo und  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.
@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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
g1o2k4
      
Beiträge: 493
|
Verfasst: 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
      
Beiträge: 207
|
Verfasst: 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:
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?
Zuletzt bearbeitet von AHT am Mi 13.02.08 16:18, insgesamt 1-mal bearbeitet
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Mo 11.02.08 20:47
|
|
rami
      
Beiträge: 23
Win XP, Linux (K)ubuntu
Delphi 2005 Personal (, PHP, HTML, MySQL, ...)
|
Verfasst: Di 11.03.08 08:44
Ich würde einfach mit ShellExecute die Konsole mit "shutdown -s -f" aufrufen.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: 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.
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
Hauptmensch
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 09.10.08 14:49
InitiateSystemShutdown mit Timeout nutzen ... Dann kommt ein Fenster von Windows, mit dem der Nutzer vorgewarnt wird.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|