BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
Закрытие процесса по имени exe-шника
Возникла небольшая загвоздка.
Задача: завершить процесс, если в наличии есть имя exe файла запущенного в данный момент приложения.
Незаконченное решение:
Используя функцию SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint; передать ей в качестве первого параметра заголовок окна. НО! Его-то мы и не знаем.
Вопрос: как получить заголовок окна, зная имя исполняемого приложения?
Цитата:
Originally posted by fel[x]
Уважаемые участники форума.
Возникла небольшая загвоздка.
Задача: завершить процесс, если в наличии есть имя exe файла запущенного в данный момент приложения.
Незаконченное решение:
Используя функцию SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint; передать ей в качестве первого параметра заголовок окна. НО! Его-то мы и не знаем.
Вопрос: как получить заголовок окна, зная имя исполняемого приложения?
Уважаемые участники форума.
Возникла небольшая загвоздка.
Задача: завершить процесс, если в наличии есть имя exe файла запущенного в данный момент приложения.
Незаконченное решение:
Используя функцию SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint; передать ей в качестве первого параметра заголовок окна. НО! Его-то мы и не знаем.
Вопрос: как получить заголовок окна, зная имя исполняемого приложения?
Несовсем верно. В качестве первого параметра - дескриптор окна.
Если надо просто убить процесс, то это делается с помощью:
Код:
Что нерекомендуется...
В этом случае поможет уже вышеприведенная ссылка.
Если надо корректно закрыть прогу, нужно послать сообщение WM_CLOSE c помощью SendMessage или PostMessage или PostThreadMessage. Что, кстати, необязано приводить к закрытию проги, всё зависит от конкретной реализации проги.
Для SendMessage и PostMessage нужен дескриптор окна. Для PostThreadMessage нужен идентификатор очереди.
Причем найти надо дескриптор _главного_ окна из _главной_ очереди процесса.
Это делается так:
Зная имя процесса надо перечислить все процессы в системе, найдя нужный хэндл процесса (см. вышеописанную ссылку). В этом процессе надо перечислить все очереди, найдя идентификатор главной очереди (главная очередь определяется по времени её создания). Далее - надо в этой очереди найти все окна (ф-ция EnumThreadWindows). Но как определить главное окно, я незнаю... :(
Поэтому советую пользоватся PostThreadMessage. Здесь используется этот же идентификатор очереди.
Я писал ф-ции поиска очередей и процессов в системе. Вот атаче рабочий пример их использования.
Всем большое спасибо. Разобрался.