| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > hook on closing program |
| Автор: tusha 14.8.2009, 22:20 | ||||
| необходимо запретить юзеру закрывать программу путем нажатия на крестик (варианты alt+f4, taskmanager можно не учитывать) . както давно надыбал на Винграде тему где описывается создание простейшего клавиатурного шпиона через хуки. во тчто слепил. прошу не пинать сильно (все мы когдато учились DLL
MAIN
=) вот что вышло. вобщем нифига не получается., блокнот как закрывался так и закрывается, никаких изменений. меня смущают 1 и 3 параметры SetWindowsHookEx - правильный ли я ставлю фильтр? и как подвязать фильтр к конктретной программе? - в данном случае Notepad натолкните на правильную мысль буду благодарен за советы) |
| Автор: GoldFinch 14.8.2009, 22:25 |
| при WM_CLOSE return 0; Добавлено через 1 минуту и 4 секунды найди нужное место в целевой проге и пропатчи его |
| Автор: tusha 17.8.2009, 08:36 | ||||||
| не, чет не получается.... при данном коде, даже хук не получаетсяя поставить. -
всегда NULL если сделать так:
хук типа ставится.. - но не понятно куда))) отработка же
мож фильтр не правильный? |
| Автор: Cheloveck 17.8.2009, 09:05 | ||
Зачем хуки? |
| Автор: tusha 17.8.2009, 09:47 | ||
хм, прикол в том, что из моей проги мне надо контролировать стороннее приложение (notepad, mspaint к примеру). или я чтото не до конца понимаю.... в каком контексте надо юзать
???????? |
| Автор: GoldFinch 17.8.2009, 10:13 |
| tusha, найди в целевой проге место где она обрабатывает сообщения, и при WM_CLOSE возвращай 0 |
| Автор: tusha 17.8.2009, 10:19 | ||||
| у меня нету исходников проги. только exe) Добавлено через 6 минут и 47 секунд вот что получилось на данный момент: хук устанавливаю так:
обработка сообщений:
при закрытии блокнота АХТУНГ показыватеся )))) НО блокнот таки закрывается. + аналоггичный мессадж показывается на закрытие всех приложений (получился такой себе глобальный хук) |
| Автор: GoldFinch 17.8.2009, 10:36 |
| tusha, реверсируй этот .ехе - получишь "исходники" для этого можно использовать отладчик, например OllyDbg |
| Автор: tusha 17.8.2009, 10:56 |
| гм... мож я не совсем правильно обрисовал задачу (или я не понимаю что до меня хотят донести =) ).. есть прога - не моя, исходников нету, менять ее НЕЛЬЗЯ (лицензия) - которая получает данные с датчиков в режиме онлайн. юзеры иногда вместо того, чтоб свернуть , попадают по крестику - тем самым прерывая получение данных. я же должен перехватывать закрытие - возможно даже не выводя никакого месседжа - тоесть ччтоб юзер клацал по крестику и нифига не происходило. вот. получить ассемблерный код впринципе можно, а смысл? |
| Автор: GremlinProg 17.8.2009, 11:51 | ||
| с первым параметром проблем нет, но вот третий - да HINSTANCE != HWND при всем желании
только твой хук будет срабатывать во всех окнах заданного потока, если в PreventClose не проверять дескриптор |
| Автор: GoldFinch 17.8.2009, 13:11 | ||
на самом деле, задача решается так:
со стилями надо экспериментировать |
| Автор: GoldFinch 17.8.2009, 14:04 |
| GremlinProg, я тестировал свой код, он делает что надо - убирает крестик (вместе со всей строкой заголовка) если убрать VS_VISIBLE, окно пропадет насовсем, проверь избавляться от Alt+F4 ТС не надо |
| Автор: GremlinProg 17.8.2009, 14:12 | ||
во первых, убирает не только крестик со строкой заголовка, а все стили, во вторых, очевидно, это не то решение, которое требуется |
| Автор: GoldFinch 17.8.2009, 15:01 | ||
| решение с заменой стиля - именно то которое требуется надо посмотреть родной стиль окна (например spy++) и изменить его так, чтобы крестик пропал\заблокировался Добавлено через 5 минут и 46 секунд вот полностью доделанное решение
убирает все кнопки из строки заголовка, сохраняя все остальные стили (строка заголовка остается) |
| Автор: GremlinProg 17.8.2009, 15:37 | ||
GoldFinch, внимательно перечитай:
и скажи: 1. будет ли включен флаг b, если выполняется условие !a && b 2. будет ли включен флаг b, если выполняется условие !(a || b) все просто до безобразия: b - это кнопка сворачивания, а - это кнопка закрытия скрывая панель, ты тем самым скрываешь все кнопки, включая b, которой люди пользуются, WS_SYSMENU работает аналогично, зачем мутить воду-то, непонимаю |
| Автор: GoldFinch 17.8.2009, 15:54 |
Модератор: Сообщение скрыто. |
| Автор: GremlinProg 17.8.2009, 16:22 |
| GoldFinch, на будущее: еще хоть раз увижу подобные наезды на участников, будешь потешаться в одиночестве, и за пределами форума опять же повторюсь, я не придираюсь к твоим советам, я просто предвосхищаю заблуждения участников, в которые ты их вводишь осознанно, и все надеюсь, что когда-нибудь совесть в тебе проснется и ты перестанешь давать советы мимо темы "иногда лучше молчать..."© |
| Автор: Cheloveck 17.8.2009, 17:19 | ||
Вот полное решение ИМХО.
Добавлено через 4 минуты и 25 секунд Хотя, хз как будет работать между процессами |
| Автор: GremlinProg 17.8.2009, 18:12 |
эт точно, субклассинг логичен, но для чужого процесса не подойдет |
| Автор: dumb 17.8.2009, 18:21 | ||
| никак не будет. tusha, во-первых сообщения могут доставляться окну не только через очередь сообщений, но и посредством прямого или опосредованного вызова оконной процедуры - хук WH_GETMESSAGE соответственно в этом случае не срабатывает. такая доставка перехватывается хуками WH_CALLWNDPROC/WH_CALLWNDPROCRET, но изменять сообщение в этих хуках нельзя. во-вторых, и это основное - в своем обработчике хука ты не делаешь ничего для отмены сообщения. должно быть как-то так:
|
| Автор: Cheloveck 17.8.2009, 18:44 |
| да, проверил, моя не работать(( |
| Автор: Earnest 17.8.2009, 20:32 | ||
Может, попробовать просто задизэблить крестик?
Хоть речь о меню, но вроде бы та же команда активирует и крестик. Вроде нет ту ничего такого, что между процессами работать не будет... Разве что если целевое приложение само постоянно активирует системные команды в холостом цикле. |
| Автор: GremlinProg 17.8.2009, 22:47 |
| да, Earnest, как раз то что tusha и требовалось: |
| Автор: tusha 20.8.2009, 08:34 | ||
прикольно, спасибо за совет. однако хотелось бы чтоб визуально окно оставалось без измененийй , в данном случае у него дизеблится крестик. про WM_NULL додул раньше, однако как сказал тов. dumb для данного фильтра (WH_CALLWNDPROC) это отказывалось работать. будем пробовать дальше, если ниче не выйдет, то придется дизейблить крестик ))) |
| Автор: tusha 2.9.2009, 13:10 | ||||
| вобщем наткнулся на такой бок(?) (из предыдущих моих тем) запускаю следующий код:
ситуация следующая: первый раз, когда блокнот висит на экране и запускается приложение - крестик стает сереньким - все как надо. на кнопку с кодом
реагурует отлично -------------------------------------------------- потом закрываем программу (блокнот остается с ЗАБЛОКИРОВАННЫМ крестиком) и запускаем ее снова - пробуем разблокировать крестик - ничего не получается.... в ситуации когда прогу закрываю, но крестик окна блокнота MF_ENABLED - все работает отлично ктонибудь сталкивался с таким? есть идеи? Добавлено через 4 минуты и 43 секунды еще одно маленькое уточнение - хендл окна я получаю, но рядом со значением в скобках стоит unused ???? |
| Автор: GremlinProg 3.9.2009, 12:16 | ||
перед закрытием своей программы, просто вывзови:
тогда и восстанавливать состояние кнопки не потребуется конечно, WinHandle должен храниться на протяжении всей работы твоей программы параметр TRUE означает, что копия системного меню, которую ты создал будет уничтожена, а на его место будет установлено меню по-умолчанию пока ты этого не сделаешь, системное меню невозможно будет скопировать, т.е. ты как бы закрываешь дверь, на свой секретный код, и каждый раз этот код уникален, но не открываешь ее вновь после работы своей программы, чтобы ее можно было закрыть повторно это видимо просто механизм защиты от утечек ресурсов, который позволяет копировать меню только с оригинала Добавлено через 6 минут и 52 секунды да, кстати, не нужно вызывать GetSystemMenu всякий раз, когда тебе требуется дескриптор меню, у тебя должно быть только 2 вызова этой функции: в начале работы с меню и в конце, перед закрытием твоей программы |
| Автор: tusha 3.9.2009, 12:46 |
| гениально) поставил бы +1 но кол-во постов пока не позволяет.))) и главное что в описании EnableMenuItem нету хотя бы упоминания про этот прикол) иль я не внимательно смотрел) ЗЫ: век живи век учись у дураком помрешь |
| Автор: GremlinProg 3.9.2009, 13:19 | ||||
в EnableMenuItem упоминаний и не должно быть, в GetSystemMenu должно быть, но оно несколько смазано, в поддержке есть, только немного на другом примере: http://support.microsoft.com/kb/300688
Добавлено через 12 минут и 13 секунд хотя я поспешил, о защите тут не говорится, просто пишут, что мол при закрытии управляющего приложения, сис. меню не будет восстановлено, что может поставить пользователя в ступор: "как же его закрыть" |
| Автор: tusha 3.9.2009, 14:03 | ||
http://msdn.microsoft.com/en-us/library/ms647985%28VS.85%29.aspx |