| 
| 
 | Вопрос # 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. Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |