Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2008, 00:17   #1
vynt
Пользователь
 
Регистрация: 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.
неделю уже бьюсь. надоелоооо... а надо
vynt вне форума Ответить с цитированием
Старый 16.05.2008, 00:21   #2
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Наверное нубский вопрос мой будет: А разьве procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); не реаботает если закрывать форму какимбы то нибыло способом?
Zeraim вне форума Ответить с цитированием
Старый 16.05.2008, 00:46   #3
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Цитата:
кстати, что за флаг такой "EWX_FORCEIFHUNG"?
это флаг принудительного выполнение при зависании. Вроде бы имеет значение &H12&.. или чтото такое.

Есть множество типов завершения программы... От мягких до жёстких.
В случая мягких идёт обработка онКлос формы и прочих. При этом можно отменить попытку закрытия или запросить какие либо действия (сохранить фаил и т.д.).

А есть жёсткие, которые не смотрят на онклос и грохают без пощады.
Именно жёсткий метод использует диспечер задач.

Чтоб обойти жёсткий метод указанных процедур недостаточно.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 16.05.2008, 03:36   #4
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Вопрос по теме тогда можно? Просто интересно. Что если к примеру поставить глобальный хук WM_CALLWNDPROC и при посылке сообщения о закрытии не передавать его нашей программе? Тоесть не вызывать CallNextHookEx() ? Или это както по другому делается?
Zeraim вне форума Ответить с цитированием
Старый 16.05.2008, 08:27   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Читаем сдесь: http://programmersforum.ru/showthrea...UERYENDSESSION
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.05.2008, 18:33   #6
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Zeraim Посмотреть сообщение
Наверное нубский вопрос мой будет: А разьве procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); не реаботает если закрывать форму какимбы то нибыло способом?
Да будет конечно. Но мне не это нужно. Мне нужно отлечить закрытие прги юзером от закрытия системой, выполнить необходимые операции очистки и передать управление системе (т.е. пусть себе и дальше закрывает остальные проги).
vynt вне форума Ответить с цитированием
Старый 16.05.2008, 18:41   #7
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
По умолчанию

Да! И... Порядок сообщений мне известен.
1. WM_QueryEndSession
2. OnCloseQuery
3. OnClose
4. OnDestroy

но.
1. OnClose не происходит при закрытии сессии.
2. OnCloseQuery происходит всегда.
если б наоборот...

[Чтоб обойти жёсткий метод указанных процедур недостаточно]

метод то не жёсткий. вполне нормальный. я, например, нажимаю кнопку "сила" на системнике, и вперёд, всё само закрываеться.

Завязано похоже всё на том, что "окна" хотят видеть главное окно проги... а она в трее в виде значка
Обратил внимание, если окно развёрнуто всё работает как надо. Придётся разворачивать перед закрытием.
Есть правда вероятность (и не малая), что у меня "окна" глючат...

Последний раз редактировалось Stilet; 19.05.2008 в 08:58.
vynt вне форума Ответить с цитированием
Старый 19.05.2008, 08:59   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

WM_QueryEndSession обычно хватает с головой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу художника для завершения проекта! 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