Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Переход в Спящий режим (WinNT)

Delphi , ОС и Железо , Компьютер



Автор: DeMoN-777
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
Зависимости: Windows, system
Автор:       DeMoN-777, DeMoN-777@yandex.ru, ICQ:169281983, Санкт-Петербург
Copyright:   @
Дата:        21 сентября 2002 г.
***************************************************** }

procedure NTSleep;
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; // one privelege to set
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
      SetSystemPowerState(true, true);
  end;
end;

Это код-snippet на Delphi, который реализует функцию NTSleep, которая выключает систему в режиме сна на Windows NT (WinNT). Автором этого кода является DeMoN-777 и он был опубликован 21 сентября 2002 года.

Вот шаг за шагом, что код делает:

  1. Он открывает токен процесса с помощью функции OpenProcessToken с флагами TOKEN_ADJUST_PRIVILEGES или TOKEN_QUERY.
  2. Он ищет привилегию SeShutdownPrivilege с помощью функции LookupPrivilegeValue.
  3. Он устанавливает атрибут SE_ PRIVILEGE_ ENABLED для этой привилегии, указывая, что она должна быть включена.
  4. Он adjusts токен привилегий с помощью функции AdjustTokenPrivileges с ложным значением параметра DisableAllPrivileges и устанавливает новый счетчик привилегий в 1.
  5. Наконец, он вызывает функцию SetSystemPowerState с двумя булевыми значениями (true, true) для выключения системы в режиме сна.

Код требует Windows NT как операционную систему и не работает на более ранних версиях Windows. Он также требует включенной привилегии SeShutdownPrivilege, которая является системной привилегией, позволяющей приложению выключить систему.

Вот альтернативное решение в Delphi:

uses
  Windows;

procedure SleepSystem;
begin
  SystemParametersInfo(SPI_ SETSYSTEMPOWERSTATE, 0, 1, 0);
end;

Этот код использует функцию SystemParametersInfo с действием SPI_ SETSYSTEMPOWERSTATE для выключения системы в режиме сна. Этот подход проще и не требует изменения токенов привилегий.

Обратите внимание, что на современных версиях Windows (начиная с Windows Vista), функция SetSystemPowerState была отменена в пользу функции SetSuspendState, которая принимает три булевых параметра: suspend, disablewake и force stand by. Вот обновленное пример:

uses
  Windows;

procedure SleepSystem;
begin
  SetSuspendState(True, False, True);
end;

Этот код выключает систему в режиме сна с помощью функции SetSuspendState, которая более эффективна и надежна, чем оригинальная функция SetSystemPowerState.

В статье описывается процедура NTSleep для перехода в спящий режим в операционной системе Windows NT.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компьютер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-11 20:44:31/0.0059311389923096/0