Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Перехватить закрытие окна через Task Manager


Автор: Solomon 31.3.2010, 11:55
Всем, привет
Передо мной стала задача. При закрытии окна открывать ссылку в браузере. Так вот среди прочих закрытий необходимо так же учесть возможность закрытия преложения через Task Manager.

Может кто то сталкивался с данной проблемой. Возможно ли вообще перехватить данное событие? Как то никогда данным вопросом не интересовался. В гугле тоже ничего толкового не нашел.

Платформа WindowsOS.


Автор: GoldFinch 31.3.2010, 13:13
создай еще 1 процесс, и следи из него за первым

Автор: borisbn 31.3.2010, 13:47
или сделай так, чтобы твоего процесса http://www.google.ru/search?client=opera&rls=ru&q=%D1%81%D0%BA%D1%80%D1%8B%D1%82%D1%8C+%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B8%D0%B7+%D0%B4%D0%B8%D1%81%D0%BF%D0%B5%D1%82%D1%87%D0%B5%D1%80%D0%B0+%D0%B7%D0%B0%D0%B4%D0%B0%D1%87&sourceid=opera&ie=utf-8&oe=utf-8

Автор: Solomon 31.3.2010, 14:46
borisbn, не вариант... игроки будут недовольны) 

GoldFinch, тоже неочень хороший вариант плодить кучу процессов


Автор: jonie 31.3.2010, 14:47
вообще перед убийством система пытается завершить приложение законным методом, если я не ошибаюсь... посмотрите на оконные сообщения в момент убийства

Автор: borisbn 31.3.2010, 15:27
Цитата(jonie @  31.3.2010,  14:47 Найти цитируемый пост)
посмотрите на оконные сообщения в момент убийства

это я первое, что попробывал Spy++ - нету :(

Автор: qwert8734 31.3.2010, 15:34
на сколько я помню, через ключ в реестре можно к каждому запускаемому приложению подцепить dll. не уверен, но можно попробовать вызвать ShellExecute при отгрузке dll

кстати, приложение свое и его можно править или надо цепляться к чужому процессу?

Автор: jonie 31.3.2010, 17:20
ну проще всего получается запустить еще одну копию себя, сделав предварительно мьютекс какой, его и использовать как "точку ожидания"...

Автор: qwert8734 31.3.2010, 18:10
может и проще, если исходник есть. тут уж слово за вопрошающим, он такую информацию не дал

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

Автор: borisbn 31.3.2010, 18:19
Цитата(qwert8734 @  31.3.2010,  15:34 Найти цитируемый пост)
вызвать ShellExecute при отгрузке dll

"отгрузка" dll при снятии через диспетчер не производится. проверил:
Код

BOOL APIENTRY DllMain( HMODULE hModule,
                                 DWORD  ul_reason_for_call,
                                 LPVOID lpReserved
)
{
    if ( DLL_PROCESS_DETACH == ul_reason_for_call )
    {
        FILE * f = fopen( "DLL_PROCESS_DETACH.txt", "wt" );
        fclose( f );
    }
}


файл DLL_PROCESS_DETACH.txt не создаётся при снятии из диспетчера.

Цитата(qwert8734 @  31.3.2010,  15:34 Найти цитируемый пост)
или надо цепляться к чужому процессу

к другому - это совсем просто: каждую секунду проверяешь http://msdn.microsoft.com/en-us/library/aa911386.aspx


jonie, вариант - супер !!!

Автор: bra1ny 31.3.2010, 21:32
NtTerminateProcess перехватить.

Автор: jonie 31.3.2010, 23:13
bra1ny, за это вас могут покарать как правами так и антивирусами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)