Форум: "WinAPI";
Текущий архив: 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
Рем, а в смысле жестоко?
Напрочь чтоли все глушит...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c