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

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

Завершение Windows [D6, WinXP]


Страницы:   1 2

Brand ©   (2002-03-10 00:46:00) 

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


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

Вообще-то 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


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

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


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

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

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

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;


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

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


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

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


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

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


Alibaba   (2002-03-12 16:16:00) [7]

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


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

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


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

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


Alibaba   (2002-03-12 16:12:00) [10]

W2k.
Пробую...


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

W2k
Пробую...


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

Пробую...


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

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


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

А ОС какая?


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

Первый WM_ENDSESSION


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

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


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

2Song

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


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

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

Для 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;



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


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


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


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

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 прекращается?


Страницы:   1 2

Наверх

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