|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
16.05.2008, 00:17 | #1 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
Перехват завершения работы ОС
Уважаемые! Помогите решить проблемку...
Задача состоит в следующем: Приложение перед закрытием должно освободить пямять, уничтожить создаваемые по ходу работы объекты и сохранить некоторые данные в реестре и в файле/файлах. Процедуру назвал "DoFree" Существует два источника завершения программы: 1. Пользователь. В данном случае выдаётся запрос на подтверждение закрытия. 2. Система. Не каких диалогов появлятся не должно. Удалось осуществить перехват закрытия по: "Alt+F4", крестик в окне, пункт в системном меню и пункт в контекстном меню значка программы в трее (естественно ). Проблемы: 1. Не знаю как перехватить закрытие из панели задач. хотя меню всплывает такое же как и системное... но разница какая-то есть. 2. Если завершать сессию пользователя по "пуск>выход из системы>выход" или выключить комп по "пуск>выключение>выключение/перезагрузка", то: 2.1. если не вызывать DoFree - комп нормально вырубаеться. 2.2.1. если вызывать DoFree - приложение завершаеться, но процесс завершения сессии прекращается. 2.2.2. если после DoFree вызвать функцию ExitWindowsEx с параметром EWX_FORCE происходит "ошибка чтения паямяти" и сессия завершается. (естественно перхватить место вызывающее сбой - уже без вариантов) Ниже отвечающие за все эти действия функции: procedure TForm1.DoCloseUser(); begin if (MessageBox(Handle,'Вы уверены, что хотите закрыть программу?', 'Предупреждение',MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = ID_NO) then exit; Self.OnCloseQuery := nil;// FormCloseQuery DoFree(); PostQuitMessage(0); end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := true; if (SrvFlg = [SoftClose]) then exit; DoFree(); //ExitWindowsEx(EWX_LOGOFF or EWX_FORCE,0); //ExitWindowsEx(EWX_FORCE,0); PostQuitMessage(0); end; кстати, что за флаг такой "EWX_FORCEIFHUNG"? пробовал перехватывать сообщение WM_QueryEndSession, результат такой же как в пунктах 2.2.x. неделю уже бьюсь. надоелоооо... а надо |
16.05.2008, 00:21 | #2 |
Ra-Ra ?
Форумчанин
Регистрация: 06.03.2008
Сообщений: 286
|
Наверное нубский вопрос мой будет: А разьве procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); не реаботает если закрывать форму какимбы то нибыло способом?
|
16.05.2008, 00:46 | #3 | |
Участник клуба
Регистрация: 26.10.2007
Сообщений: 1,244
|
Цитата:
Есть множество типов завершения программы... От мягких до жёстких. В случая мягких идёт обработка онКлос формы и прочих. При этом можно отменить попытку закрытия или запросить какие либо действия (сохранить фаил и т.д.). А есть жёсткие, которые не смотрят на онклос и грохают без пощады. Именно жёсткий метод использует диспечер задач. Чтоб обойти жёсткий метод указанных процедур недостаточно.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым, Попытка глубже понимать уже попахивает литром... |
|
16.05.2008, 03:36 | #4 |
Ra-Ra ?
Форумчанин
Регистрация: 06.03.2008
Сообщений: 286
|
Вопрос по теме тогда можно? Просто интересно. Что если к примеру поставить глобальный хук WM_CALLWNDPROC и при посылке сообщения о закрытии не передавать его нашей программе? Тоесть не вызывать CallNextHookEx() ? Или это както по другому делается?
|
16.05.2008, 08:27 | #5 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Читаем сдесь: http://programmersforum.ru/showthrea...UERYENDSESSION
I'm learning to live...
|
16.05.2008, 18:33 | #6 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
Да будет конечно. Но мне не это нужно. Мне нужно отлечить закрытие прги юзером от закрытия системой, выполнить необходимые операции очистки и передать управление системе (т.е. пусть себе и дальше закрывает остальные проги).
|
16.05.2008, 18:41 | #7 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
Да! И... Порядок сообщений мне известен.
1. WM_QueryEndSession 2. OnCloseQuery 3. OnClose 4. OnDestroy но. 1. OnClose не происходит при закрытии сессии. 2. OnCloseQuery происходит всегда. если б наоборот... [Чтоб обойти жёсткий метод указанных процедур недостаточно] метод то не жёсткий. вполне нормальный. я, например, нажимаю кнопку "сила" на системнике, и вперёд, всё само закрываеться. Завязано похоже всё на том, что "окна" хотят видеть главное окно проги... а она в трее в виде значка Обратил внимание, если окно развёрнуто всё работает как надо. Придётся разворачивать перед закрытием. Есть правда вероятность (и не малая), что у меня "окна" глючат... Последний раз редактировалось Stilet; 19.05.2008 в 08:58. |
19.05.2008, 08:59 | #8 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
WM_QueryEndSession обычно хватает с головой.
I'm learning to live...
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ищу художника для завершения проекта! | Kostia | Фриланс | 6 | 31.05.2013 18:42 |
Использование метода free после завершения потока | Denager | Общие вопросы Delphi | 4 | 29.08.2008 10:13 |
API перехват | Irat | Помощь студентам | 13 | 11.02.2008 12:04 |
Ждать завершения чужого процесса | ERASERROR | Win Api | 2 | 04.02.2008 08:23 |
Перехват события | juden | Общие вопросы Delphi | 5 | 23.05.2007 12:21 |