Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
14-90098
Romkin
2003-11-06 11:13
2003.11.27
Что-то мне это напоминает...


3-89750
buka
2003-11-10 14:08
2003.11.27
Перенос HTM в таблицу


1-89960
Ben
2003-11-17 17:51
2003.11.27
Есть ли у объекта определённое свойство?


3-89685
St@syan
2003-11-06 11:55
2003.11.27
Как сделать


3-89743
Sherbacov
2003-11-07 23:59
2003.11.27
Вопрос по ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский