![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение работы Windows [D7, WinXP]
Интересующийся © (2007-03-09 08:52:00)Всем доброе время суток!
Подскажите как отловить завершение работы ОС из моей проги или попытку пользователя снять прогу нестандартным способом?
SLoW.AlfaMoon.Com (2007-03-22 17:47:00) [1]При терминации посредством ZwShutdownSystem не поможет ничего.
DC-AC (2007-03-14 16:10:00) [2]19: У APC можно поймать сигнал "Low Battery". Как это сделать - смотря какой APC и смотря по какому интерфейсу (Simple Signaling, Smart Signaling) работает. Подробнее - можешь написать мне на почту.
Сергей М. (2007-03-12 09:35:00) [3]procedure TMyMainForm.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_ WM_POWERBROADCAST then
ShowMessage('Ура ! Поймал !');
inherited WndProc(Message);
end;
Интересующийся (2007-03-09 17:10:00) [4]А что туда писать нужно?
Сергей М. (2007-03-09 16:31:00) [5]
> Интересующийся (09.03.07 16:01) [25]
> Думается мне, что WndProc() совсем сдесть непричем
да неужели ?!
Интересующийся (2007-03-09 16:01:00) [6]> Сергей М. © (09.03.07 15:47) [24]
Да нет, а надо?
Думается мне, что WndProc() совсем сдесть непричем, да и в инфе которую я видел ничего про WndProc нет.
http://ww.delphimaster.ru/cgi-bin/forum.pl?id=1157936129&n=10
Сергей М. (2007-03-09 15:47:00) [7]А WndProc() слабо перекрыть ?
Интересующийся (2007-03-09 15:42:00) [8]Мой код, который неработает:
Protected
Procedure WMPOWERBROADCAST(var Message:TMessage); message WM_POWERBROADCAST;
............
Procedure TForm1.WMPOWERBROADCAST(var Message:TMessage);
Begin
inherited;
//Мой код
End;
Сергей М. (2007-03-09 15:17:00) [9]Можно.
http://www.google.ru/search?q=DELPHI+WM_POWERBROADCAST&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a
Интересующийся (2007-03-09 15:16:00) [10]> Сергей М. © (09.03.07 14:09) [20]
>GUI-приложения, заинтересованные в отслеживании состояния подсистемы >электропитания, должны обрабатывать сообщения WM_POWERBROADCAST.
пример работы с WM_POWERBROADCAST можно?
Сергей М. (2007-03-09 14:09:00) [11]
> кажется этого времени хватит для всей обработки завершения
> работы проги
Мало ли что тебе кажется)
> хотелось бы получить сигнал от ARC
Какой сигнал-то ? На завершение работы ОС что ли ? UPS не дает таких сигналов, ей абсолютно фиолетово, что будет делать ОС при том или ином состоянии оборудования бесперебойного питания. UPS лишь извещает ОС об изменениях своего состояния спецсигналами, а уж ОС сама принимает решение, выполнять ли ей шатдаун и просто извещать приложения об изменениях в UPS.
GUI-приложения, заинтересованные в отслеживании состояния подсистемы электропитания, должны обрабатывать сообщения WM_POWERBROADCAST.
Интересующийся (2007-03-09 13:57:00) [12]> Сергей М. © (09.03.07 13:30) [18]
ARC держит комп 5-15 минут, кажется этого времени хватит для всей обработки завершения работы проги.
В идеале хотелось бы получить сигнал от ARC, а не от ОС.
Сергей М. (2007-03-09 13:30:00) [13]
> Интересующийся (09.03.07 13:16) [17]
Вот именно.
И теперь предствь себе - твоя "прога", получив WM_QUERYENDSESSION, обязана максимально быстро обработать событие и вернуть TRUE ("я готова к завершению") или FALSE ("я неготова к завершению").
Система, не получив твоего согласия, вынуждена, в зависимости от условий инициации шатдауна, либо отказаться от шатдауна (а батарейка-то в UPS почти разряжена, на носу - мгновенное вынужденное обесточивание компа !) либо принудительно снять твой процесс с выполнения (действия ОС в этой ситуации вполне адекватны - принудительно снять "капризную прогу" с выполнения)
Твои действия ?
Интересующийся (2007-03-09 13:16:00) [14]Насколько я понял из описания обработка WM_QUERYENDSESSION может выполнять небольшие по продолжительности веши.
S@shka (2007-03-09 12:35:00) [15]
> А если батарея в UPS находится на последнем издыхании
Пусть терпит!
Сергей М. (2007-03-09 11:54:00) [16]
> Как в обработке WM_QUERYENDSESSION вернуть 0, объяснив системе
> что прога еще неготова к завершению?
Что значит "не готова" ? А если батарея в UPS находится на последнем издыхании ?
Интересующийся (2007-03-09 11:43:00) [17]Вместе с WM_ENDSESSION можно использовать WM_QUERYENDSESSION которая передается программе перед завершение работы или сменой пользователя.
Дополнительный вопрос:
Как в обработке WM_QUERYENDSESSION вернуть 0, объяснив системе что прога еще неготова к завершению?
Интересующийся (2007-03-09 11:34:00) [18]>Интересующийся (09.03.07 11:04) [10]
>К примеру если выгрузили по требованию юзера, скорей всего все задания на этот момент были выполнены.
Мало какой юзер будет вырубать прогу при незавершенной задаче, хотя и такое возможно.
Хотя даже в таком случае юзер завершит прогу стандартными способами (Ctrl+Alt+Del к ним не относятся)... :)
Сергей М. (2007-03-09 11:18:00) [19]
> К примеру если выгрузили по требованию юзира
А если юзер (а не UPS) инициировал завершение работы ОС ?
Интересующийся (2007-03-09 11:06:00) [20]> if Message.WParam=1 then Close;//Вырубаем прогу
Взято из примера, но как я понимаю можно поставить свою обработку