Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.006 c
3-42694
Belov
2002-01-18 15:29
2002.02.14
Запись картинки в базу


3-42685
NOV
2002-01-21 12:38
2002.02.14
alias


14-42855
Snake
2001-12-24 18:03
2002.02.14
Администрирование Win2000


3-42702
ava
2002-01-22 23:17
2002.02.14
Как перенести, а затем востановить, данные из таблицы


4-42895
Sour
2001-12-17 20:08
2002.02.14
Ресурсы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский