Hola
El otro día hice el típico programa de novato para probar los distintos modos de apagar el ordenador:
Código Delphi
[-]
procedure TForm1.FormCreate(Sender: TObject);
Var TokenPriv: TTokenPrivileges;
H: DWord;
HToken: THandle;
Begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES,HToken);
LookUpPrivilegeValue(NIL, 'SeShutdownPrivilege',
TokenPriv.Privileges[0].Luid);
TokenPriv.PrivilegeCount := 1;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
H := 0;
AdjustTokenPrivileges(HToken, FALSE,
TokenPriv, 0, PTokenPrivileges(NIL)^, H);
CloseHandle(HToken);
End;
end;
...
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Gauge1.AddProgress(1); if Gauge1.Progress < Gauge1.MaxValue Then exit;
Case RadioGroup1.ItemIndex Of
0: ExitWindowsEx(EWX_LOGOFF Or EWX_FORCE, 0);
1: ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, 0);
2: ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);
3: ExitWindowsEx(EWX_POWEROFF Or EWX_FORCE, 0);
4: SetSystemPowerState(False, True);
end;
Application.Terminate;
end;
Funciona como esperaba, excepto cuando pongo la "pantalla de bienvenida" de Windows, pulsando, por ejemplo,
Win+L (observad que he puesto una cuenta atrás, de 5 segundos, para que me dé tiempo), en este caso no se apaga el PC, ni aunque se ejecute
ExitWindowsEx(EWX_POWEROFF, FORCE), se limita a cerrar la cuenta. ¿Se puede solucionar esto, es decir, poder apagar, mediante código, aunque esté puesta la "pantalla de bienvenida"?
(Como cosa curiosa, hibernar sí se puede).