![]() |
|
|
![]()
|
|
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: нет Всего: 2 |
Подскажите как сделать такую задачу:
Если кто нибудь видел когда нибуди программу Spyxxx - шпион, при наведении мыши на форму, кнопку и так далее, программа выдает всю API-шную информацию по данной компаненте (Class, Handle, Caption, ...). Мне нужно примерно тоже самое - при наведении мыши на форму, Child перехватить его функцию WndProc? чтобы вставить туда свой обработчик. Естевственно при появлении события о закрытии окна обработчик бы вернул все на место как не в чем не бывало. Еще, наверное забегая в перед хотел-бы спросить, а как отследить, что окно было убито (например программа зависла и с нее сняли задачу). Второе, если я найду Handle формы - как получить указатель на WndProc и вообще можно ли изменять данные не в своей области памяти (чтобы подставить туда адрес своей функции) И третье, не будет ли на такое ругаться антивирусник? -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| anwe |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: нет Всего: 23 |
Первое.
Если хочешь делать это со всеми программами надо ставить глобальный хук. В нем (в длл-ке) основную нагрузку несет функция WindowFrompoint, возвращающая хэндл окна, находящегося в указанной координате экрана. Значит хэндл ты можешь передавать своей программе уже в чистом виде. Далее. Для получения имени класса используй GetClassName. Для получения адреса оконной процедуры используй GetClassLong с флагом GCL_WNDРROC. Второе.
Этот же хук решит тебе и вопрос вставки своего обработчика. Надо ловить интересующее тебя сообщение от интресующего окна (контрола) и обрабатывать либо с использованием хука типа "при вызове SendMessage" либо "при вызове GetMessage". Альтернативный вариант: если надо обрабатывать для заранее известного типа окна и таких окон не много можно использовать сабклассинг. В этом случае основную нагрузку несет функция SetWindowLong с флагом GWL_WNDРROC, что значит переопределение (переадресация) оконной процедуры. Только не забудь сохранить старый адрес Третье.
Для отслеживания того убито ли окно опять поможет хук. Если перехватываешь сообщения и получаешь WM_DESTROY, адресованное твоему окну - то ему конец. Но это именно для окна. Альтернативный вариант: если надо отследить не окно, а именно программу используй функцию GetExitCodeprocess. Она покажет активен ли еще интересующий тебя процесс или нет. И последнее.
Антивирусник ругаться не будет. Не знаю, как часто и где именно винда использует сабклассинг, но установку хуков она использует сама во всю. Ругаться будет при попытке писать в память чужого процесса. |
||||||||
|
|||||||||
| codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
вот тут есть тема а там есть исходники, в которых можно найти то, что ты спрашиваешь.
в основном там Api поэтому в Builder проблем быть не должно. http://forum.vingrad.ru/topic-120020.html |
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: нет Всего: 2 |
Все оказалось элементарно просто спасибо.
вопрос следующий: Таким образом я перехватил несколько WndProc на свою одну процедуру, как мне узнать, кому предназначено это сообщение, чтобы после обработки перенаправить его адресату? -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
все еще проще: первым параметром в оконную процедуру приходит HWND hwnd
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Ivan. |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: нет Всего: 2 |
Блин, я дурак сижу рассматриваю:
и понять ничего не могу ну а здесь все понятно:
-------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
||||
|
|||||
| Ivan. |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: нет Всего: 2 |
Фигня какая то. Пишу:
Я получаю какоего странное число (не WndProc) а если пишу:
то получаю нормальный WndProc, но только в нутки Application, в не его получаю NULL Это сообщение отредактировал(а) Ivan. - 2.12.2006, 12:19 -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
||||
|
|||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: нет Всего: 2 |
Вопрос следующий (Надеюсь я еще не достал?):
Мне нужно пометить окно, на каторое я навел мышь рамкой по краю окна:
Но это я рисую на клиентской области окна, а не на рамке, а как нарисовать на рамке? Далее, я перешел на следующее окно - предыдущее окно мне нужно восстановить (перерисовать), как мне это сделать? Далее, как узнать, что это Form или Child или чтото иное/ Мой вариант: Взять от текущего hWnd Parent (GetParent(hWnd)) если Parent == NULL - значит это форма (ну или чтото типа ее). Если там MDIClient - значит это Child. Все остальное ИНОЕ, что мне и надо отсеить. Правильно? -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: нет Всего: 2 |
Чтото все молчат.
Ну подскажите -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: нет Всего: 23 |
||||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |