Текущий архив: 2003.11.27;
Скачать: CL | DM;
ВнизWM_QUERYENDSESSION Найти похожие ветки
← →
Lord Warlock (2003-09-18 09:29) [0]Я видел ветки по этой теме, но их уже потерли, Поэтому повторюсь.
Проблема следующего плана. При завершении работы или сеанса Windows моя программа, висящая в трее останавливает этот процесс и не закрывается сама. Исследования показали что программа без
окна (активного или нет) не получает сообщение WM_QUERYENDSESSION, но получает сообщение WM_ENDSESSION, которое связано с предыдущим сообщением параметром WParam. Туда поступает результат отработки WM_QUERYENDSESSION. В моем случае это 0 (или False). Соответственно это останавливает процесс отключения компьютера.
И еще, в файле проекта есть такая строчка:
Application.ShowMainForm:=False;
Application.Run;
те главная форма все время работы программы невидима. Это к сожалению является необходимым условием.
Настройки и управление программой делаются с помощью всплывающего меню значка в трее.
Какие будут мнения?
← →
Alex Konshin (2003-09-18 09:53) [1]Ставь флаг в обработчике WMQueryEndSession и потом проверяй его в FormCloseQuery. Смысл флага - не задавать вопрос о завершении, если он установлен в True.
procedure TfmToolBar.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
bQuiteClose = true; // <---
Message.Result := Integer(CallTerminateProcs);
Application.Terminate;
end;
← →
Lord Warlock (2003-09-18 10:10) [2]
> Alex Konshin © (18.09.03 09:53)
Это хорошо, но как я уже писал, приложение не получает WM_QUERYENDSESSION и как следствие его обработка не производится
← →
Игорь Шевченко (2003-09-18 11:57) [3]The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.
В этом проблемы не может быть ?
← →
Lord Warlock (2003-09-18 14:12) [4]
> Игорь Шевченко © (18.09.03 11:57)
Запросто, в моем приложении похоже именно так и происходит. Причем переопределенный метод, обработывающий WM_QUERYENDSESSION не срабатывает. В приложении нет окна! Беда вот такая.. Тем не менее это должно быть решаемо, тк существует масса подобных приложений, просто висящих только в трее, и не мешающих завершаться Windows-у.
← →
Morfein (2003-09-18 14:16) [5]делай ручную выборку сообщений и оно появится..
← →
ймек (2003-09-18 15:12) [6]Удалено модератором
Примечание: Offtopic
← →
ИЛЕЙ (2003-09-18 15:17) [7]Удалено модератором
Примечание: Offtopic
← →
Игорь Шевченко (2003-09-18 16:16) [8]Странно. WM_QueryEndSession не зависит от видимости окна.
Я бы мог предложить попробовать использовать хук на текущий поток (на WH_GETMESSAGE и WH_CALLWNDPROC+WH_CALLWNDPROCRET) для выяснения ситуации, не видя кода что-то еще трудно предложить.
← →
Alex Konshin (2003-09-19 07:07) [9]Я почти на 100% уверен, что у тебя при завершении задается вопрос типа "Вы действительно хотите завершить приложение?" и проблема скорее всего именно в этом. Именно поэтому я и дал тебе совет.
Ты приведи код, в частности, как ты перехватывашь WM_QUERYENDSESSION и FormClose. Чего-то ты умалчиваешь или недопонимаешь.
Вообще-то я не совсем понимаю, почему ты не оформишь это как сервис.
← →
Lord Warlock (2003-09-19 09:15) [10]
> [8] Игорь Шевченко © (18.09.03 16:16)
Спасибо, попробую. А в коде ничего необычного нет. Исключая конечно компоненты 3-х сторон.(LMD и CH)
> [9] Alex Konshin © (19.09.03 07:07)
Ничего подобного, программа завершается или должна по крайней мере тихо мирно и незаметно. FormClose вообще не обрабатывается, WM_QUERYENDSESSION я тоже не хотел обрабатывать, в идеале это и не нужно. Но проблема остается, приложение не завершается по завершению Windows.
> Вообще-то я не совсем понимаю, почему ты не оформишь это
> как сервис.
Времени сидеть и ковыряться не хватает, а то бы написал. Да и работать оно может и под 98, какой там сервис...
← →
Alex Konshin (2003-09-19 09:22) [11]Ты не ответил, как ты перехватываешь WM_QUERYENDSESSION?
Ты посмотри чем-нибудь какие окна у тебя создаются (Winsight или Spy++ из VC). И расскажи нам где и как ты ловишь это сообщение.
← →
Lord Warlock (2003-09-19 09:34) [12]
> [11] Alex Konshin © (19.09.03 09:22)
Структура приложения такая:
в приложении 2 формы. Обе создаются как обычно.
1. Главная форма. Пустая и не показывается вообще.(Application.ShowMainForm:=False;)
2. Форма с настройками. Показвается, вызовом из меню значка в трее.
В качестве трейного значка я использую компоненту CHTrayIcon. Она лежит на форме с настройками.(вот здесь может быть косяк, так возможно она должна быть на главной форме, как думаете?)
Сообщение WM_QUERYENDSESSION посылается только окнам, я это проверял. Обработчик вставлял и в главной форме, потом переносил в форму настроек.
Проверял, выполняется он или нет с помошью динамика (писал в нем Beep). В нормальном рабочем состоянии, когда висит только значек в трее этот обработчик не выполнялся вообще. А вынести его описание за класс формы - увы..
← →
Alex Konshin (2003-09-19 14:14) [13]А ты не пробовал ловить его в Application? Мне влом по хелпам искать, но такая возможность там точно есть.
← →
Lord Warlock (2003-09-19 14:21) [14]Пробовал естественно. Очень странно, но не ловится
← →
Alex Konshin (2003-09-19 14:33) [15]Блин, до меня дошло вроде. :)
А ты еще смешнее не мог проверять приход сообщения?
Beep сводится к вызову MessageBeep. Вполне возможно, что на этом этапе это сообщение уже просто не отрабатывает и потому ты и не слышишь ничего.
Ты попробуй в файл написать.
← →
Holy (2003-09-22 12:45) [16]Если еще кого-нибудь это интересует... В оконной функции, которая о нас замаскирована в VCL(forms.pas) стоити СВОЙ ОБРАБОТЧИК wm_QueryEndSession, который говорит винде, что можно выгружать приложение. Нужно подправить буквально строчку и все заработает.
← →
Игорь Шевченко (2003-09-22 13:24) [17]Зачем что-то править в VCL, когда эти обработчики можно перекрыть в наследниках ?
← →
Lord Warlock (2003-09-23 09:27) [18]
> Игорь Шевченко © (22.09.03 13:24) [17]
Правильно, я не сторонник разбоя :)
> Alex Konshin © (19.09.03 14:14) [13]
Пробовал. Ничего хорошего. Писать - писал, но не всегда, а так же как в случае с бипом. Самое интересное - когда не обрабатывается WM_QUERYENDSESSION, в wParam сообщения WM_ENDSESSION - 0, т.е. False. Это - результат отработки WM_QUERYENDSESSION который и прерывает процесс перезагрузки.
← →
Warlock (2003-10-02 08:07) [19]Справился я с этой бедой :)
← →
Игорь Шевченко (2003-10-02 10:02) [20]Рассказал бы :)
← →
Warlock (2003-10-03 11:37) [21]В ощем получилось как писал А.П. в ветке
http://www.delphimaster.ru/cgi-bin/forum.pl?answer=1&id=1064826584
в моем случае это оказалось меню из набора Triton Tools
Вот так-то пользовать компоненты 3-х фирм :)
Страницы: 1 вся ветка
Текущий архив: 2003.11.27;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.008 c