![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
завершение работы 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