Hey jeg er igang med at lave et program der slukker computeren... men har nogle problemer:
1. Kan ikke finde ud af at lave det sårn at man kan vægle tiden den skal slukke
2. at den viser hvor lang tid der er tilbage.
nogle der lige kan hjælpe og give mig en forklaring?
Her er koden fuldt:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
function TimedShutDown(Computer: string; Msg: string; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
ShowMessage('Cannot open process token.')
else
begin
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
if GetLastError <> ERROR_SUCCESS then
ShowMessage('Error adjusting process privileges.');
end
else
ShowMessage('Cannot find privilege value.');
end;
Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot)
end;
//Start shut down
procedure TForm1.Button1Click(Sender: TObject);
begin
if not TimedShutDown('\\\\computername', 'you have to shutdown', 30, true, true) then
ShowMessage('function failed...');
end;
//Abort shut down
procedure TForm1.Button2Click(Sender: TObject);
begin
AbortSystemShutdown('\\\\computername');
end;
Hej,
Hvis det bare er din egen maskine som du vil slukke/genstarte så skal du ikke angive noget computer navn.
Hvis du ændre parameteret Computer til PChar i stedet for String i funktionen TimedShutDown:
function TimedShutDown(Computer: PChar; Msg: string; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
Når du så vil lukke din egen computer (som programmet kører på) så skriver du:
procedure TForm1.Button1Click(Sender: TObject);
begin
TimedShutDown(nil, 'Shtting down.', 100, False, True);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
AbortSystemShutdown(nil);
end;
Alt dette fungere fint hos mig.
Her er en forklaring af funktionen:
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
Her henter vi den aktuelle process' (vores applikation) rettigheder.
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid)
Se om vi kan finde værdien for "shutdown" i de rettigheder vi lige har hentet.
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
Hvis vi fandt rettighederne, sætter vi den så vi er sikker på at vi kan få lov til at lukke/genstarte
Result := InitiateSystemShutdown(Computer, PChar(Msg), Time, Force, Reboot)
Og endelig prøver vi at lukke ned.
AbortSystemShutdown(nil);
Her stopper vi en ventende nedlukning/genstart...
Håber det hjælper dig en smule på vej.
/Michael.