Как завершить приложение или процесс из другого процесса? (plz. help)
,"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.
Может быть я что-то не допонимаю в работе с процессами но сколько я ни пытался так и не смог обнаружить в чем проблема
Создаю диалоговое окно с 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, а не процессы. В твоем случае по всей видимости создается процесс без такого окна.
Но если я создаю не диалоговое приложение , а процесс (с использованием соответствующих функций RegisterServiceCtrlHandler SetSomeServiceStatus ...), а затем
Наверное, ты имел в виду не "приложение", а "сервис"? Для приложений не нужно использовать эти "соответствующие функции".
в нем создаю поток и из потока пытаюсь теми же способами закрыть приложение то функция 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
В конечном итоге всё сводится, примерно, к такому:
SetThreadDesktop(OpenDesktop("default", NULL, FALSE, DESKTOP_CREATEWINDOW));