Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

завершение работы windows


mutabor ©   (2004-05-24 11:36:00) 

какое сообщение посылается приложению при завершении работы windows?( отловить с целью организации корректного завершения работы приложения)


Danemon   (2004-05-25 01:04:00) [1]

Это я взял с какого-то сайта.
-----------------
Как отправить машину в состояние StanBy
Вот кусок кода, который это делает. Для перехода в состояние StandBy нужно вызвать процедуру StandBy. Для «заморозки» системы – Hibernate
function AdjustTokenPrivileges(TokenHandle : THandle; DisableAllPrivileges : BOOL; NewState : PTOKENPRIVILEGES;
       BufferLength : DWORD;PreviousState : PTOKENPRIVILEGES; ReturnLength : DWORD) : BOOL;
       stdcall; external 'advapi32.dll' name 'AdjustTokenPrivileges';
function GetShutdownPriv : boolean;
var
   hToken : THandle;
   tkp, p_tkp : TTokenPrivileges;
   ReturnLength : DWORD;
   procedure error(msg : string);
   begin
     MessageBox(0, @msg[1], 'Error', MB_ICONERROR or MB_OK);
   end;
begin
 // Get a token for this process.
 if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin
     error('OpenProcessToken');
     Result := false;
     exit;
 end;
 // Get the LUID for the shutdown privilege.
 LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
 tkp.PrivilegeCount := 1;  // one privilege to set
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 // Get the shutdown privilege for this process.
 AdjustTokenPrivileges(hToken, FALSE, @tkp, 0, nil, ReturnLength);
 // Cannot test the return value of AdjustTokenPrivileges.
 if (GetLastError <> ERROR_SUCCESS) then begin
    error('AdjustTokenPrivileges');
    Result := false;
    exit;
 end;
 Result := true;
end;
//отправляет машину в режим ожидания
procedure StandBy;
begin
   if GetShutdownPriv then
       SetSystemPowerState(TRUE, FALSE);
end;
//отправляет машину в режим Hibernation (все содержимое памяти сливается на диск)
procedure Hibernate;
begin
   if GetShutdownPriv then
       SetSystemPowerState(FALSE, FALSE);
end;


Danemon   (2004-05-25 01:02:00) [2]

А есть ли способ отключать компоненты ПК? То бишь монитор, винчестер по-отдельности и по желанию?


Sur   (2004-05-24 21:24:00) [3]

Windows посылает сообщение WM_QUERYENDSESSIONвсем приложениям и ожидает ответ.
Каждое приложение получает сообщение и возвращает одну из величин: не равную нулю - приложение готово завершить свою работу, 0 - приложение не может завершить свою работу.
Если одно из приложений возвращает 0, Windows не завершает свою работу, а снова рассылает всем окнам сообщение, на этот раз WM_ENDSESSION.
Каждое приложение должно снова подтвердить свою готовность завершить работу, поэтому операционная система ожидает ответа TRUE, резонно предполагая, что оставшиеся приложения с момента предыдущего сообщения закрыли свои сессии и готовы завершить работу.


WebErr   (2004-05-24 17:51:00) [4]

Удалено модератором
Примечание: Offtopic


Anatoly Podgoretsky   (2004-05-24 11:38:00) [5]

WM_ENDSESSION


Наверх

Титульная страница Поиск, карта сайта Написать письмо