-
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
halt;
end;
inherited;
end;
как же обрабатывать logoff\sutdown в win7 чтобы вызывать свои деструкторы?
-
> чтобы вызывать свои деструкторы?
а мужики-то пишут-пишут и не знают, что обработчик WM_ENDSESSION - это, оказывается, единственное место для вызова деструкторов...
-
а я и не утверждал, что это единственное место, но других не знаю. queryendsession насколько я понимаю не подходит, что вы посоветуете?
-
TForm.OnDestroy
-
По-моему правильнее сначала ловить WM_QUERYENDSESSION, вернуть на это сообщение системе ответ TRUE, а уже только потом дождаться WM_ENDSESSION и сворачивать свою деятельность
-
> TIF © (21.10.09 15:58) [4] > > По-моему правильнее сначала ловить WM_QUERYENDSESSION, вернуть > на это сообщение системе ответ TRUE, а уже только потом > дождаться WM_ENDSESSION и сворачивать свою деятельность
а мне нет смысла ловить WM_QUERYENDSESSION мне надо обработать закрытие приложения, при логофе\шатдауне. есть известный косяк с невызовом деструкторов, описанный например здесь: http://www.delphifaq.com/faq/delphi/vcl/f285.shtml
-
> clickmaker © (21.10.09 15:57) [3] > > TForm.OnDestroy
дык не катит, по крайней мере в D7. в предыдущем посте это описано..
-
> известный косяк с невызовом деструкторов
какой смысл перед смертью чистить зубы, а?
-
> какой смысл перед смертью чистить зубы, а?
такой, что программа перед своим закрытием должна кое-чего сделать согласно своей бизнес логике. но деструкторы не вызываются, события в вин7 не ловятся. и как это сделать в вин7 - пока непонятно.. в xp проблем нет.
-
и OnDestroy и OnClose даже не вызывается?
-
угу, оба не вызываются, по крайней мере не пишет соответствующий лог в файл. а при закрытии руками - пишет..
-
Если еще нужно:
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;
Как-то так.
-
А тебе ж там написали, болезному:
"the only reliable way of handling the WM_ENDSESSION is to use the HookWindow method of Application."
даже пример привели.
-
> Игорь Шевченко ©
Сам-то проверял?
Интересуюсь, т.к. для меня вопрос важен.
Приведенный мной способ работает на win7 x64, 2008 r2 x64, d2007.
Вдруг упустил чего.
-
> robot © (02.12.09 19:26) [13]
> Вдруг упустил чего.
У MS спросить надо.
Regards, LVT.
|