{ **** 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;
beginif OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, hToken) thenbegin
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 года.
Вот шаг за шагом, что код делает:
Он открывает токен процесса с помощью функции OpenProcessToken с флагами TOKEN_ADJUST_PRIVILEGES или TOKEN_QUERY.
Он ищет привилегию SeShutdownPrivilege с помощью функции LookupPrivilegeValue.
Он устанавливает атрибут SE_ PRIVILEGE_ ENABLED для этой привилегии, указывая, что она должна быть включена.
Он adjusts токен привилегий с помощью функции AdjustTokenPrivileges с ложным значением параметра DisableAllPrivileges и устанавливает новый счетчик привилегий в 1.
Наконец, он вызывает функцию SetSystemPowerState с двумя булевыми значениями (true, true) для выключения системы в режиме сна.
Код требует Windows NT как операционную систему и не работает на более ранних версиях Windows. Он также требует включенной привилегии SeShutdownPrivilege, которая является системной привилегией, позволяющей приложению выключить систему.
Этот код использует функцию SystemParametersInfo с действием SPI_ SETSYSTEMPOWERSTATE для выключения системы в режиме сна. Этот подход проще и не требует изменения токенов привилегий.
Обратите внимание, что на современных версиях Windows (начиная с Windows Vista), функция SetSystemPowerState была отменена в пользу функции SetSuspendState, которая принимает три булевых параметра: suspend, disablewake и force stand by. Вот обновленное пример:
Этот код выключает систему в режиме сна с помощью функции SetSuspendState, которая более эффективна и надежна, чем оригинальная функция SetSystemPowerState.
В статье описывается процедура NTSleep для перехода в спящий режим в операционной системе Windows NT.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS