Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 - это, оказывается, единственное место для вызова деструкторов...


Наверх

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