![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
завершение Windows [D6, Win2k]
Leny © (2002-12-29 12:53:00)Добрый день, мне нужно отловить завершение Windows, чтобы сохранить данные из программы... Знаю, что Windows отсылает в этом случае сообщения wm_queryendsession, а как его отловить?
Юрий Зотов (2002-12-29 18:40:00) [1]> Song © (29.12.02 17:51)
Зашел. Посмотрел. Расстроился.
Пример глобального хука в ЧаВо по ссылке
http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=delphi;action=display;num=1033932228
принципиально неверен. Локальная переменная SysHook будет проинициализирована лишь в контексте одного-единственного процесса - того, который вызвал процедуру Hook и установил ловушку. В остальных она останется нулем и CallNexTHookEx не сможет работать правильно.
Ребята, ну нельзя же в FAQ (!!!) повторять все ту же уже всем надоевшую ошибку. Ведь она будет скопирована десятками (если не сотнями) неискушенных и получится больше вреда, чем пользы.
Предлагаю СРОЧНО заменить этот пример нормальным. Могу выслать готовый, чтобы не писать специально.
vuk (2002-12-29 18:13:00) [2]WM_QUERYENDSESSION может и не прийти... Например, при вызове InitiateSystemShutdown с флагом bForceAppsClosed.
Song (2002-12-29 17:51:00) [3]http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=news;action=display;num=1040148061
Юрий Зотов (2002-12-29 13:22:00) [4]type
TForm1 = class(TForm)
...
private
procedure WindowsClose(Var Msg:TMessage); message WM_QUERYENDSESSION;
Только проще все делать в OnCloseQuery. Это сработает и при нормальном закрытии формы, и при выходе из Windows.
Leny (2002-12-29 13:09:00) [5]т.е процедуру?.. например:
Procedure TForm.WindowsClose(Var Msg:TMessage);
Begin
IF Msg.WParam=1 then Form.Close;
End;
тогда где указать получение сообщения wm_queryendsession?
Big_Rom (2002-12-29 12:58:00) [6]написать обработчик wm_queryendsession :))