Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 153

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Доброе время суток и здравия.

Помогите, пожалуста, кусочком кода, так как в теории закопался аж мозг пухнет, но ничего не выходит.

Ситуация следующая - Известно имя чужого основного окна. InqSoft Window Scanner выдает имена классов дочерних окошек. В этом чужом окне есть несколько связок на разных уровнях дочерности - WFC.Window.8 имеет внутри WFC.Static(Статик) и WFC.Edit (Едит).
Как по определенным Статикам получить в свою программу текст в связанных с ними Едитах?
Или проще прошерстить все WFC.Edit по трем-пяти начальным знакам его текста (всегда одни и те же)? как это оформить кодом?

Заранее большое спасибо.

Ястреб Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ястреб (статус: Посетитель)
Вопрос отправлен: 4 сентября 2009, 11:27
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 18; последнее сообщение — 7 сентября 2009, 12:44; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 4 сентября 2009, 11:39 [#1]:

А может проще будет взять все Static и все Edit и сравнить координаты?
Проблемы в том, что бы считать текст с заведомо известного Edit нет?
Галочка "подтверждения прочтения" - вселенское зло.
Ястреб

Ястреб (статус: Посетитель), 4 сентября 2009, 12:03 [#2]:

Известных. Они на одних и тех же местах на форме. Но у них разная вложенность по дочерности.
А если что-то изменится в отображении (разрешение экрана и т.п.), то первоначальная проверка координат уже не пойдет?
У интересуемых едитов первые 3-5 символов известные.

ЗЫ Можно, пожалуйста, если не сложно, кусочек кода по поиску едита в известном окне или перебору всех едитов в окне и взятия в строковую переменную его текста для сравнения с заданным.
Вадим К

Вадим К (статус: Академик), 4 сентября 2009, 12:30 [#3]:

Скорее всего не пройдет. Если известны static и их можно найти, то можно составить список едитов и сравнить.
А перебрать - можно и рекурсией. Код написать... ну разве что когда буду дома.
Галочка "подтверждения прочтения" - вселенское зло.
Ястреб

Ястреб (статус: Посетитель), 4 сентября 2009, 14:09 [#4]:

буду очень признателен.
Вадим К

Вадим К (статус: Академик), 4 сентября 2009, 14:12 [#5]:

Вот только с кодом, не умеем рекурсивно пробежать по элементам?
Галочка "подтверждения прочтения" - вселенское зло.
Ястреб

Ястреб (статус: Посетитель), 4 сентября 2009, 14:41 [#6]:

сильно плаваю в hwnd и указателях,отсюда не дается FindWindowEx :(
Ястреб

Ястреб (статус: Посетитель), 4 сентября 2009, 15:27 [#7]:

http://pic.ipicture.ru/uploads/090904/xWW41HIfdS.jpg

Очень хочется добраться до данных подчеркнутых едитов. Самое верхнее подчеркивание - основное окно.
Вадим К

Вадим К (статус: Академик), 4 сентября 2009, 15:43 [#8]:

То есть грубо говоря, хотелось бы уметь строить такое дерево?
P.S. Некрасиво ховать программы:) всё равно видно чем занимаетесь:))
Галочка "подтверждения прочтения" - вселенское зло.
Ястреб

Ястреб (статус: Посетитель), 4 сентября 2009, 15:54 [#9]:

Ну совсем такое дерево мне не надо. Просто данные взять и в другую веб-форму засунуть, а то копи-паст порядком поднадоел. :)
схованные строчки - не программа, а технические данные, которые не мои. :) вот их и надо скопипастить.
Паровоз

Паровоз (статус: 10-ый класс), 4 сентября 2009, 22:30 [#10]:

Цитата:

кусочек кода по поиску едита


Давайте прикинем как найти первый Edit. Наверно, можно предположить, что z-порядок окон до пары (Static,Edit) в программе не меняется. Тогда можно перебрать дочерние элементы просто по счету:
wnd1:=FindWindow(ClassName,WindowName);//Окно программы
wnd2:=FindWindowEx(wnd1,0,nil,nil);
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);
wnd1:=FindWindowEx(wnd1,wnd2,nil,nil);//6 дочерний элемент
Теперь в wnd1 дескриптор раскрытого дочернего узла. Далее действуем аналогично:
wnd2:=FindWindowEx(wnd1,0,nil,nil);//scrollbar
wnd1:=FindWindowEx(wnd1,wnd2,nil,nil);//Window.8
Спускаемся дальше по раскрытым веткам:
wnd1:=FindWindowEx(wnd1,0,nil,nil);//Window.8
wnd1:=FindWindowEx(wnd1,0,nil,nil);//Window.8
Сейчас wnd1 содержит дескриптор окна с двумя дочерними элементами Static и Edit. Здесь предполагать, что z-порядок сохраняется уже нальзя. Поэтому класс нужно указывать явно:
wnd1:=FindWindowEx(wnd1,0,'WFC.EDIT',nil);
Теперь wnd1 содержит нужный дескриптор.
Ястреб

Ястреб (статус: Посетитель), 7 сентября 2009, 09:01 [#11]:

То есть до 2го подчеркивания мне добираться так -
6й дочерний элемент так же
wnd2:=FindWindowEx(wnd1,0,nil,nil);//scrollbar
wnd1:=FindWindowEx(wnd1,wnd2,nil,nil);//Window.8
wnd2:=FindWindowEx(wnd1,0,nil,nil);//Window.8 ID
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);//Window.8 Статус
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);//Button
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);//Button
wnd2:=FindWindowEx(wnd1,wnd2,nil,nil);//Button Назначение
wnd1:=FindWindowEx(wnd1,wnd2,nil,nil);//Button
wnd2:=FindWindowEx(wnd1,0,nil,nil);// Window.8 Товар
wnd1:=FindWindowEx(wnd1,wnd2,nil,nil);//Window.8 Товар Инфо
wnd2:=FindWindowEx(wnd1,0,'WFC.EDIT',nil);// искомый едит ?

а взять\дать им инфу - SendMessage(wnd2,wm_gettext, ... а вот с дальнейшими параметрами у меня каша :( Какие параметры надо подсунуть, чтобы 20 знаков текста едита перетащилось в MyString?
Ястреб

Ястреб (статус: Посетитель), 7 сентября 2009, 11:43 [#12]:

вроде с sendmessage разобрался. из первого едита получаю инфу.
И в моей попытке пути пропустил одно колено перед window8 ID.
Теперь получается из чужих окон текст тырить :).

Огромное спасибо уважаемым гуру.
Вадим К

Вадим К (статус: Академик), 7 сентября 2009, 11:58 [#13]:

Сразу предупрежу, что с edit'ов можно тексты воровать,а вот с ListView так просто не получиться. Просто сразу предупреждаю, что бы не мучились.
Там все делается гораздо "изысканее". Приложение нужно "остановить", выделить в его адресном пространстве чучуть памяти, запросить данные с ListView и прочитать. вся фишка в том, что надо читать с памяти другого процесса.
Галочка "подтверждения прочтения" - вселенское зло.
Ястреб

Ястреб (статус: Посетитель), 7 сентября 2009, 12:13 [#14]:

А с ComboBox? читать\писать так же как с\в едиты?
или писать в него сложнее?
Вадим К

Вадим К (статус: Академик), 7 сентября 2009, 12:17 [#15]:

надо посмотреть, как выглядит ComboBox. это симбиоз Edit+button+дополнения. В таком случае текст получиться прочитать точно, главное правильно найти "что читать".
Галочка "подтверждения прочтения" - вселенское зло.
Ястреб

Ястреб (статус: Посетитель), 7 сентября 2009, 12:36 [#16]:

а чем можно это посмотреть? window scanner просто говорит о нем - combobox. Буду выяснять опытным путём, после того как натренируюсь искать элементы. А то что-то много сразу захотел :)
Спасибо за науку.

ЗЫ а как-нить уничтожить вопрос можно, как отвеченный и неинтересный другим? или оставить?
Вадим К

Вадим К (статус: Академик), 7 сентября 2009, 12:43 [#17]:

Удалить вопрос можем (просить Администратора или меня) - например случайно запощенный, но если в нем есть ответы, то обычно лучше его оставить, может кто то найдет что то полезное в нем.
В некоторых случаях бывает просто надо поправить пару слов в тексте вопроса (орфография, к примеру).
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 7 сентября 2009, 12:44 [#18]:

Для просмотра "чужих окон", я обычно использую Spy++ с комплекта Visual Studio.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:28
Выполнено за 0.03 сек.