|
Вопрос # 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:43 [#8]:
То есть грубо говоря, хотелось бы уметь строить такое дерево?
P.S. Некрасиво ховать программы всё равно видно чем занимаетесь )
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 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.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|