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

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

Сообщение при прерывании процесса [D6, WinXP]


Страницы:   1 2

webpauk ©   (2005-08-14 16:12:00) 

Подскажите посылвется ли какое-либо сообщение приложению при насильственном прерывании процесса через диспетчер задач.


Leonid Troyanovsky   (2005-08-15 11:33:00) [21]


> tesseract ©   (14.08.05 16:45) [3]
> Как правило WM_QUERY_END_SESSION или WM_QUIT. Если в течении
> некоторого времени (если не изменялись настройки винды по
> этому поводу) процесс быкует то просто освобождается занятая
> им память.


WM_CLOSE. Окну, которое отображается на таскбаре.
И не "освобождается занятая память", а терминируется процесс,
после подтверждения в диалоге EndTask.

--
Regards, LVT.


Игорь Шевченко   (2005-08-15 10:19:00) [22]


> Короче, кто знает чего посылается при завершении процесса
> из диспетчера


Согласно правил грамматики русского языка, предложение со слова "короче" не начинается.


Игорь Шевченко   (2005-08-15 10:18:00) [23]

Alexander Panov ©   (14.08.05 16:56) [6]


> Разве?


А если задасться вопросом, кому Task Manager будет посылать сообщение при завершении процесса из списка процессов, то ответ придет сам собой.


tesseract   (2005-08-14 17:42:00) [24]

Не зачто, сам от души порезвился. Оказывается не зря винда говорит что не к добру процесс завершать.


alpet   (2005-08-14 17:35:00) [25]


uses Windows, Messages, SysUtils;
var msg: tagMsg;
    t: text;
   hWnd: THandle;

begin
hWnd := CreateWindow ('Edit', 'Aoyoka',
       ES_MULTILINE or WS_SYSMENU or WS_VISIBLE,
       CW_USEDEFAULT, CW_USEDEFAULT,
       200, 200, 0, 0, hInstance, nil);
AssignFile (t, 'c:\temp\log.txt');
Rewrite(t);
{$I-}
while GetMessage (msg, 0, 0, 0) do
begin
 case msg.message of
    WM_CLOSE: WriteLn (t, 'Msg: WM_QUIT');
  WM_DESTROY: WriteLn (t, 'Msg: WM_DESTROY');
  WM_NCMOUSEMOVE .. WM_NCMBUTTONDBLCLK,
  WM_NCHITTEST, WM_MOUSEMOVE: Write (t, '*'); // non-client and mouse messages
  WM_QUIT:
   begin
    WriteLn (t, 'Msg: WM_QUIT');
    break;
   end;
  WM_ENDSESSION:
    WriteLn (t, 'Msg: WM_ENDSESSION');
  else
   begin
    WriteLn (t, format ('Msg: $%x', [msg.message]));
     if (msg.hwnd <> 0) then
      begin
       TranslateMessage (msg);
       DispatchMessage (msg);
       // if not IsWindow (hWnd) then break;
      end;
   end;    
 end;
 Flush (t);
end;
CloseFile (t);
end.


Вот и все. Никаких сообщений, тихая смерть.


webpauk   (2005-08-14 17:32:00) [26]


> tesseract ©   (14.08.05 17:27) [11]

спасибо за бесцельно потраченное время! 8-)


tesseract   (2005-08-14 17:27:00) [27]

Ни фига оказывается не посылается. 15 минут убил.

При выходы из винды - WM_QUERYENDSESSION при убийстве процесса просто он убивается и всё.
при завершении через TaskManager - WM_QUIT а за ним WM_Destroy главному окну.
Кстати в цикле обработки сообщений Tappication обрабатывается только WM_QUIT.


webpauk   (2005-08-14 17:14:00) [28]


> tesseract ©   (14.08.05 17:08) [9]
> >>>Alexander Panov

Break!!!

Короче, кто знает чего посылается при завершении процесса из диспетчера


tesseract   (2005-08-14 17:08:00) [29]

>>>Alexander Panov

Дядя Саша я твёрдо знаю что WM_QUIT посылается в основной цикл обработки сообщений приложения по любому (если только не kill через ProcessExporer).
 WM_ENDSESSION послыается после WM_QUERYENDSESSION.
Из Win32 api help >>
The WM_QUERYENDSESSION message is sent when the user chooses to end the Windows session or when an application calls the ExitWindows function. If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

The WM_QUIT message indicates a request to terminate application


alpet   (2005-08-14 17:00:00) [30]

Alexander Panov ©   (14.08.05 16:56) [6]

Я пробывал ловить:

{ msgr.dpr }
uses Windows, Messages;
var msg: tagMsg;
    t: text;

begin
AssignFile (t, 'c:\temp\log.txt');
Rewrite(t);
while GetMessage (msg, 0, 0, 0) do
begin
 case msg.message of
  WM_QUIT:
    WriteLn (t, 'Msg: WM_QUIT');
  WM_ENDSESSION:
    WriteLn (t, 'Msg: WM_ENDSESSION');
  else
    WriteLn (t, 'Msg: ', msg.message);
 end;
 Flush (t);
end;
CloseFile (t);
end.

С первой вкладки - сообщение таки приходило - $C096. С второй - при принудительном завершении, нет, равно как и при использовании
taskkill /IM msgr.exe /F

Попробую сейчас также с гуевыми процессами.


webpauk   (2005-08-14 16:58:00) [31]


> tesseract ©   (14.08.05 16:45) [3]


> alpet ©   (14.08.05 16:48) [4]

прежде чем советовать неплохо бы самому проверить


Alexander Panov   (2005-08-14 16:56:00) [32]

alpet ©   (14.08.05 16:48) [4]
При завершении процесса, на вкладке "процессы" (на не "приложение"), сообщения не посылаются


Разве?


tesseract   (2005-08-14 16:55:00) [33]

WM_DESTROY - посылается только ОКНУ, а не процессу как и WM_SYSCOMMAND c SC_CLOSE.

Чтобы реально выяснить поставь точку останова на цикле обработки сообщений ( только данных сообщенийа то начнёшь понимать оленеводов в процессе геноцида блох вручную). и закрой процесс в диспетчере задач.


alpet   (2005-08-14 16:48:00) [34]

1. WM_DESTROY
2. WM_SYSCOMMAND, wParam = SC_CLOSE

При завершении процесса, на вкладке "процессы" (на не "приложение"), сообщения не посылаются, поскольку считается что процесс "висит".


tesseract   (2005-08-14 16:45:00) [35]

Как правило WM_QUERY_END_SESSION или WM_QUIT. Если в течении некоторого времени (если не изменялись настройки винды по этому поводу) процесс быкует то просто освобождается занятая им память.


webpauk   (2005-08-14 16:35:00) [36]

Какое?


TUser   (2005-08-14 16:16:00) [37]

Посылается, но если на него приложение не отреагирует - его завершат насильно.


Страницы:   1 2

Наверх

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