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

Вниз

Завершение 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.011 c
1-17991
stupid
2002-05-23 19:40
2002.06.06
Как избавится от некрасивой прорисовки формы?


1-18012
Val
2002-05-24 12:57
2002.06.06
Логарифм по основанию


1-17893
jenbbond
2002-05-27 12:33
2002.06.06
Помогите с ошибкой


8-18065
дикое Кенгуру
2002-01-19 06:50
2002.06.06
Как или каким компонентом, можно воспроизводить музыку и менять на лету скорость воспроизведения. А также желательно громкость, но без использования регулятора громкости.


8-18064
windy
2002-01-19 07:05
2002.06.06
BMP -> JPEG