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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
14-35022
sasha
2003-05-27 12:40
2003.06.12
интернет


4-35106
Vitaliy
2003-04-14 05:39
2003.06.12
Работа с реестром


1-34880
blackgrin
2003-05-31 19:34
2003.06.12
Путь запуска программы


3-34717
BBCHa
2003-05-23 13:54
2003.06.12
Тип uniqueidentifie в MSSQL 2000


1-34871
АЛЕКС
2003-05-31 12:30
2003.06.12
МЕНЮ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский