Igual no tienes permisos para ejecutar esas tareas, o tu proceso requiere permisos de administrador.
Me pasó al migrar un programa a XP.
Código Delphi
[-]
function TFrmteclas.ShutDownWindows(Flag: Word): Boolean;
var
TokenPriv: TTokenPrivileges;
H: DWord;
HToken: THandle;
begin
Flag := EWX_POWEROFF;
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;
Result := ExitWindowsEx(Flag, 0);
end;
Para apagar el monitor basta con:
Código Delphi
[-]
Application.ProcessMessages;
Sleep(150);
PostMessage(Application.Handle , WM_SYSCOMMAND, SC_MONITORPOWER,1);
Ojo al Sleep. Se puede procesar el postMessage pero por el ciclo de mensajes, se puede activar de nuevo y aparentar que no hace nada la instrucción.
Saludos