Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как завершить приложение или процесс из другого процесса? (plz. help)

9.5K
25 декабря 2004 года
buhjr
2 / / 25.12.2004
Создаю диалоговое окно с 2-мя кнопками "OnButton1"
,"OnButton2"
при нажатии на которые происходит следующее:

Находится какое либо приложение (например калькулятор) и закрывается, в первом случае используется ID - шник и функция TerminateProcess,
во втором случае посылается обычное сообщение WM_CLOSE.
И в том и другом случае все работает нормально (по крайней мере на калькуляторе)

void CKillproceesDlg::OnButton1()
{
// TODO: Add your control notification handler code here

DWORD ProcessID;
HWND KilledWindow;
HANDLE hProcess;

KilledWindow = ::FindWindow("SciCalc","Калькулятор");

if(KilledWindow == NULL)
{
MessageBox("Not Find");
return;
}

GetWindowThreadProcessId(KilledWindow,&ProcessID);

hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);

if(hProcess!=NULL)
{
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
}



}

void CKillproceesDlg::OnButton2()
{

HWND KilledWindow;

KilledWindow = ::FindWindow("SciCalc","Калькулятор");

if(KilledWindow == NULL)
{
MessageBox("Not Find");
return;
}

::SendMessage(KilledWindow,WM_CLOSE,NULL,NULL);


}

Но если я создаю не диалоговое приложение , а процесс (с использованием соответствующих функций RegisterServiceCtrlHandler SetSomeServiceStatus ...), а затем

в нем создаю поток и из потока пытаюсь теми же способами закрыть приложение то функция FindWindow не может найти приложение


P.S.
Может быть я что-то не допонимаю в работе с процессами но сколько я ни пытался так и не смог обнаружить в чем проблема
351
25 декабря 2004 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by buhjr
Создаю диалоговое окно с 2-мя кнопками "OnButton1"
,"OnButton2"
при нажатии на которые происходит следующее:

Находится какое либо приложение (например калькулятор) и закрывается, в первом случае используется ID - шник и функция TerminateProcess,
во втором случае посылается обычное сообщение WM_CLOSE.
И в том и другом случае все работает нормально (по крайней мере на калькуляторе)

void CKillproceesDlg::OnButton1()
{
// TODO: Add your control notification handler code here

DWORD ProcessID;
HWND KilledWindow;
HANDLE hProcess;

KilledWindow = ::FindWindow("SciCalc","Калькулятор");

if(KilledWindow == NULL)
{
MessageBox("Not Find");
return;
}

GetWindowThreadProcessId(KilledWindow,&ProcessID);

hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);

if(hProcess!=NULL)
{
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
}



}

void CKillproceesDlg::OnButton2()
{

HWND KilledWindow;

KilledWindow = ::FindWindow("SciCalc","Калькулятор");

if(KilledWindow == NULL)
{
MessageBox("Not Find");
return;
}

::SendMessage(KilledWindow,WM_CLOSE,NULL,NULL);


}

Но если я создаю не диалоговое приложение , а процесс (с использованием соответствующих функций RegisterServiceCtrlHandler SetSomeServiceStatus ...), а затем

в нем создаю поток и из потока пытаюсь теми же способами закрыть приложение то функция FindWindow не может найти приложение


P.S.
Может быть я что-то не допонимаю в работе с процессами но сколько я ни пытался так и не смог обнаружить в чем проблема



Дело в том FindWindow ищет так называемые top-levels windows, то есть окна приложений которые отображены в TaskBar или у которых parent = DesktopWindow, а не процессы. В твоем случае по всей видимости создается процесс без такого окна.

3
25 декабря 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by buhjr

Но если я создаю не диалоговое приложение , а процесс (с использованием соответствующих функций RegisterServiceCtrlHandler SetSomeServiceStatus ...), а затем


Наверное, ты имел в виду не "приложение", а "сервис"? Для приложений не нужно использовать эти "соответствующие функции".

Цитата:
Originally posted by buhjr

в нем создаю поток и из потока пытаюсь теми же способами закрыть приложение то функция FindWindow не может найти приложение


Ты создаешь сервис, причем не даешь ему доступа к пользовательскому десктопу, т.е. не делаешь его интерактивным. Т.о. сервис работает со своим рабочим столом на своей оконной станции. Понятно, что там окна обычного приложения нет.

Если тебе нужно просто приложение, то не делай его сервисом. :)

Ну а если тебе нужен сервис, то почитай, как сделать его интерактивным:
Interactive Services
Accessing the Application Desktop from a Service
INFO: Security, Services and the Interactive Desktop
INFO: Services, Desktops, and Window Stations Window Stations

Здесь тоже немного информации по теме на русском:
Реализация keylogging под WIN32

В конечном итоге всё сводится, примерно, к такому:

 
Код:
SetProcessWindowStation(OpenWindowStation("Winsta0", FALSE, WINSTA_READSCREEN));
SetThreadDesktop(OpenDesktop("default", NULL, FALSE, DESKTOP_CREATEWINDOW));


Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог