![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WM_ENDSESSION и Win7 [D7]
istok © (2009-10-21 15:21:00)WM_EndSession не ловится в win7, а в xp ловится. Код представлен ниже:
type
TMyForm = class(TForm)
...
private
...
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
...
procedure TMyForm.WMEndSession(var Msg: TWMEndSession);
begin
AddLog('WMEndSession');
if Msg.EndSession = True then
begin
//call my app destructors
halt;
end;
inherited;
end;
как же обрабатывать logoff\sutdown в win7 чтобы вызывать свои деструкторы?
Leonid Troyanovsky (2009-12-02 23:51:00) [1]
> robot © (02.12.09 19:26) [13]
> Вдруг упустил чего.
У MS спросить надо.
Regards, LVT.
robot (2009-12-02 19:26:00) [2]
> Игорь Шевченко ©
Сам-то проверял?
Интересуюсь, т.к. для меня вопрос важен.
Приведенный мной способ работает на win7 x64, 2008 r2 x64, d2007.
Вдруг упустил чего.
Игорь Шевченко (2009-11-24 22:14:00) [3]А тебе ж там написали, болезному:
"the only reliable way
of handling the WM_ENDSESSION is to use the HookWindow method of
Application."
даже пример привели.
robot (2009-11-24 22:08:00) [4]Если еще нужно:
procedure TForm1.FormCreate(Sender: TObject);
begin
FWndHandle := Classes.AllocateHWnd(WndProc);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Classes.DeallocateHWnd(FWndHandle);
end;
procedure TForm1.WndProc(var Msg: TMessage);
begin
if Msg.Msg = WM_ENDSESSION then
Halt
else
Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
Как-то так.
istok (2009-10-21 21:43:00) [5]угу, оба не вызываются, по крайней мере не пишет соответствующий лог в файл.
а при закрытии руками - пишет..
clickmaker (2009-10-21 17:03:00) [6]и OnDestroy и OnClose даже не вызывается?
istok (2009-10-21 16:48:00) [7]
> какой смысл перед смертью чистить зубы, а?
такой, что программа перед своим закрытием должна кое-чего сделать согласно своей бизнес логике. но деструкторы не вызываются, события в вин7 не ловятся. и как это сделать в вин7 - пока непонятно.. в xp проблем нет.
clickmaker (2009-10-21 16:11:00) [8]> известный косяк с невызовом деструкторов
какой смысл перед смертью чистить зубы, а?
istok (2009-10-21 16:10:00) [9]
> clickmaker © (21.10.09 15:57) [3]
>
> TForm.OnDestroy
дык не катит, по крайней мере в D7. в предыдущем посте это описано..
istok (2009-10-21 16:04:00) [10]
> TIF © (21.10.09 15:58) [4]
>
> По-моему правильнее сначала ловить WM_QUERYENDSESSION, вернуть
> на это сообщение системе ответ TRUE, а уже только потом
> дождаться WM_ENDSESSION и сворачивать свою деятельность
а мне нет смысла ловить WM_QUERYENDSESSION
мне надо обработать закрытие приложения, при логофе\шатдауне. есть известный косяк с невызовом деструкторов, описанный например здесь: http://www.delphifaq.com/faq/delphi/vcl/f285.shtml
TIF (2009-10-21 15:58:00) [11]По-моему правильнее сначала ловить WM_QUERYENDSESSION, вернуть на это сообщение системе ответ TRUE, а уже только потом дождаться WM_ENDSESSION и сворачивать свою деятельность
clickmaker (2009-10-21 15:57:00) [12]TForm.OnDestroy
istok (2009-10-21 15:52:00) [13]а я и не утверждал, что это единственное место, но других не знаю. queryendsession насколько я понимаю не подходит, что вы посоветуете?
clickmaker (2009-10-21 15:43:00) [14]> чтобы вызывать свои деструкторы?
а мужики-то пишут-пишут и не знают, что обработчик WM_ENDSESSION - это, оказывается, единственное место для вызова деструкторов...