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

Вниз

Завершение Windows   Найти похожие ветки 

 
Brand   (2002-03-10 00:46) [0]

Научите пожалуйста отлавливать завершение работы Windows.
Чтобы моя прога при завершении завершила работу и дала Windows спокойно завершиться.
Если можно, отрывок программы.


 
Neolord   (2002-03-10 03:52) [1]

uses shellapi;

shellexecute(handle,{или че-то вроде},"open,"rundll32.exe","shell32.dll,SHExitWindowsEx, 2"
{0-exituser;1-exitwindows,2-reboot},0);


а ты не знаешь как убрать паузу перед началом повтора символа при onformkeydown?


 
Brand   (2002-03-11 14:54) [2]

Сначала не хватало параметра. По хелпу не хватало lpDirectory.
Написал что попало.
При запуске глюк, типа SHExitWindowsEx отсутствует в shell32.dll


 
Виктор Щербаков   (2002-03-11 15:01) [3]

Отлавливай сообщение WM_QUERYENDSESSION.


 
Brand   (2002-03-11 22:43) [4]

Некоторые подробности.
Под 98 винду все Ок. Не пашет под ХР. Винда не перезагружается (выключается до тех пор, пока я не выгружу свою прогу из SysTray.


 
Tosov   (2002-03-12 00:39) [5]

Ну так см. Виктор Щербаков © (11.03.02 15:01) и удаляй "прогу из SysTray". Посмотри в хелпе про Message methods


 
Song   (2002-03-12 09:00) [6]

У меня всё пашет и при перезагрузке винда сама корректно завершает программу.
Ловлю WM_ENDSESSION и при wParam=1 делаю MainForm.Close


 
Vogul   (2002-03-12 10:20) [7]

При завершении работы система посылает всем приложениям
сообщение WM_QUERYENDSESSION, если хотя бы одно из приложений при обработке этого сообщения возвратит FALSE, то процесс завершения прервется. Если возвратит TRUE, то посылается сообщение WM_ENDSESSION, тут уж, если его обрабатываешь, хочешь не хочешь - не задерживая - return zero, иначе будет - приложение не отвечает: завершить сейчас, подождать.
Еще надо учесть, что вся эта схема по разному работает в NT и 95.


 
AAZ   (2002-03-12 10:45) [8]

Все фигня !!!

НИ НАДО ОТЛАВЛИВАТЬ НИКАКИХ СООБЩЕНИЕ !!!!!!!!!
У ФОРМЫ ЕСТЬ СОБЫТИЕ КОТОРОЕ ВОЗНИКАЕТ КАК РАЗ НА ТАКОЕ СООБЩЕНИЕ НАЗЫВАЕТСЯ - OnCloseQuery И ВСЕ, БОЛЬШЕ НИЧЕГО НЕ НУЖНО !!!!!!

ПОВЕСИТЬ НА ЭТО СОБЫТИЕ КАКОЙ-НИБУДЬ ОБРАБОТЧИК ТИПА "СОХРАНИТЬ ФАЙЛ ?" И НИКАКИХ ПРОБЛЕМ НЕ БУДЕТ.


 
Song   (2002-03-12 11:44) [9]


> Vogul (12.03.02 10:20)
> При завершении работы система посылает всем приложениям
> сообщение WM_QUERYENDSESSION, если хотя бы одно из приложений
> при обработке этого сообщения возвратит FALSE, то процесс
> завершения прервется. Если возвратит TRUE, то посылается
> сообщение WM_ENDSESSION, тут уж, если его обрабатываешь,
> хочешь не хочешь - не задерживая - return zero, иначе будет
> - приложение не отвечает: завершить сейчас, подождать.
> Еще надо учесть, что вся эта схема по разному работает в
> NT и 95.


Никаких она мне окон "Программа не отвечает" никогда не выдавала и не выдаёт и причём ещё скажу, что иногда событие onClose у меня выполняется довольно долго (минуты 2-3) и никаких ошибок!!! Просто терпеливо ждёт пока программа, будь она активна, будь она в трее, завершит те действия, которые описаны у неё в обработчике onClose. Процедуру обработчика просто вызываю при отловливании события.

2AAZ
Уууу!!! Какой ты умный тут выискался. Один ты умный, а остальные, говоря про WM_ENDSESSION и WM_QUERYENDSESSION фигню вещают? А ничего, что этот вопрос задают через каждые два дня, и все люди отвечают на него нормально и надо же пришёл тут один и закричал, что, да всё совсем не так, вы всё не так делаете. Ты хоть пробовал со своим onCloseQuery? Нет? Ну вот тогда и не говори ерунду. Написал бы я тебе, да модератор удалит.


 
Alibaba   (2002-03-12 12:05) [10]

Народ, У меня таже проблема!!!
Пишу :

type
TfrmMain = class(TForm)
...
private
procedure OK(var message: TMessage); message WM_QUERYENDSESSION;
end;

procedure TfrmMain.OK(var message: TMessage);
begin
MessageDlg("WM_QUERYENDSESSION", mtInformation, [mbOk], 0);
message.LParam:=ENDSESSION_LOGOFF;
frmMain.Close;
end;

Делаю ShutDown - почесному вываливается MessageDlg, я говорю ОК.... и тут начинается такое... вываливается куча окошек с сообщением Acsess violation!

Что делать, подскажите, плиз!


 
Alibaba   (2002-03-12 12:15) [11]

2Song
Вот я отловил это сообщение, а подскажи, плиз, как мне теперь вернуть True Windows-у ведь система ждет от моей програмы True или False.


 
Song   (2002-03-12 12:55) [12]

2Alibaba
Я говорил про WM_ENDSESSION. Здесь возвращать ничего не надо, здесь надо сделать, то что тебе нужно, чтобы программа делала при завершении работы в виндах.

А если ты про WM_QUERYENDSESSION, то вот:

--- отрывок из help"а -------------

If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

-----------------------------------

Стало быть тебе нужно вернуть не 0, ну напрмер 1 :))

Message.Result:=1;

и убедись что в описании процедуры у тебя стоит ... Var ...:TMessage; ...., не забудь также inherited

иначе твоя единичка не вернётся


 
Alibaba   (2002-03-12 15:04) [13]

2Song
У меня закрывается прога но процесс ShutDown прекращается.
Посмотри, плиз:

type
TfrmMain = class(TForm)
...
private
procedure OK(var message: TMessage); message WM_ENDSESSION;
end;

var
frmMain: TfrmMain;

procedure TfrmMain.OK(var message: TMessage);
begin
message.WParam:=Integer(True);
message.LParam:=ENDSESSION_LOGOFF;
message.Result:=0;
inherited;
frmMain.Close;
end;

почему ShutDown прекращается?


 
Song   (2002-03-12 15:34) [14]


message.Result:=0;
inherited;
frmMain.Close;


Вы всегда так внимательно читаете? Посмотрите выше на мой ответ, а потом ещё help прочитайте ещё раз :))


 
Song   (2002-03-12 15:39) [15]

Ну ладно не буду терзать:

Для WM_ENDSESSION:



procedure TfrmMain.OK(var message: TMessage);
begin
IF wParam=1 then MainForm.Close;
inherited;
end;



Для WM_QUERYSESSION:



procedure TfrmMain.OK(var message: TMessage);
begin
message.LParam:=ENDSESSION_LOGOFF; {необязательно}
message.Result:= 1;
MainForm.Close;
inherited;
end;




 
Alibaba   (2002-03-12 15:45) [16]

2Song

Не работает...
Приложение закрывается - а ShutDown прекращается...


 
Song   (2002-03-12 16:01) [17]

какой именно не работает первый или второй или оба?


 
Alibaba   (2002-03-12 16:03) [18]

Первый WM_ENDSESSION


 
Song   (2002-03-12 16:05) [19]

А ОС какая?


 
Song   (2002-03-12 16:07) [20]

Попробуй так:
описание процедуры засунь в protected
MainForm.Close замени на Close


 
Alibaba   (2002-03-12 16:11) [21]

Пробую...


 
Alibaba   (2002-03-12 16:12) [22]

W2k
Пробую...


 
Alibaba   (2002-03-12 16:12) [23]

W2k.
Пробую...


 
Song   (2002-03-12 16:14) [24]

С W2K не знаю. На 98 отлично всё закрывается


 
Song   (2002-03-12 16:15) [25]

А хотя... слушай у меня в XP такая штука катит. Поэтому пробуй..


 
Alibaba   (2002-03-12 16:16) [26]

Ок - сейчас попробую откомпилить и запустить на компе, где W98.


 
Song   (2002-03-12 16:18) [27]

на W2K не получилось?


 
Song   (2002-03-12 16:23) [28]

Вот только что попробовал совершенно другом компе, всё работает


 
Alibaba   (2002-03-12 16:26) [29]

Дай пример, ПОЖАЛУЙСТА, сейчас попробовал на 98 - НЕ РАБОТАЕТ!!!


 
Song   (2002-03-12 16:29) [30]

я уже тебе писал:

отрывок кода:

protected
...
Procedure WhetherWindowsEnds(Var Msg:TMessage); message WM_ENDSESSION;
...
private
...


Procedure TForm1.WhetherWindowsEnds(Var Msg:TMessage);
Begin
IF Msg.wParam=1 then Close; // Винда хочет перегружаться. Завершаем принудительно
inherited;
End;


 
Song   (2002-03-12 16:33) [31]

Может у тебя чё-нить в обработчике onClose чего "плохого" стоит, из-за чего он не перегружается?


 
y-soft   (2002-03-12 20:45) [32]

Вообще-то MSDN рекомендует не закрывать окна и завершать приложение, а сохранять критические данные - все остальное Windows сама сделает

А отличие между win9X и winNT в том, что:

в NT/2000/XP можно назначить приоритет посылки сообщений WM_QUERYENDSESSION, WM_ENDSESSION приложению (иногда очень полезно);

в 9X опрашиваются все приложения и только потом принимается решение, завершать работу Windows или нет;

в NT/W2K посылка сообщений осуществляется, пока какое-нибудь приложение не ответит отрицательно, причем в W2K приложения, согласные завершиться, завершаются. Предложение завершить неотвечающее приложение выводиться только в NT/2000, если приложение не отвечает ~5 c и ожидает решения пользователя тоже ~5 с (значения эмпирические)

Также следует учесть, что консольным приложениям сообщения не посылаются. Вместо этого они должны зарегистрировать процедуру HandlerRoutine, и обрабатывать в ней уведомления CTRL_SHUTDOWN_EVENT и CTRL_LOGOFF_EVENT



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

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

Наверх





Память: 0.52 MB
Время: 0.006 c
7-18172
sniknik
2002-03-12 19:31
2002.06.06
Нужно загасить форму :).


3-17794
jenbbond
2002-05-15 10:39
2002.06.06
Экспорт в 1С


3-17783
veronika
2002-05-14 16:09
2002.06.06
adoTable1.updatebatch


4-18199
fidget
2002-04-05 15:09
2002.06.06
Программма закрывается, но shutdown прекращается :(


6-18092
TOLTEC
2002-03-25 02:00
2002.06.06
Клиент для сервера





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