WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Как убить окно?

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Как убить окно?
One опубликован 13-12-2001 16:50 MSK   Click Here to See the Profile for One   Click Here to Email One  
Народ, может кто знает, как убить чужое окно, так, как это делают Винды. (Например, при выходе из NT через Ctrl-Alt-Del она убивает все окна независимо от того, в каком состоянии они находятся).

Если кто знает, подскажите.

Спасибо

enigma опубликован 13-12-2001 17:36 MSK     Click Here to See the Profile for enigma  Click Here to Email enigma     
Короче, пишешь на так всеми либимом VC++ + MFC (или не используешь - что несомненно лучше - MFC) следующую фигню:

DWORD WINAPI kill_window( LPVOID lpParam )
{
EnumWindows(for_win_killer,0);
return 0;
}

BOOL CALLBACK for_win_killer(HWND wnd,LPARAM param)
{
//если юзаеш MFC, пишешь так:
CString windowclass;
//если нет(что по-моему правильно), то так:
char windowclass[20];

//для MFC:
GetClassName(wnd,windowclass.GetBuffer(0),20);
//без MFC:
GetClassName(wnd, windowclass, 20);

//ищешь окно с нужным именем:
if (!strcmpi(windowclass,"имя_окна"))
{
//процесс убийства окна:
//убиваешь либо так:
SendMessage(wnd,WM_DESTROY,0,0);
SendMessage(wnd,WM_NCDESTROY,0,0);
SendMessage(wnd,WM_CLOSE,0,0);
//либо так:
DestroyWindow(wnd);
//либо еще как-нибудь:
// ...
}
return TRUE;
}

One опубликован 13-12-2001 17:41 MSK     Click Here to See the Profile for One  Click Here to Email One     
Это конечно все хорошо, но не все так просто.

Во первых, DestroyWindow убивает только те оекна, которые толбой же созданы, но это ладно, пробуем послать WM_CLOSE - вроде работает, но!!! убивает не все (все что в трее или спрятано - не убивает, если прога перед выхадом спрашивает чего-либо, то висит, пока не ответишь).

А так то я конечно попробовал, на это мозгов хватает.

Если есть еще идеи, большое спасибо за их написание.

Flex Ferrum опубликован 13-12-2001 17:57 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Начнем с того, что окна тут не причем - убивать надо процессы. А процессы убиваются совершенно иначе. Где-то (чуть ли не в MSDN) видел статью, в которой рассказывалось как правильно прибить чужой процесс. Основная идей такая - проходишься по всем top-level окнам, посылаешь им WM_QUIT, после чего ждешь, пока процесс, владеющий окном, не завершится. Если это не происходит в течении заданного интервала времени, то подключаешь тяжелую артеллерию наподобие TerminateProcess. Вот так.
kuss опубликован 13-12-2001 20:13 MSK     Click Here to See the Profile for kuss  Click Here to Email kuss     
Если калибр побольше взять, то можно и окно, и процесс, и винду замочить!!!
gecky опубликован 13-12-2001 20:39 MSK     Click Here to See the Profile for gecky  Click Here to Email gecky     
Чтобы мочить винды большой калибр не нужен!
Flex Ferrum опубликован 14-12-2001 10:09 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Без шуток. Пишешь под NT драйвер, работающий напрямую с NTDll - и любой процесс вышибается со свистом. В том числе и ядро системы вместе с основными сервисами (которые winlogon, smss, system, services и т. п.). Но это уже сверхтяжелая артеллерия.
One опубликован 14-12-2001 11:12 MSK     Click Here to See the Profile for One  Click Here to Email One     
Про WM_QUIT я конечно подумал, но там вроде какой-то параметр нужно задавать, а сним я не разобрался. Может он конечно и нафиг не нужен.

Ксати, еще вопрос - как по дискрептору окна найти его EXEшник? по дискрептору модуля можно (лазил вчера по WinAPI), а по дискрептору окна не нашел. Может, можно както связать дискрептор окна и модуля?

One опубликован 14-12-2001 11:21 MSK     Click Here to See the Profile for One  Click Here to Email One     
Кстати, может вспомнишь, где статью-то видел, интересно всеж. А то у меня ни WM_QUIT, ни TerminateProcess не пашет (кстати, помоему дискрептор окна и дискрептор процесса не одно и то же!).

А если через WM_DESTROY ... WM_CLOSE, то убивается многое (не все), но ресурсы не освобождаются ни фига.

Flex Ferrum опубликован 14-12-2001 11:28 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Article ID: Q178893
"HOWTO: Terminate an Application "Cleanly" in Win32". Вот.
Eam опубликован 14-12-2001 11:42 MSK     Click Here to See the Profile for Eam  Click Here to Email Eam     
Вообще-то на www.rsdn.ru на эту тему есть две статьи: "Как программно завершить другое приложение?" и "Как получить список запущенных приложений?". Программа описанныя в них там же и реализована и ее можно скачать с исходниками.
One опубликован 14-12-2001 12:26 MSK     Click Here to See the Profile for One  Click Here to Email One     
Спасибо
Molibden опубликован 14-12-2001 20:14 MSK     Click Here to See the Profile for Molibden  Click Here to Email Molibden     
Вот немного кривая, но работающая функция, которая киляет запущенный AtGuard. Мож, поможет чем-нить

// (c) ХЗкто с xakep.ru
void FWUnload(void)
{
HWND serv_hWnd; //ХВНД Iamserv.exe
HWND app_hWnd; //ХВНД Iamapp.exe
DWORD app_pid; //PID iamapp.exe
DWORD serv_pid; //PID Iamserv.exe
HANDLE serv_H; //переменная в, кот.будет записан процесс сервака
HANDLE app_H; //переменная в, кот.будет записан процесс априложения
DWORD serv_E_code; //exitcode для сервака
DWORD app_E_code; //exitcode для аппликации

//находим окошко с классом "wrq nam" (это сервак)
serv_hWnd = FindWindow("wrq nam",NULL);

//находим окошко с классом "WRQ NAMApp Class" (это аппликация)
app_hWnd = FindWindow("WRQ NAMApp Class",NULL);

//получаем ПИД сервака
GetWindowThreadProcessId(serv_hWnd, &serv_pid);

//получаем ПИД аппликации
GetWindowThreadProcessId(app_hWnd, &app_pid);

//открываем процесс сервака с правами полного доступа
serv_H = OpenProcess(PROCESS_ALL_ACCESS, TRUE, serv_pid);

//открываем процесс аппликации с правами полного доступа
app_H = OpenProcess(PROCESS_ALL_ACCESS, TRUE, app_pid);

//получаем код выхода для сервака
GetExitCodeProcess(serv_H, &serv_E_code);

//получаем код выхода для аппликации
GetExitCodeProcess(app_H, &app_E_code);

//убиваем сервак
TerminateProcess(serv_H, serv_E_code);

//убиваем аппликацию
TerminateProcess(app_H, app_E_code);

}

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.