Autor Beitrag
Trialer03
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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:

ausblenden volle Höhe 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
{ Private-Deklarationen }
public
{ Public-Deklarationen }
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 user profile iconChristian S.: Delphi-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Delphi Tutorials verschoben am Sa 02.02.2008 um 00:39
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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.

@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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 02.02.08 13:39 
wenns nur um shutdown geht hab ichs noch kürzer...

ausblenden 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 // Windows NT 
  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 // Windows 95 
  begin 
    result := ExitWindowsEx(flag,0); 
  end
end;


und dann mit:
ExitWin(EWX_POWEROFF);
den shutdown aufrufen.
AHT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: Sa 02.02.08 13:44 
user profile iconTrialer03 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Mo 11.02.08 20:47 
rami
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Win XP, Linux (K)ubuntu
Delphi 2005 Personal (, PHP, HTML, MySQL, ...)
BeitragVerfasst: 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



BeitragVerfasst: Di 11.03.08 10:14 
user profile iconrami 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Di 11.03.08 17:49 
user profile iconrami 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



BeitragVerfasst: Mi 08.10.08 19:07 
user profile iconHeiko hat folgendes geschrieben Zum zitierten Posting springen:
@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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.