Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.03 c
4-90180
Ancara
2003-10-05 15:57
2003.11.27
GetMousePos


1-89998
Saturn
2003-11-17 10:34
2003.11.27
Греческий алфавит


6-90024
Oleg_
2003-09-29 18:25
2003.11.27
Нажатия клавиш на webbroser


1-89957
ncua
2003-11-17 17:43
2003.11.27
TIMAGE как через LoadFromStream закатать Jpeg вское изображение


14-90091
vuk
2003-11-04 14:04
2003.11.27
Получите! Распишитесь!