![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщение при прерывании процесса [D6, WinXP]
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]Посылается, но если на него приложение не отреагирует - его завершат насильно.