Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.14;
Скачать: CL | DM;

Вниз

Как насильно завершить другую программу?   Найти похожие ветки 

 
Anderius ©   (2001-11-17 21:12) [0]

Уважаемые мастера, подскажите, как насильно завершить другую программу?


 
Delphi5.01 ©   (2001-11-19 18:41) [1]

PostMessage(FindWindow(Nil, "Notpad"), WM_QUIT, 0, 0);
Отключает нотпед если он запушен ели нет то отключит твою программу поэтому проверяй
По этому пиши вот что
If FindWindow(Nil, "Notpad")<>nil
then PostMessage(FindWindow(Nil, "Notpad"), WM_QUIT, 0, 0);


 
Beat ©   (2001-11-20 08:48) [2]

Я делал так: KillProcess(Handle...);


 
Fellomena   (2001-11-20 11:52) [3]

А что бы сделать процесс закрытия ещё более насильственным 8), можно послать процессу ассинхронную команду :
SendMessge(FindWindow(Nil, "Notpad"), WM_QUIT, 0, 0);
ПРосто PostMessage помещает сообщение в общую очередь и поэтому процесс закрытия может затянуться (зависит от длины очереди сообщений),
А ассинхронная SendMessage приравнивается к таким сообщениям как OnPaint и OnClose которые обрабатываются сразу 8)

ПОМНИТЕ !!! ВСЯКОЕ ИЗЛИШНЕЕ НАСИЛИЕ - ВРЕДОНОСНО !!! 8)


 
Beat ©   (2001-11-20 13:20) [4]

KillProcess - и есть САМОЕ НАСИЛЬСТВЕННОЕ УБИВАНИЕ процесса!


 
paul_shmakov ©   (2001-11-20 17:01) [5]

2 Fellomena:
несколько небольших поправок:
1. SendMessage - это как раз синхронная посылка сообщения, а вот PostMessage - асинхронная.
2. сообщение WM_PAINT имеет один из самых низких приоритетов (ниже только WM_TIMER). порядок выборки сообщений из очереди следующий:
1) сообщения, посланные SendMessage
2) сообщения, посланные PostMessage
3) "сообщение" в результате вызова PostQuitMessage
4) сообщения от клавиатуры и мыши
5) WM_PAINT
6) WM_TIMER

2 Beat:
а чем TerminateProcess не нравится?


 
Suntechnic ©   (2001-11-20 19:34) [6]

> paul_shmakov © (20.11.01 17:01)
Как в одном фильме говорилось "Михалыч, ты конечно мужик авторитетный, но ..." дальше цензура :)

По второму пункту замечание
>2. сообщение WM_PAINT имеет один из самых низких приоритетов (ниже только >WM_TIMER). порядок выборки сообщений из очереди следующий:
> 1) сообщения, посланные SendMessage

Проблема в том, что сообщения посланные SendMessage в очередь сообщений вообще на попадают. Они посылаются оконной процедуре напрямую.


 
Иван Шихалев ©   (2001-11-20 23:23) [7]

И еще одна капля дегтя :) Сохранение данных и прочее вполне может оказаться в обработке WM_CLOSE или WM_DESTROY. Поэтому корректнее всего будет сделать PostMessage (hWnd, WM_CLOSE, 0, 0), затем поставить на какое-то время таймер и по его истечению, если приложение еще не закрылось - TerminateProcess.

Что касается SendMessage - эта функция синхронная, минует очередь сообщений, следовательно WM_QUIT вообще скорее всего обработано не будет, поскольку проверка на него зачастую стоит в цикле обработки сообщений (классическая схема: while GetMessage () do), а DefWindowProc на него не реагирует. А если таким образом отправить WM_CLOSE или WM_DESTROY, а та прога на обработке повиснет, что произойдет с отправляющей прогой? Правильно, тоже повиснет - в этом отношении PostMessage гораздо надежнее.


 
paul_shmakov ©   (2001-11-21 00:47) [8]

2 Suntechnic:
спасибо за замечение :) да, конечно - сообщения, посланные SendMessage отправляются напрямую оконной процедуре. это я для для примера упростил, чтобы показать порядок обработки сообщений. виноват.
одно но. чтобы картина была полной, то следует заметить, что оконная процедура вызовается для обрабоки синхронного сообщения в тот момент, когда поток, владелец окна, вызовет GetMessage (ну или PeekMessage).
т.е. если поток занят своими грязными делами и об обработке сообщений и не думает, то, как верно подметил Иван Шихалев, отправляющая прога тоже подвиснет.


 
Fellomena   (2001-11-21 13:17) [9]

ребята- тук-тук...
2 paul_shmakov: ты чтож хочешь сказать что у таймера самый низкий приоритет в системе ???!!!
хм... мда... даже как-то грустно...
Нет ничего в системе, что было бы приоритетнее системного таймера !!!
Событие перерисовки и закрытия окна обрабатывается в обход общей очереди - ВСЕГДА !!!
Единственное, что я могу предположить, что WM_PAINT и WM_TIMER не относятся к перерисовке окна и системному таймеру !!!


 
Виктор Щербаков ©   (2001-11-21 13:35) [10]

Приоритет низкий не у таймера, а у сообщения WM_TIMER.
Пока сообщения с более высоким приоритетом не будут обработаны, WM_TIMER останется отдыхать в очереди. А времени на обработку высокоприоритетных сообщений может много уйти.


 
paul_shmakov ©   (2001-11-21 20:18) [11]

вот отсканировал схему из рихтера (да простит меня автор)
http://getmessage.chat.ru/GETMSG.GIF


 
Beat ©   (2001-11-22 07:25) [12]

Блин, ошибся, НЕ KillProcess, but
TERMINATEPROCESS(HANDLE hProcess, DWORD dwExitCode)!
(не было у меня под руками Win32API)...


 
Fellomena   (2001-11-22 10:40) [13]

Прошу прощения, ошиблась старая:
WM_PAINT и WM_TIMER действительно имеют маленький приоритет...
Но с синхронными и асинхроными я настаиваю.
Синхронными называются сообщения, посылаемые окну не непосредственно, а через системную очередь сообщений (Message queue),
приоритет у этих сообщений равен приоритету приложения, который оно получает при загрузке (-15 до 15).
Асинхронные сообщения - это сообщения, которые непосредственно передаются оконной процедуре, минуя очередь сообщений.
К таким сообщениям в часности относятся сообщения перерисовки, завершения работы, срабатывания таймера и т.д.


 
Иван Шихалев ©   (2001-11-22 17:49) [14]

PostMessage в SDK называется "asynchronous message function". А термина "asynchronous message" я не встречал.


 
Саня   (2001-12-11 15:38) [15]

А интересно...
По сетке можно закрыть прогу, запущенную на другом компе...


 
Fellomena   (2001-12-11 16:02) [16]

2 Саня: только если на удалённой машине будет стоять серверная часть твоей программы, подключившись к которой, ты уже сможешь делать те или иные операции.
На этом основаны все трояны и системы удалённого администрирования (RAT).
Так что ни о чём таком типа: SendMessage(\\192.168.1.66\ProcHandle, WM_QUIT, 0, 0); и не мечтай =)

(... хм... а было бы тогда забавно - можно было бы такой DoS устроить... хех...)


 
Rem ©   (2001-12-11 20:59) [17]

А как насчет закрытия приложения в W2K при помощи TerminateProcess?


 
Rem ©   (2001-12-11 21:06) [18]

Сам нашел:

GetWindowThreadProcessID(Wnd, ProcessID);
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), ProcessID), 0);


Но работает жестоко Ж8()


 
Саня   (2001-12-17 16:07) [19]

>Rem
Рем, а в смысле жестоко?
Напрочь чтоли все глушит...



Страницы: 1 вся ветка

Текущий архив: 2002.02.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
1-42713
Kozhanov
2002-01-31 14:37
2002.02.14
как сделать


1-42756
DmitryB
2002-01-31 00:20
2002.02.14
Как заполнилть таблицу?


3-42656
Anton Shestakov
2002-01-19 02:10
2002.02.14
Внесение в базу данные2


3-42655
kaa1971
2002-01-20 22:33
2002.02.14
Как создать новый индекс в существующей базе Paradox


14-42843
sidstar
2001-12-25 14:00
2002.02.14
RX Lib 2.75 и Delphi 6