Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск формы в позиции мыши 
:(
    Опции темы
Ivan.
  Дата 29.11.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Подскажите как сделать такую задачу:
Если кто нибудь видел когда нибуди программу Spyxxx - шпион, при наведении мыши на форму, кнопку и так далее, программа выдает всю API-шную информацию по данной компаненте (Class, Handle, Caption, ...).
Мне нужно примерно тоже самое - при наведении мыши на форму, Child перехватить его функцию WndProc? чтобы вставить туда свой обработчик. Естевственно при появлении события о закрытии окна обработчик бы вернул все на место как не в чем не бывало.
Еще, наверное забегая в перед хотел-бы спросить, а как отследить, что окно было убито (например программа зависла и с нее сняли задачу).
Второе, если я найду Handle формы - как получить указатель на WndProc и вообще можно ли изменять данные не в своей области памяти (чтобы подставить туда адрес своей функции)
И третье, не будет ли на такое ругаться антивирусник?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
anwe
Дата 29.11.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Первое.
Цитата
при наведении мыши на форму, кнопку и так далее, программа выдает всю API-шную информацию по данной компаненте (Class, Handle, Caption, ...).

Если хочешь делать это со всеми программами надо ставить глобальный хук. В нем (в длл-ке) основную нагрузку несет функция WindowFrompoint, возвращающая хэндл окна, находящегося в указанной координате экрана. 
Значит хэндл ты можешь передавать своей программе уже в чистом виде.
Далее. Для получения имени класса используй GetClassName. Для получения адреса оконной процедуры используй GetClassLong с флагом GCL_WNDРROC.

Второе.
Цитата
...перехватить его функцию WndProc? чтобы вставить туда свой обработчик.

Этот же хук решит тебе и вопрос вставки своего обработчика. Надо
ловить интересующее тебя сообщение от интресующего окна (контрола) и
обрабатывать либо с использованием хука типа "при вызове SendMessage" либо "при вызове GetMessage".
Альтернативный вариант: если надо обрабатывать для заранее известного типа
окна и таких окон не много можно использовать сабклассинг. В этом случае
основную нагрузку несет функция SetWindowLong с флагом GWL_WNDРROC, что
значит переопределение (переадресация) оконной процедуры. Только не забудь
сохранить старый адрес  smile и после выполнения новой передать управление старой.

Третье.
Цитата
как отследить, что окно было убито

Для отслеживания того убито ли окно опять поможет хук. Если перехватываешь сообщения и получаешь WM_DESTROY, адресованное твоему окну - то ему конец. Но это именно для окна.
Альтернативный вариант: если надо отследить не окно, а именно программу используй функцию GetExitCodeprocess. Она покажет активен ли еще интересующий тебя процесс или нет.

И последнее.
Цитата
не будет ли на такое ругаться антивирусник?

Антивирусник ругаться не будет. Не знаю, как часто и где именно винда использует сабклассинг, но установку хуков она использует сама во всю. Ругаться будет при попытке писать в память чужого процесса.
PM MAIL   Вверх
codelord
Дата 30.11.2006, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



вот тут есть тема а там есть исходники, в которых можно найти то, что ты спрашиваешь.
в основном там Api поэтому в Builder проблем быть не должно.
http://forum.vingrad.ru/topic-120020.html



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Ivan.
Дата 1.12.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Все оказалось элементарно просто спасибо.
вопрос следующий:
Таким образом я перехватил несколько WndProc на свою одну процедуру, как мне узнать, кому предназначено это сообщение, чтобы после обработки перенаправить его адресату?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
_hunter
Дата 1.12.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



все еще проще: первым параметром в оконную процедуру приходит HWND hwnd


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ivan.
Дата 2.12.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Блин, я дурак сижу рассматриваю:
Код

typedef void __fastcall (__closure *TWndMethod)(Messages::TMessage &Message);

и понять ничего не могу
ну а здесь все понятно:
Код

typedef LRESULT CALLBACK (*TWndProc)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 2.12.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Фигня какая то. Пишу:
Код

typedef LRESULT CALLBACK (*TWndProc)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
TWndProc OldWndProc;
OldWndProc = (TWndProc)GetClassLong(hwnd, GCL_WNDPROC);

Я получаю какоего странное число (не WndProc)
а если пишу:
Код

OldWndProc = (TWndProc)GetWindowLong(hwnd, GWL_WNDPROC);

то получаю нормальный WndProc, но только в нутки Application, в не его получаю NULL

Это сообщение отредактировал(а) Ivan. - 2.12.2006, 12:19


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 2.12.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Вопрос следующий (Надеюсь я еще не достал?):
Мне нужно пометить окно, на каторое я навел мышь рамкой по краю окна:
Код

HDC hDC = GetDC(hWnd);
SetPixel(hDC, x, y, Color);
...
ReleaseDC(hWnd, hDC);

Но это я рисую на клиентской области окна, а не на рамке, а как нарисовать на рамке?

Далее, я перешел на следующее окно - предыдущее окно мне нужно восстановить (перерисовать), как мне это сделать?

Далее, как узнать, что это Form или Child или чтото иное/ Мой вариант:
Взять от текущего hWnd Parent (GetParent(hWnd)) если Parent == NULL - значит это форма (ну или чтото типа ее). Если там MDIClient - значит это Child. Все остальное ИНОЕ, что мне и надо отсеить.
     Правильно?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 5.12.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Чтото все молчат.
Ну подскажите  smile 


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
anwe
Дата 5.12.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Цитата(Ivan. @  2.12.2006,  12:05 Найти цитируемый пост)
 как нарисовать на рамке?

Копай в сторону GetWindowDC, которая позволяет определить контекст для всего окна, с заголовком, рамками... и WM_NCPAINT. Только указанная функция работает с родителями.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.