Что нового

[Элементы GUI] Правила работы с нестандартными контролами

anton.kolokolcev

Новичок
Сообщения
4
Репутация
0
Стоит задача тыкать по контролам в приложении из аттача.
Ни AutoIt 3 Window Info, ни WinID, ни Control Viewer, ни Spy++ не дают никакой информации о контроле, только о контейнере menuStrip и toolStrip целиком (впрочем, они не дают никакой информации и о Тулбарах Excel 2007, но для экселя есть отдельные COM объекты, с которыми можно гораздо эффективнее работать).
Пролема не нова, но наверняка существует какое-нибудь пусть и сложное, но существующее решение.
За последние два дня я перепробовал все варианты запросов в гугле, но ничего дельного так и не нашел. Распознавание текста через OCR, определение цвета пикселей, клики относительно левого верхнего угла при неизменном разрешении экрана и прочая ботва порядочного человека, конечно, не устраивают.
Есть ли какая-нибудь надежда управлять этими контролами без мышки? Может быть, через COM объекты или еще как-нибудь?
Горячих клавиш для нужных кнопок нету, ТАБом к ним тоже не подступиться, Тултипы не распознаются.
Может быть есть какая-то стандартная последовательность действий, с чего стоит начать, типа
1) Попробовать Window Info
2) Если не помогло 1), попробовать горячие клавиши и перемещение через ТАБ
3) Если не помогло 2), попробовать найти инфу о соответствующих COM-объектах...
и т.д.
Если нет решения проблемы, то скажите, что его нет и быть не может, и тогда я прекращу поиски и буду искать альтернативные пути.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
anton.kolokolcev
Тоже бы хотелось узнать как с этими WPF общаться. И да скриншот лучше на radikal залить, на форуме не открывается картинка
 
Автор
A

anton.kolokolcev

Новичок
Сообщения
4
Репутация
0
e260badb10e7.png

Картинка не хочет вставляться в исходный пост - пишет Wrong data type в attachment_list, поэтому вставил сюда.
Несколько дополнений по ходу моих изысканий:
- Верхнее меню (которое на самом деле мне не нужно) реагирует на кнопку Альт, и даже рисует подчеркивания. Но увы доступа к кнопкам из Тулбара в этом меню нет.
- Убогий способ: взять хэндл от тулБара, посчитать его высоту, принять ширину иконки тулБара равной высоте самого Тулбара, отсчитать нужное количество иконок и кликнуть на кнопке DSP.
- В Spy++ можно отследить какие Виндоус Сообщения шлются при наведении на контрол, клике и тд. Можно попытаться сэмулировать все эти действия без участия мыщки, но, опять же, нужны какие-то координаты места эмуляции... не понял пока, как применить
- В Windows Detective при наведении на кнопку тулБара пишется вот такой лог
WindowManager::addWindow - Cannot find parent for window: WindowsForms10.Window.0.app.0.378734a (0x0004065C)
Window WindowsForms10.Window.0.app.0.378734a (0x0004065C) created.
Window WindowsForms10.Window.0.app.0.378734a (0x0004065C) destroyed.
И если возюкать мышкой на кнопку и от нее, хэндл в скобках постоянно меняется.
Может быть, стоит рыть в эту сторону, но пока нет четкого понимания, как использовать всю эту информацию :(
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
anton.kolokolcev

http://www.autoitscript.com/forum/topic/153520-iuiautomation-ms-framework-automate-chrome-ff-ie/#entry1105530
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
MnM

Приложение на скриншоте написано на WinForms, что касается WPF, то из Википедии

Графической технологией, лежащей в основе WPF, является DirectX, в отличие от Windows Forms, где используется GDI/GDI+[4]. Производительность WPF выше, чем у GDI+ за счёт использования аппаратного ускорения графики через DirectX.

Т.е. графический интерфейс построенный с помощью технологии Windows Presentation Foundation, просто рисуется в клиентской части окна, по этому не возможно узнать ни handle ни class и т.д., поправьте если ошибаюсь.

Если кто захочет, попробуйте определить handle контрола в приложении на WPF
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
anton.kolokolcev,
Если определяется Toolbar (toolStrip), то попробуйте прочитать текст примерно так.
Код:
#include <GuiToolBar.au3>

$hToolBar = ControlGetHandle('Title', '', '[CLASS:ToolbarWindow32; INSTANCE:1]');поменяйте на свои данные
If Not $hToolBar Then Exit 1
$iCount = _GUICtrlToolbar_ButtonCount($hToolBar)
If Not $iCount Then Exit 2
For $i = 0 To $iCount - 1
	$iID = _GUICtrlToolbar_IndexToCommand($hToolBar, $i)
	$sText = _GUICtrlToolbar_GetButtonText($hToolBar, $iID)
	ConsoleWrite('Index: ' & $i & ' ID: ' & $iID & ' Text: ' & $sText & @LF)
Next
 
Автор
A

anton.kolokolcev

Новичок
Сообщения
4
Репутация
0
WSWR
Огромное спасибо! :laugh:
Насколько я смог понять из пары часов лазанья по всевозможным ссылкам, ведущим от этого поста, АвтоИт использует библиотеку Windows Automation API, представленную в АвтоИте через UIAutomationCore.dll как COM объект.
Describes the Windows APIs that developers can use to make applications running on Windows more accessible to many people with vision, hearing, or motion disabilities. The APIs includes Microsoft Microsoft UI Automation and its predecessor technology, Microsoft Active Accessibility. In addition to accessibility support, UI Automation provides robust support for automated software testing scripts and tools.
Accessibility позволяет разпознавать все что угодно (чтобы, например, преобразовывать текст кнопок в речь для слепых).
Странно, что эта библиотека до сих пор не просунута в сам АвтоИт.

P.S. Поправьте, если я что-то неправильно понял, или, если знаете, подскажите порядок вызовов соответсвующих модулей/библиотек (чисто условно), как если бы нужно было написать всё это с нуля.
Я бы этот пост по ссылке засунул в ФАК или что-то подобное, потому что это мега полезная штука.


Добавлено:
Сообщение автоматически объединено:

madmasles
Я так понимаю, это сработало бы, если кнопки распознавались в Info Tool.
А так на этапе подсчета кнопок всегда возвращается 0 :(
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
anton.kolokolcev [?]
P.S. Поправьте, если я что-то неправильно понял, или, если знаете, подскажите порядок вызовов соответсвующих модулей/библиотек (чисто условно), как если бы нужно было написать всё это с нуля.
Сперва нужно выяснить поддерживает ли ваш контрол работу с UIAutomation.
Вам понадобится утилита Inspect
 
Автор
A

anton.kolokolcev

Новичок
Сообщения
4
Репутация
0
inververs
Я проверил - работает. Осталось только справку найти, какие функции можно использовать из этого UIAutomation враппера.

Если кому интересно, вот тут примерный порядок работы с библиотекой
http://msdn.microsoft.com/en-us/library/windows/desktop/ff625909(v=vs.85).aspx
Если внимательно разбирать примеры по ссылке WSWR, то становится понятно как работать с написанным чуваком враппером. Правда под конец поста они начинают жестить, пример для навигаии по проводнику с event handler разбираю уже полдня.
 
Верх