Title: How do I manipulate the computer (shutdown, restart, etc)?
It can be occasionally useful to do different things to the system within your program that can be done via the log off menu or otherwise. They include: Shutdown, Restart, Log off, Standby, Hibernate, and Power Off. These things will be described below:
System Privileges
Many of these things require the setting of SeShutdownPrivilege. For what I do, I ended up borrowing the code that you will find at Torry's Delphi Pages. Any code samples which require it will have the NTSetPrivilege function call that is found on that page.
Shutdown
All these functions involve variations of two system calls. This will start the first group. Shutting down the system involves a call to ExitWindowsEx. Delphi will have this procedure defined within the Windows unit, so all that is needed is to call the function. The first parm is an action, the second one is reserved and can always be 0.
To shutdown the system:
CODE
procedure machine_shutdown;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
NTSetPrivilege(SE_SHUTDOWN_NAME, True);
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0);
end;
the first parm value is obvious, the second is not. In the Win32 help dll, the following is said about EWX_FORCE:
Quote:
Forces processes to terminate. Instead of bringing up the "application not responding" dialog box for the user, this value forces an application to terminate if it does not respond.
Restart
This code restarts a computer:
CODE
procedure machine_restart;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
NTSetPrivilege(SE_SHUTDOWN_NAME, True);
ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);
end;
Logoff
This code logs off the current user:
CODE
procedure machine_logoff;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
NTSetPrivilege(SE_SHUTDOWN_NAME, True);
ExitWindowsEx(EWX_LOGOFF or EWX_FORCE, 0);
end;
Power Off
This code powers down the system. This is distinguished from the shut down command in that it will power off the system, while the shut down command will just put the computer to a point where it can be turned off.
CODE
procedure machine_poweroff;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
if IsPwrShutdownAllowed then
begin
NTSetPrivilege(SE_SHUTDOWN_NAME, True);
ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
end
else
MessageDlg('Soft Power Off not supported on this system.', mtWarning, [mbOK], 0);
end;
IsPwrShutdownAllowed is described later.
Lock the Workstation
To lock the workstation, requiring the password if set is:
CODE
function LockWorkStation: boolean; stdcall; external 'user32.dll' name 'LockWorkStation';
procedure machine_lock;
begin
if not LockWorkStation then
MessageDlg('System not locked successfully.', mtWarning, [mbOK], 0);
end;
Standby
This group starts the actions involving the other system function. I notice it is not defined in Delphi 3 (and perhaps not future Delphis), so I will show the definitions below for all the functions of interest:
CODE
function SetSuspendState(hibernate, forcecritical, disablewakeevent: boolean): boolean; stdcall; external 'powrprof.dll' name 'SetSuspendState';
function IsHibernateAllowed: boolean; stdcall; external 'powrprof.dll' name 'IsPwrHibernateAllowed';
function IsPwrSuspendAllowed: Boolean; stdcall; external 'powrprof.dll' name 'IsPwrSuspendAllowed';
function IsPwrShutdownAllowed: Boolean; stdcall; external 'powrprof.dll' name 'IsPwrShutdownAllowed';
The function names are quite obvious as to their functionality. To look at SetSuspendState, I will quote from the SDK regarding the parms:
Quote:
Hibernate
If this parameter is TRUE, the system hibernates. If the parameter is FALSE, the system is suspended.
ForceCritical
If this parameter is TRUE, the system suspends operation immediately; if it is FALSE, the system broadcasts a PBT_APMQUERYSUSPEND event to each application to request permission to suspend operation.
DisableWakeEvent
If this parameter is TRUE, the system disables all wake events. If the parameter is FALSE, any system wake events remain enabled.
To put the system into standby mode, do this:
CODE
procedure machine_standby;
begin
if IsPwrSuspendAllowed then
SetSuspendState(false, false, false)
else
MessageDlg('System Standby not supported on this system.', mtWarning, [mbOK], 0);
end;
Hibernate
To put the system into hibernate, do this:
CODE
procedure machine_hibernate;
begin
if IsHibernateAllowed then
SetSuspendState(true, false, false)
else
MessageDlg('System Hibernate not supported on this system.', mtWarning, [mbOK], 0);
end;