FAQ VCL
Железо\Компьютер

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как переключить компьютер в ждущий режим в Win98?

// SetSystemPowerState( fSuspend: LongBool; fForce: LongBool );
// fSuspend: true - в спячку, false - назад
// fForce: если true - беспрепятственно переходим в спящий режим,
//         если false - любая из работабщих программ может отказать в этом
SetSystemPowerState( true, true );


Как переключить компьютер в ждущий режим в WinNT?

procedure NTWait;
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
   if OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
                        TOKEN_QUERY, hToken ) then
   begin
      LookupPrivilegeValue( nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid );
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges( hToken, False, tkp, 0, nil, ReturnLength ) then
         SetSystemPowerState( true, true );
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   NTWait;
end;


Как программно выключить компьютер в Win98?

procedure TForm1.Button1Click(Sender: TObject);
begin
   if not ExitWindowsEx( EWX_FORCE or EWX_POWEROFF or EWX_SHUTDOWN, 0 ) then
      MessageBox( 0, 'Получен отказ в завершении', 'Win32', MB_OK );
end;


Как заблокировать рабочую станцию под управлением Win2000 и выше?

function LockWS: Boolean;
type
  TLockWorkStation = function: Boolean;
var
  hUser32: HMODULE;
  LockWorkStation: TLockWorkStation;
begin
   hUser32 := GetModuleHandle( 'USER32.DLL' );
   if hUser32 <> 0 then
   begin
      @LockWorkStation := GetProcAddress( hUser32, 'LockWorkStation' );
      if @LockWorkStation <> nil then
      begin
         LockWorkStation;
         Result := true;
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   LockWS;
end;


Как выключить компьютер под управлением Win2000 и выше?

procedure ShutdownComputer;
var
  ph: THandle;
  tp, prevst: TTokenPrivileges;
  rl: DWORD;
begin
   OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ph );
   LookupPrivilegeValue( nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid );
   tp.PrivilegeCount := 1;
   tp.Privileges[0].Attributes := 2;
   AdjustTokenPrivileges( ph, FALSE, tp, SizeOf( prevst ), prevst, rl );
   ExitWindowsEx( EWX_SHUTDOWN or EWX_POWEROFF, 0 );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShutdownComputer;
end;


Как запретить компьютеру под управлением Win2000 и выше переходить в спящий режим?

// ES_SYSTEM_REQUIRED - не дает системе перейти в спящий режим.
// ES_DISPLAY_REQUIRED - отвечает за активность дисплея:
//   1. блокировка запуска скринсейвера
//   2. подавление таймера отключения монитора при бездействии,
//      если в нем есть такая функция.
// ES_AWAYMODE_REQUIRED - в основном используется мультимедийными
//   приложениями для выполнения своих фоновых задач.
// ES_CONTINUOUS - фиксирует состояние активности системы до следующего
//   вызова функции с этим флагом и комбинацией других флагов.

// Если приложение должно оставаться активным только на время продолжительного
// выполнения какого-нибудь критического участка кода, то перед его началом надо
// зафиксировать состояние запрета перехода системы в спящий режим, а после
// окончания этот запрет снять.
procedure TForm1.Button1Click(Sender: TObject);
begin
   // Установить состояние постоянной активности системы и монитора
   SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED);

   // Тут выполняется какой-то очень важный процесс, который нельзя прерывать

   // Сбросить состояние постоянной активности
   SetThreadExecutionState(ES_CONTINUOUS);
end;

// Если требуется держать систему в активном состоянии на протяжении всего времени
// работы приложения или в какие-то определенные моменты, то можно запускать функцию
// SetThreadExecutionState без флага ES_CONTINUOUS. В этом случае при каждом вызове
// она будет просто обнулять таймер бездействия. При таком варианте использования
// функцию придется запускать с нужной периодичностью, например, по таймеру.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   // Передать системе состояние активности
   SetThreadExecutionState(ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED);
end;

При использовании материала - ссылка на сайт обязательна