Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Вниз

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


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
Рем, а в смысле жестоко?
Напрочь чтоли все глушит...




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.042 c
3-42669           Vopros                2002-01-21 13:10  2002.02.14  
Как создать таблицу Paradox?


1-42787           st_Lexa               2002-01-29 17:04  2002.02.14  
Кликнул мышкой - получи что-нибудь


3-42705           FilSM                 2002-01-18 16:02  2002.02.14  
ADO глючит.


14-42860          Андрей Сенченко       2001-12-25 16:20  2002.02.14  
Безумные размеры EXE-шников


4-42892           Shadow77              2001-12-17 15:27  2002.02.14  
Как узнать, активно или нет данное окно?