Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Evg
Эксперт CАвтор FAQ
19277 / 7134 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
#1

Как отловить ситуацию выключения компа?

03.04.2010, 21:12. Просмотров 1594. Ответов 6
Метки нет (Все метки)

Пишу программу, которая живёт в tray. В итоге нормальным действием является выключения компа без ручного закрытия программы. Но мне нужно в момент закрытия программы сделать завершающие действия. Каким образом можно сие поймать?

В linux'е в момент выключения ОС всем работающим программам шлётся сигнал SIGTERM. Наверняка под виндой тоже есть что-то подобное. И, возможно, для этого есть надстройки в борландовских классах

Добавлено через 8 минут
Да, ещё один момент. Хочется, чтобы можно было отличить ситуацию, когда сигнал (или что там будет в винде) придёт в момент выключения компа и сигнал, который придёт в случая, если прибивать программу через диспетчер задач. Логика следующая. В момент закрытия программы нужно сохранить текущий конфиг в файл. Но если программа зависла и её прибивают ручками, значит что-то в такой конфигурации пошло совсем не так и такую конфигурацию записывать не надо, дабы при последующем запуске опять не заклинило
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2010, 21:12
Ответы с готовыми решениями:

Как отловить сообщение MM_WIM_DATA?
Привет всем. Как мне узнать отправлено ли сообщение мултимедийной подсистемой...

Как отловить возникновение ошибки?
Добрый вечер. Есть программа которая принимает данные по Ethernet и...

Как отловить такое исключение?
Здравствуйте, использую try catch. Подключаюсь к файерберду и подключаюсь к БД...

Как отловить сообщение MM_WIM_DATA?
Пишу программу для работы с микрофоном. Использую функции WinAPI waveInOpen,...

Поймать ситуацию перетаскивания формы
Имеется следующая функциональность. По нажатию на кнопочку создаётся новая...

6
AntonChik
1085 / 583 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
05.04.2010, 11:41 #2
а события формы OnCloseQuery и OnClose не помогают?
или ручками ловите и обрабатывайте событие WM_QUERYENDSESSION

по поводу убийства процессса из диспетчера задач, то здесь мне кажется винда не удосуживается оповестить приложение(процесс) о своих пемерениях.
либо присоединяюсь к вопросу, т.к. самому хотелось бы узнать как перехватывать сей роковой выстрел в спину)
1
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
05.04.2010, 11:51 #3
По-моему никак, так как данная фича как раз и предназначена для немедленного завершения любой проги, независимо от того, насколько она висит и какие действия планирует выполнить. Винда не "не удосужавается", а специально не оповещает. Применительно к данной теме - не надо этого ловить, так как прога вообще не узнает и самом своём закрытии и ничего сделать вообще не сможет, а именно невыполнение вообще никаких операций и требуется.

Добавлено через 3 минуты
В остальных случаях закрытия - по событиям OnClose/OnCloseQuery, или по событиям WM_CLOSE(/WM_CLOSEQUERY (не уверен в написании)), WM_DESTROY. Если можешь сам вписать что-то в WinMain, то можно туда, после главного цикла, но перед return.
0
Evg
Эксперт CАвтор FAQ
19277 / 7134 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
05.04.2010, 11:58  [ТС] #4
Цитата Сообщение от AntonChik Посмотреть сообщение
по поводу убийства процессса из диспетчера задач, то здесь мне кажется винда не удосуживается оповестить приложение(процесс) о своих пемерениях.
либо присоединяюсь к вопросу, т.к. самому хотелось бы узнать как перехватывать сей роковой выстрел в спину)
Скажем так. Ситуация прибития из диспетчера задач мне как раз-таки и не нужна. Просто я в юниксовых теминах мыслю, а там что убить руками, что при перезагрузке - шлётся один и тот же сигнал процессу.

Цитата Сообщение от taras atavin Посмотреть сообщение
В остальных случаях закрытия - по событиям OnClose/OnCloseQuery
OnClose - это закрытия приложения ручками. При перегрузке машины этого нет.

В итоге попробую WM_QUERYENDSESSION
0
Evg
Эксперт CАвтор FAQ
19277 / 7134 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
20.03.2012, 20:59  [ТС] #5
Тут, собственно, всё просто. В обработчике события WM_QUERYENDSESSION для главного окна вызвал Close, что в дальнейшем вызывает событие OnClose главной формы, в котором у меня и происходит запись конфигов. В итоге в момент выключения компа приложение закрывается точно так же, как если бы его закрыли крестиком

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class TWindowMain : public TForm
{
    ...
    // Внутри тела класса главного окна
    void WM_QueryEndSession (TMessage &msg);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER (WM_QUERYENDSESSION, TMessage, WM_QueryEndSession)
    END_MESSAGE_MAP (TForm)
    ...
};
 
// А реализацию метода уже где удобно (можно было и внутри класса сразу же сделать,
// а не просто объявление писать)
void
TWindowMain::WM_QueryEndSession (TMessage &msg)
{
    // Реально на такое событие надо возвращать значение, чтобы система поняла,
    // что перегружаться пока нельзя. Но мы тут ничего никуда не возвращаем.
    // Судя по всему, через Dispatch событие уходит и обрабатывается
    // borland'овскими кодами. Так что тут мы просто вызываем Close, что
    // обеспечит сохранение текущего конфига
    Close();
    TForm::Dispatch(&msg);
}
1
raxp
10182 / 6565 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
20.03.2012, 22:05 #6
WM_QUERYENDSESSION

Бэкапер или… резервирование данных при выключении ПК
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
17.03.2014, 12:56 #7
Цитата Сообщение от Evg Посмотреть сообщение
OnClose - это закрытия приложения ручками. При перегрузке машины этого нет.
Вот именно.
0
17.03.2014, 12:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 12:56

Как отловить ошибку возникающую до загрузки программы?
Вот голова - WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR strParams, int) {...

Как отловить ошибку, если значение не введено?
всем доброго времени суток собственно написал программу которая сортирует либо...

Как отловить появление полос прокрутки в ScrollBox-е?
Собственно, тема и есть вопрос.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru