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 спокойно завершиться.
Если можно, отрывок программы.


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

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 12:15:00) [22]

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


Alibaba   (2002-03-12 12:05:00) [23]

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

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!

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


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


> 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? Нет? Ну вот тогда и не говори ерунду. Написал бы я тебе, да модератор удалит.


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

Все фигня !!!

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

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


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

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


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

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


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

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


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

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


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

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


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

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


Neolord   (2002-03-10 03:52:00) [32]

uses shellapi;

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


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


Страницы:   1 2

Наверх

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