Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.12;
Скачать: CL | DM;

Вниз

Как отличить, кто закрывает программу, юзер или винда?   Найти похожие ветки 

 
lipskiy ©   (2003-04-07 01:06) [0]

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


 
lipskiy ©   (2003-04-07 16:21) [1]

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


 
Skier ©   (2003-04-07 16:26) [2]

>lipskiy


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


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


 
lipskiy ©   (2003-04-07 18:15) [3]

Спасибо!!!


 
Palladin ©   (2003-04-07 18:36) [4]

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

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

"2+3 будет 5"

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

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


 
lipskiy ©   (2003-04-07 22:01) [5]

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

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


 
Palladin ©   (2003-04-07 22:40) [6]

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


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

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


 
lipskiy ©   (2003-04-07 23:01) [7]

Спасибо, попробую.
В хелпе вот что написано:
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 23:09) [8]

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


 
Palladin ©   (2003-04-07 23:24) [9]

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


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

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


 
Alex Konshin ©   (2003-04-08 04:30) [11]

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


 
Alex Konshin ©   (2003-04-08 06:09) [12]

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

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


 
Palladin ©   (2003-04-08 11:31) [13]


> lipskiy © (08.04.03 00:20)


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


 
lipskiy ©   (2003-04-08 20:58) [14]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.06.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
14-35052
_0$a_
2003-05-24 00:13
2003.06.12
Народ помогите Как найти Обратную матрицу


1-34860
dany
2003-05-30 23:41
2003.06.12
StringGrid


14-35024
race1
2003-05-24 09:06
2003.06.12
amd die


1-34776
Uran
2003-06-02 11:39
2003.06.12
Работа с файлом.


3-34763
atmospheric
2003-05-25 15:20
2003.06.12
ADO