![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Felan |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Есть небольшая оконная утилита, с простой формой и несколькими диалоговыми, написана предположительно на C++.
Мне нежно сделать консольную утилиту, которая бы управляла ей. Т.е. запускала, устанавливала нужные параметры и запускала нужные методы. Ну вобщем жать на кнопки и заполнять идиты. Запустить, найти окна, заполнить идиты, нажимать кнопки оказалось не проблемой. Проблемой оказалось получать ответы, т.к. эта утилита ответы свои выводит MessageBox-ами. Хочу сделать так: Поставить хук на создание окон. Проверять, принадлежит ли окно заданному процессу, по содержимому опредлить, что получилось. Почитал про хуки и пр. В итоге почти постоянно получаю AV при создании окон утилитой. Но иногда проходит нормально... но очень редко. Длл с процедурой хука выглядит так:
В управляющий утилите часть относящаяся к вопросу выглядит так: Это функция которая ищит и заполняет окна целевой утилиты. Жмет на кнопку и выполняет цикл выборки сообщений, для получения данных от длл.
Так выглядит класс создающий окно, которое должно принимать сообщения:
Самая большая проблема, что все это нельзя запустить под отладчиком, т.к. на точке останова виснет GUI всей системы (длл тормозит все процессы в которых происходит создание окна, а создаются они постоянно, хоть бы даже "подсказки"). PostMessage тоже использовать нельзя, т.к. при WM_COPYDATA данные будут потеряны... В лог попадают данные типа
Т.е. сам механизм вроде работает. Вобщем, может кто может подсказать куда копать. Или может как-то по другому все это можно реализовать? ЗЫЖ Кажется мне, что я что-то не так делаю в районе передачи данных между процессами... :( И еще, почему-то текст окон всегда пустой... вроде он есть... если это те окна. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||||
|
|||||||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Если нужно только это, я бы сделал проще (имхо) через FindWindow и FindWindowEx. Добавлено через 3 минуты и 19 секунд Гляньте примеры: |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Если нужно - могу дать свой код обмена хук>приложение через MMF.
тоже недавно мучился с этим вопросом, благодаря помощи участников форума все решилось. Кстати, MMF не имеет неприятной особенности, которая появилась у обмена сообщениями (Post|Send[Thread]Message) в Vista - разграничение по правам процессов. Это сообщение отредактировал(а) kami - 22.6.2009, 01:28 |
|||
|
||||
| Felan |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Только с этим проблем нет. Т.е. запустить нужный экзешник, заполнить его контролы и понажимать кнопки проблем не вызывает. Хотя и не через FindWindow делал а через EnumThreadWindows/EnumChildWindows. Я вроде нашел косяки в функции хука. По крайней мере теперь все это работает. Сейчас проблема в том, что это нельзя отладить, т.к. хук вешает весь GUI. И еще, не удается получить текст создаваемого окна... это мне необходимо, что бы получить результат выполнения операции. Походу собака порылась в том, что окна на момент выполнения хука еще нет, и соответсвенно нельзя получить его текст.
Вот думаю, как все это через HCBT_ACTIVATE как-то надо получать текст... Хочу сделать таблицу хэндлов созданных окон, и при их активации уже слать WM_COPYDATA... только проблема в том, что нужное окно может никогда не активироваться... Если например в неподходящий момент пользователь кликнет на другое окно... Еще чет не пойму, можно ли этот хук поставить локально на процесс, а не на всю систему?
Да не, спасибо Я примеры и так видел. Сознательно от MMF отказался, т.к. надо будет делать очередь структур с данными об создаваемых окнах... синхронизировать ее... В общем из пушки по воробьям.
Хм... ну это не важно. Под висту наша система все равно работать не будет в принципе... Почему-то начальство решило, что это никому не нужно. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||||
|
|||||||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Вобщем заборол. Все работает как надо.
Косяк был в том, что слушающее окно создавалось в секции инициализации общего модуля с программой и с длл. Получалось, что оно перекрывало нужное окно и обработчик был в другом процессе... Спасибо все участвующим Тема закрыта. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |