Fórum Desligar Xp / 2000 #170784

22/07/2003

0

como fazer para desligar win 2k / XP via programção. Aproveitando o assunto, alguem sabe aonde encontro APIs do windows para usar no delphi, pode ser no póprio help do delphi mesmo. Obrigado


Kfe

Kfe

Responder

Posts

22/07/2003

Eddie

...
{ Public declarations }
function GetWinVersion: String;
procedure ShutDown;
...

function TfrmPrincipal.GetWinVersion: String;
var
VersionInfo : TOSVersionInfo;
OSName : String;
begin
// set the size of the record
VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );

if Windows.GetVersionEx( VersionInfo ) then
begin
with VersionInfo do
begin
case dwPlatformId of
VER_PLATFORM_WIN32s : OSName := ´Win32s´;
VER_PLATFORM_WIN32_WINDOWS : OSName := ´Windows 95´;
VER_PLATFORM_WIN32_NT : OSName := ´Windows NT´;
end; // case dwPlatformId
Result := OSName + ´ Version ´ + IntToStr( dwMajorVersion ) + ´.´ + IntToStr( dwMinorVersion ) +
#1310´ (Build ´ + IntToStr( dwBuildNumber ) + ´: ´ + szCSDVersion + ´)´;
end; // with VersionInfo
end // if GetVersionEx
else
Result := ´´;
end;

procedure TfrmPrincipal.ShutDown;
const
SE_SHUTDOWN_NAME = ´SeShutdownPrivilege´; // Borland forgot this declaration
var
hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
begin
if Pos( ´Windows NT´, GetWinVersion) = 1 then // we´ve got to do a whole buch of things
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, ´Exit Error´, ´OpenProcessToken() Failed´, MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, ´Exit Error´, ´OpenProcessToken() Failed´, MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)


// SE_SHUTDOWN_NAME
if not LookupPrivilegeValue( nil, ´SeShutdownPrivilege´ , tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, ´Exit Error´, ´LookupPrivilegeValue() Failed´, MB_OK );
Exit;
end; // if not LookupPrivilegeValue( nil, ´SeShutdownPrivilege´ , tkp.Privileges[0].Luid )
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
if Boolean( GetLastError() ) then
begin
MessageBox( 0, ´Exit Error´, ´AdjustTokenPrivileges() Failed´, MB_OK );
Exit;
end // if Boolean( GetLastError() )
else
ExitWindowsEx( EWX_FORCE or EWX_POWEROFF, 0 );
end // if OSVersion = ´Windows NT´
else
begin // just shut the machine down
ExitWindowsEx( EWX_FORCE or EWX_POWEROFF, 0 );
end; // else
end;

Depois disso, é só chamar a procedure ShutDown. Só um detalhe. Nessa caso, se o gabinete do micro for ATX, ele desligará mesmo. Se quiser apenas que de power off, troque o EWX_POWEROFF por EWX_SHUTDOWN.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar