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