![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| tusha |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
необходимо запретить юзеру закрывать программу путем нажатия на крестик (варианты alt+f4, taskmanager можно не учитывать) . както давно надыбал на Винграде тему где описывается создание простейшего клавиатурного шпиона через хуки. во тчто слепил. прошу не пинать сильно (все мы когдато учились
DLL
MAIN
=) вот что вышло. вобщем нифига не получается., блокнот как закрывался так и закрывается, никаких изменений. меня смущают 1 и 3 параметры SetWindowsHookEx - правильный ли я ставлю фильтр? и как подвязать фильтр к конктретной программе? - в данном случае Notepad натолкните на правильную мысль буду благодарен за советы) |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
при WM_CLOSE
return 0; Добавлено через 1 минуту и 4 секунды найди нужное место в целевой проге и пропатчи его |
|||
|
||||
| tusha |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
не, чет не получается....
при данном коде, даже хук не получаетсяя поставить. -
всегда NULL если сделать так:
хук типа ставится.. - но не понятно куда))) отработка же
мож фильтр не правильный? |
||||||
|
|||||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
Зачем хуки? -------------------- ![]() |
|||
|
||||
| tusha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
хм, прикол в том, что из моей проги мне надо контролировать стороннее приложение (notepad, mspaint к примеру). или я чтото не до конца понимаю.... в каком контексте надо юзать
???????? |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
tusha, найди в целевой проге место где она обрабатывает сообщения, и при WM_CLOSE возвращай 0
|
|||
|
||||
| tusha |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
у меня нету исходников проги. только exe)
Добавлено через 6 минут и 47 секунд вот что получилось на данный момент: хук устанавливаю так:
обработка сообщений:
при закрытии блокнота АХТУНГ показыватеся )))) НО блокнот таки закрывается. + аналоггичный мессадж показывается на закрытие всех приложений (получился такой себе глобальный хук) |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
tusha, реверсируй этот .ехе - получишь "исходники"
для этого можно использовать отладчик, например OllyDbg |
|||
|
||||
| tusha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
гм... мож я не совсем правильно обрисовал задачу (или я не понимаю что до меня хотят донести =) )..
есть прога - не моя, исходников нету, менять ее НЕЛЬЗЯ (лицензия) - которая получает данные с датчиков в режиме онлайн. юзеры иногда вместо того, чтоб свернуть , попадают по крестику - тем самым прерывая получение данных. я же должен перехватывать закрытие - возможно даже не выводя никакого месседжа - тоесть ччтоб юзер клацал по крестику и нифига не происходило. вот. получить ассемблерный код впринципе можно, а смысл? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
с первым параметром проблем нет, но вот третий - да
HINSTANCE != HWND при всем желании
только твой хук будет срабатывать во всех окнах заданного потока, если в PreventClose не проверять дескриптор -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
на самом деле, задача решается так:
со стилями надо экспериментировать |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, со стилями надо экспериментировать, только что, по твоему твой код делает?
Добавлено через 4 минуты и 57 секунд ты просто выключаешь все стили окна, причем закрыть его по прежнему можно: Alt+F4 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
||||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
во первых, убирает не только крестик со строкой заголовка, а все стили, во вторых, очевидно, это не то решение, которое требуется -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
решение с заменой стиля - именно то которое требуется
надо посмотреть родной стиль окна (например spy++) и изменить его так, чтобы крестик пропал\заблокировался Добавлено через 5 минут и 46 секунд вот полностью доделанное решение
убирает все кнопки из строки заголовка, сохраняя все остальные стили (строка заголовка остается) |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
GoldFinch, внимательно перечитай:
и скажи: 1. будет ли включен флаг b, если выполняется условие !a && b 2. будет ли включен флаг b, если выполняется условие !(a || b) все просто до безобразия: b - это кнопка сворачивания, а - это кнопка закрытия скрывая панель, ты тем самым скрываешь все кнопки, включая b, которой люди пользуются, WS_SYSMENU работает аналогично, зачем мутить воду-то, непонимаю -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
Модератор: Сообщение скрыто. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
GoldFinch, на будущее: еще хоть раз увижу подобные наезды на участников, будешь потешаться в одиночестве, и за пределами форума
опять же повторюсь, я не придираюсь к твоим советам, я просто предвосхищаю заблуждения участников, в которые ты их вводишь осознанно, и все надеюсь, что когда-нибудь совесть в тебе проснется и ты перестанешь давать советы мимо темы "иногда лучше молчать..."© -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
Вот полное решение ИМХО.
Добавлено через 4 минуты и 25 секунд Хотя, хз как будет работать между процессами Это сообщение отредактировал(а) Cheloveck - 17.8.2009, 17:20 -------------------- ![]() |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
эт точно, субклассинг логичен, но для чужого процесса не подойдет -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
никак не будет.
tusha, во-первых сообщения могут доставляться окну не только через очередь сообщений, но и посредством прямого или опосредованного вызова оконной процедуры - хук WH_GETMESSAGE соответственно в этом случае не срабатывает. такая доставка перехватывается хуками WH_CALLWNDPROC/WH_CALLWNDPROCRET, но изменять сообщение в этих хуках нельзя. во-вторых, и это основное - в своем обработчике хука ты не делаешь ничего для отмены сообщения. должно быть как-то так:
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
да, проверил, моя не работать((
-------------------- ![]() |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Может, попробовать просто задизэблить крестик?
Хоть речь о меню, но вроде бы та же команда активирует и крестик. Вроде нет ту ничего такого, что между процессами работать не будет... Разве что если целевое приложение само постоянно активирует системные команды в холостом цикле. -------------------- ... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, Earnest, как раз то что tusha и требовалось:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| tusha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
прикольно, спасибо за совет. однако хотелось бы чтоб визуально окно оставалось без измененийй , в данном случае у него дизеблится крестик. про WM_NULL додул раньше, однако как сказал тов. dumb для данного фильтра (WH_CALLWNDPROC) это отказывалось работать. будем пробовать дальше, если ниче не выйдет, то придется дизейблить крестик ))) |
|||
|
||||
| tusha |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
вобщем наткнулся на такой бок(?)
(из предыдущих моих тем) запускаю следующий код:
ситуация следующая: первый раз, когда блокнот висит на экране и запускается приложение - крестик стает сереньким - все как надо. на кнопку с кодом
реагурует отлично -------------------------------------------------- потом закрываем программу (блокнот остается с ЗАБЛОКИРОВАННЫМ крестиком) и запускаем ее снова - пробуем разблокировать крестик - ничего не получается.... в ситуации когда прогу закрываю, но крестик окна блокнота MF_ENABLED - все работает отлично ктонибудь сталкивался с таким? есть идеи? Добавлено через 4 минуты и 43 секунды еще одно маленькое уточнение - хендл окна я получаю, но рядом со значением в скобках стоит unused ???? |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
перед закрытием своей программы, просто вывзови:
тогда и восстанавливать состояние кнопки не потребуется конечно, WinHandle должен храниться на протяжении всей работы твоей программы параметр TRUE означает, что копия системного меню, которую ты создал будет уничтожена, а на его место будет установлено меню по-умолчанию пока ты этого не сделаешь, системное меню невозможно будет скопировать, т.е. ты как бы закрываешь дверь, на свой секретный код, и каждый раз этот код уникален, но не открываешь ее вновь после работы своей программы, чтобы ее можно было закрыть повторно это видимо просто механизм защиты от утечек ресурсов, который позволяет копировать меню только с оригинала Добавлено через 6 минут и 52 секунды да, кстати, не нужно вызывать GetSystemMenu всякий раз, когда тебе требуется дескриптор меню, у тебя должно быть только 2 вызова этой функции: в начале работы с меню и в конце, перед закрытием твоей программы -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| tusha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
гениально)
поставил бы +1 но кол-во постов пока не позволяет.))) и главное что в описании EnableMenuItem нету хотя бы упоминания про этот прикол) иль я не внимательно смотрел) ЗЫ: век живи век учись у дураком помрешь |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
в EnableMenuItem упоминаний и не должно быть, в GetSystemMenu должно быть, но оно несколько смазано, в поддержке есть, только немного на другом примере: http://support.microsoft.com/kb/300688
Добавлено через 12 минут и 13 секунд хотя я поспешил, о защите тут не говорится, просто пишут, что мол при закрытии управляющего приложения, сис. меню не будет восстановлено, что может поставить пользователя в ступор: "как же его закрыть" -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| tusha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
http://msdn.microsoft.com/en-us/library/ms...28VS.85%29.aspx |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |