Форум: "Система";
Текущий архив: 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