Автор
|
Тема: Как убить окно?
|
One |
опубликован 13-12-2001 16:50 MSK
Народ, может кто знает, как убить чужое окно, так, как это делают Винды. (Например, при выходе из NT через Ctrl-Alt-Del она убивает все окна независимо от того, в каком состоянии они находятся).Если кто знает, подскажите. Спасибо
|
enigma
|
опубликован 13-12-2001 17:36 MSK
Короче, пишешь на так всеми либимом 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
Это конечно все хорошо, но не все так просто.Во первых, DestroyWindow убивает только те оекна, которые толбой же созданы, но это ладно, пробуем послать WM_CLOSE - вроде работает, но!!! убивает не все (все что в трее или спрятано - не убивает, если прога перед выхадом спрашивает чего-либо, то висит, пока не ответишь). А так то я конечно попробовал, на это мозгов хватает. Если есть еще идеи, большое спасибо за их написание. |
Flex Ferrum
|
опубликован 13-12-2001 17:57 MSK
Начнем с того, что окна тут не причем - убивать надо процессы. А процессы убиваются совершенно иначе. Где-то (чуть ли не в MSDN) видел статью, в которой рассказывалось как правильно прибить чужой процесс. Основная идей такая - проходишься по всем top-level окнам, посылаешь им WM_QUIT, после чего ждешь, пока процесс, владеющий окном, не завершится. Если это не происходит в течении заданного интервала времени, то подключаешь тяжелую артеллерию наподобие TerminateProcess. Вот так. |
kuss
|
опубликован 13-12-2001 20:13 MSK
Если калибр побольше взять, то можно и окно, и процесс, и винду замочить!!! |
gecky
|
опубликован 13-12-2001 20:39 MSK
Чтобы мочить винды большой калибр не нужен! |
Flex Ferrum
|
опубликован 14-12-2001 10:09 MSK
Без шуток. Пишешь под NT драйвер, работающий напрямую с NTDll - и любой процесс вышибается со свистом. В том числе и ядро системы вместе с основными сервисами (которые winlogon, smss, system, services и т. п.). Но это уже сверхтяжелая артеллерия. |
One
|
опубликован 14-12-2001 11:12 MSK
Про WM_QUIT я конечно подумал, но там вроде какой-то параметр нужно задавать, а сним я не разобрался. Может он конечно и нафиг не нужен.Ксати, еще вопрос - как по дискрептору окна найти его EXEшник? по дискрептору модуля можно (лазил вчера по WinAPI), а по дискрептору окна не нашел. Может, можно както связать дискрептор окна и модуля? |
One
|
опубликован 14-12-2001 11:21 MSK
Кстати, может вспомнишь, где статью-то видел, интересно всеж. А то у меня ни WM_QUIT, ни TerminateProcess не пашет (кстати, помоему дискрептор окна и дискрептор процесса не одно и то же!).А если через WM_DESTROY ... WM_CLOSE, то убивается многое (не все), но ресурсы не освобождаются ни фига. |
Flex Ferrum
|
опубликован 14-12-2001 11:28 MSK
Article ID: Q178893 "HOWTO: Terminate an Application "Cleanly" in Win32". Вот. |
Eam
|
опубликован 14-12-2001 11:42 MSK
Вообще-то на www.rsdn.ru на эту тему есть две статьи: "Как программно завершить другое приложение?" и "Как получить список запущенных приложений?". Программа описанныя в них там же и реализована и ее можно скачать с исходниками. |
One
|
опубликован 14-12-2001 12:26 MSK
Спасибо
|
Molibden
|
опубликован 14-12-2001 20:14 MSK
Вот немного кривая, но работающая функция, которая киляет запущенный 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); } |