Как отловить момент завершения работы Windows

 

Уважаемые господа, может кто-нибудь помочь по такому вопросу от новичка:

Как известно, при выключении компьютера (как вручную, так и при разрядке батареи у ноутбука или UPS) система закрывает все приложения, которые закрываются сами, и ждёт завершения тех, которые не закрываются, при этом в Windows 7 появляется специальное предупреждение. Поскольку терминал относится к первой группе, при этом все эксперты также прекращают работу. Можно ли как-то отсрочить момент закрытия терминала, хотя бы на 5 сек, чтобы успеть сохранить данные и подправить уровни SL и TP? (Такие ситуации бывают нечасто, но бывают, и могут доставить кучу неприятностей). Поиск по форуму результатов не дал

 

Ну должна сработать Deinit у эксперта... в нем можно заюзать Windows API и узнать есть ли завершение работы системы и далее будет три секунды на все операции.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa376881%28v=vs.85%29.aspx

 

В деините уже поздно будет.

Может написать DLL, где создать невидимое окно и перехватывать сообщение (WM_QUERYENDSESSION) ему на завершение работы ОС?

 
Zhunko:
Может написать DLL, где создать невидимое окно и перехватывать сообщение (WM_QUERYENDSESSION) ему на завершение работы ОС?

Я так думаю, что это сообщение в первую очередь придёт основному процессу (т.е. самому терминалу), и он не раздумывая ответит True :)

Мы, конечно, тоже можем объявить функцию WindowProc(), но до нас это сообщение дойти не успеет. Хотя, наверное, можно установить Hook на обработчик событий терминала или что-то в этом роде (к сожалению, не разбираюсь настолько в WinApi) - тогда у нас, как написано здесь, будет целых 5 секунд до выдачи запроса пользователю или принудительного завершения.

Если вписать весь код в процедуру deinit(), то будет выделено всего 2.5 секунды (как показывает практика, ModifyOrder и CloseOrder может обрабатываться и дольше). В принципе, можно ещё и отправить сообщение на мобильный терминал (SendNotification). Если эти оповещения идут через сервер MetaQuotes, а не брокера, то успеть можно :) Короче, надо пробовать.

 
Awwl:

1. Я так думаю, что это сообщение в первую очередь придёт основному процессу (т.е. самому терминалу), и он не раздумывая ответит True :)

2. Мы, конечно, тоже можем объявить функцию WindowProc(), но до нас это сообщение дойти не успеет. Хотя, наверное, можно установить Hook на обработчик событий терминала или что-то в этом роде (к сожалению, не разбираюсь настолько в WinApi) - тогда у нас, как написано здесь, будет целых 5 секунд до выдачи запроса пользователю или принудительного завершения.

3. Если вписать весь код в процедуру deinit(), то будет выделено всего 2.5 секунды (как показывает практика, ModifyOrder и CloseOrder может обрабатываться и дольше). В принципе, можно ещё и отправить сообщение на мобильный терминал (SendNotification). Если эти оповещения идут через сервер MetaQuotes, а не брокера, то успеть можно :) Короче, надо пробовать.

1. При чём тут основной процесс? Сообщение придёт в оконную процедуру. Никто не мешает создать окно верхнего уровня с родителем "Рабочий стол".

2. См. пункт 1. МТ и хуки с сабклассингом не совместимы. Давно всё запретили.

3. В деините будет потеря времени. Он срабатывает после получения сообщения.

По хорошему, надо перехватить это сообщение и не пускать его дальше пока всё сам не завершишь.

Причина обращения: