Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отличить, кто закрывает программу, юзер или винда? [D5, Win95/98, WinME, Win2k, WinXP]


lipskiy ©   (2003-04-07 01:06:00) 

Обрабатываю OnCloseQuery, чтобы не закрыли крестиком или по Alt+F4, но когда выключается винда программа должна быть выгружена, а она у меня из трея вылазит и висит - не дает винде выгрузится. Как узнать, что винда выгружается? Может сообщение какое словить? Какое?


lipskiy   (2003-04-08 20:58:00) [1]

Message.Result := Integer(CallTerminateProcs);
Вот этой строчечки мне и не хватало всего навсего!
Спасибо, Alex Konshin!


> посмотри в forms.pas и обрати внимание на TCustomForm
> проследи цепочку вызова OnCloseQuery и откроется тебе правда...

Посмотрел, ничего общего не встретил, нигде в OnCloseQuery не упоминается про WM_QUERYENDSESSION. Или я ослеп? Где?


Palladin   (2003-04-08 11:31:00) [2]


> lipskiy © (08.04.03 00:20)


ну тоесть у меня обман зрения чтоли?
посмотри в forms.pas и обрати внимание на TCustomForm
проследи цепочку вызова OnCloseQuery и откроется тебе правда...


Alex Konshin   (2003-04-08 06:09:00) [3]

Вот что у меня написано:

//--------------------------------------------------------------
procedure TfmToolBar.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not FQuietClose then
begin
case Windows.MessageBox( Handle, PChar("


Alex Konshin   (2003-04-08 04:30:00) [4]

У меня это как-то сделано... Надо дойти до дома и посмотреть.
Я помню, что там при shutdown два сообщения посылается, одно из них WM_QUERYENDSESSION, а второе очень похоже по имени. И чует мое сердце, что я обрабатывал оба. Там действительно что-то надо возвращать.
У меня приложение только в трее висит, и если юзер пытается закрыть, то оно переспращивает. Так я помню что 9x и NT+ по-разному реагировали, если не обрабатывать эти сообщения. На одной из них просто висло (показывало невидимое сообщение).


lipskiy   (2003-04-08 00:20:00) [5]

Нет, ты меня не понял. Все что ты мне написал в предпоследнем посте я как раз сам прекрасно знаю и так и делаю. И отвечаешь как раз не на вопрос, вопрос - КАК ОТЛИЧИТЬ? а не как реагировать. Проблема как раз в том, что я не знаю, КОГДА ХОЧУ, А КОГДА НЕ ХОЧУ. Я знаю только ЧТО хочу - чтобы прогу можно было закрыть только двумя способами - из моего меню "Выход" и при выгрузке винды. Эти два варианта мне и не отличить программно. Сообщение WM_QUERYENDSESSION возникает ТОЛЬКО ПРИ ВЫГРУЗКЕ СИСТЕМЫ, и при закрытии приложения его НЕ ВОЗНИКАЕТ, так что тут ты не прав - OnCLoseQuery и WM_QUERYENDSESSION это разные вещи.
WM_SYSCOMMAND посмотрел, при выгрузке системы оно не возникает. Мимо.
Так что отличить можно только по сообщению WM_QUERYENDSESSION, и этот признак верно работает, я только не знаю как ответить винде, что я закрылся и чтоб она продолжила выгрузку, пока я ей не отвечу верно - она затыкается при выгрузке, хотя приложение-то мое уже и закрылось.


Palladin   (2003-04-07 23:24:00) [6]

и заметь я тебе отвечаю на основной вопрос который ты задал в теме...


Palladin   (2003-04-07 23:09:00) [7]

мля
нафига тебе WM_QUERYENDSESSION в ручную обрабатывать?
по русски же сказал
что это тоже самое что обрабатывать у формы OnCloseQuery
а у него в параметре CanClose стоит, вот и устанавливай его в False если хочешь что бы приложение не завершалось и в True если хочешь что бы завершалось...


lipskiy   (2003-04-07 23:01:00) [8]

Спасибо, попробую.
В хелпе вот что написано:
If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.
Так что ей вернуть вместо ноля? И главное как и куда?


Palladin   (2003-04-07 22:40:00) [9]

здесь уже пошло неуправляемое веселье...
но не все так плохо...
покопай в направлении WM_SYSCOMMAND, это чудо возникает при работе пользователя с системным меню и клацканьи мышкой по кнопкам закрытия минимизирования и максимизирования...
(может и еще гдето но это не важно)
если чесно мне щаз лень в справочник лезти и писАть эксперименты, поэтому я не знаю возникает ли WM_SYSCOMMAND при закрытии приложения системой...
если всетаки не возникает то выставляешь какойнибудь глобальный флаг в true при wm_syscommand и (Message.WParam=SC_Close), а в OnCloseQuery проверяешь этот флаг, false - система, true - хьюман...


> я вот плохо с документацией работать умею

это большой порок...


lipskiy   (2003-04-07 22:01:00) [10]

Ну веселые! У каждого свои проблемы, я вот плохо с документацией работать умею - как мне найти было это сообщение, если я не знал, что оно именно так называется?

Ладно, веселье продолжается.
Сообщение обработал, прогу выгрузил, но винда на этом месте выгружаться прекращает. Надо ей ответить как-то, что у меня все в порядке и можно продоложить завершение сессии. Подскажите, как это сделать!


Palladin   (2003-04-07 18:36:00) [11]

веселые вы ребята :)

"помогите сколько будет 2+3, а то у меня все время как 4+1 получается"

"2+3 будет 5"

"Спасибо!!!"

OnCloseQuery и есть косвенная обработка WM_QUERTENDSESSION


lipskiy   (2003-04-07 18:15:00) [12]

Спасибо!!!


Skier   (2003-04-07 16:26:00) [13]

>lipskiy


> Может сообщение какое словить?


The WM_QUERYENDSESSIONmessage is sent when the user chooses to end the Windows session or when an application calls the ExitWindows function.


lipskiy   (2003-04-07 16:21:00) [14]

Ну подскажите плиииииззззз!!!! Очень нужно!


Наверх

Титульная страница Поиск, карта сайта Написать письмо