Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > чужое приложение WindowsForms10.Window.8.app |
Автор: bikovrm 1.5.2018, 20:19 | ||
Пожалуйста помогите!!! ![]() У меня есть стороннее приложение WindowsForms10 (рис 1), и мне нужно получить доступ к данным в виде сетки этого приложения (прочитать) из моего приложения созданного в Delphi. При использовании программы Spy ++ она не видит этих элементов (рис 2). Но программа Ranorex Spy видит все необходимые поля и четает данные (рис 3 и 4). При рекурсивном переборе всех елементов с использованием FindWindow, FindWindowEx, EnumChildWindows и EnumChildFunc дает мне доступ только к главному окну, но не видит содержимое контейнера. h := FindWindow(NIL,'HK1400 EUI/EUP'); if h <> 0 then begin EnumChildWindows(h, @EnumChildFunc, 0); ... function EnumChildFunc(Child: HWND; lParam : Longint) : BOOL; stdcall; var szClass : array[0..63] of Char; s : array[Byte] of Char; begin GetClassName(Child, szClass, SizeOf(szClass)); ... End; Так же на сайте разработчика программы Ranorex Spy нашол код (для их среды програмирования) для получения доступа к таблице: https://www.ranorex.com/blog/element-based-automation-for-3rd-party-infragistcs-controls/
Пожалуйста, помогите получить доступ к таблице (содержащему данные сетки) и навигации по ней. Желательно с реализацией в Delphi. ![]() ![]() ![]() ![]() |
Автор: bems 2.5.2018, 00:51 |
а софтину где скачать? и запустится ли она без железки? |
Автор: bikovrm 3.5.2018, 09:28 |
без железа запустится, а скачать можно : https://drive.google.com/open?id=1ykLp9maQmYMK3dWBDoEBhVtu5tWSEldV использование в доке |
Автор: bems 5.5.2018, 05:43 | ||
вот чтение грида, кнопки я никакие не нажимаю, так что для проверки кода форму сначала нужно привести в правильное состояние вручную
|
Автор: bikovrm 5.5.2018, 10:27 |
это в RAD Studio? Какую версию вы использовали? |
Автор: bems 5.5.2018, 12:26 |
10.2 |
Автор: bikovrm 6.5.2018, 13:03 |
Спасибо. Переварил. Очень помогло. ![]() |
Автор: bikovrm 8.5.2018, 08:46 |
А с диаграммой разобраться не поможете? Нужно прочитать данные из первой колонки. Тут вообще не читается поле с данными, они являются частью диаграммы и в свойствах не описываются. И описание компонента TFlowDiagram вообще в нэте нет. На данный момент если не получится, думаю прейдётся искать в памяти и читать из неё. ![]() http://opensys.com.ua/wp-content/uploads/2018/03/ARMDiesel_UIS-TesterDUO_v8.2_2018-03-12.exe, http://opensys.com.ua/wp-content/uploads/2016/09/ARMDiesel_Update_v8.6_2018-04-13.exe ![]() |
Автор: bems 8.5.2018, 11:53 |
я не вижу тут лёгкого способа вычитать значение. можно было бы попробовать получить поинтер на компонент из HWND диаграмы и прочитать значение из компонента, но тут две проблемы: 1. если при обновлении прогриаммы поменяется структура компонента в памяти, то всё поломается 2. если при обновлении программы изменится версия делфей/билдера или целевая платформа билда, то всё снова поломается |
Автор: bikovrm 8.5.2018, 13:03 |
если поломается при обновлении, не чего страшного, можно будет поправить, главное как туда залезть и прочитать значение из компонента. И обновление не критично можно на него и забить. обновление в графике происходит с железа, но.. На закладке "расход ctrl+f4" можно самому в ручную менять значение в ячейке "см3:" |
Автор: bems 8.5.2018, 13:10 |
ну ок, попробую |
Автор: bems 9.5.2018, 13:25 | ||
как-то так. показывает значения для первой попавшейся диаграммы. это как раз та, которую можно редактировать вручную
|
Автор: bikovrm 9.5.2018, 16:47 |
Спасибо, вы просто ШАМАН. ![]() Я как раз закончил с чтением значения из памяти, но это гораздо лучше. Щас буду разбираться. |
Автор: bems 9.5.2018, 16:58 |
так и это чтение из памяти. если хочется избавиться от жестко забитого смещения поля в объекте, то можешь попытаться читать InitTable объекта в поисках динамического массива даблов. впрочем он наверное там не один, и номер массива тогда придется захардкодить ![]() |
Автор: bems 12.5.2018, 15:31 | ||
вот еще более короткий вариант не требующий CreateRemoteThread. при сокращении пала смертью храбрых проверка на разрядность целевого процесса, ну и черт с ней ![]()
|
Автор: bikovrm 13.5.2018, 20:40 |
Во первых: Спасибо. Вы, ну, ооооочень сильно помогли. Писал на форуме и не надеялся что ктото поможет. Во вторых, хотел узнать как я могу вас отблагодарить? И еще .. хочу разобраться полностью в вашем коде. Откуда вы взяли эти смещения, олькой вытягивали?: const ArrFieldOffset = 752; и oldvmtSelfPtr = -88; oldvmtClassName = -56; oldvmtInstanceSize = -52; ![]() А вообще, не хотел наглеть, но мне еще нужны данные из компонента TAngularMetter «ТАЙМЕР». Там сейчас значения "--s" и меняются уже при работе железа, отсчитывается время в обратном порядке. Думал заняться этим компонентом как то на досуге. |
Автор: bems 16.5.2018, 01:12 | ||
проверь на железе
|
Автор: bikovrm 19.5.2018, 15:37 |
Извиняюсь что сразу не ответил, срочно лепил программу в кучу и разбирался в Вашем коде. У меня просто слов нету, это шедевр, почти универсальный метод чтения подобных компонентов. Компонент TAngularMetter прочитался с первого раза. Порвали как тузик грелку. Я сомневаюсь что смог бы такое написать. Исчезла привязка к версии программы, все на поиске полей компонента. Я так понял что в FindWinControl(TopWnd.Wnd, AngularMetterClassName, 0), 0 - это порядковый номер компонента. ![]() Не понял с процедурой ReadBoolean, что она проверяет - FValueClear активность компонента TAngularMetter? Как Вы узнали с каких полей (FVolumeMeasured, FValueClear, FValuePos) читать, делали запись в память по адресу? Посоветуйте пож. что почитать, по поводу структуры (архитектуры) памяти, и вообще о том как Вы находите эти смещения. Потому что мои познания по работе с памятью сводится к отсеву на подобие артмани и разной мелочи. |
Автор: bems 19.5.2018, 19:09 | ||||||
среди published-свойств компонента я нашел свойство ValueVar: Variant у которого есть геттер и сеттер. с помощью Иды я заглянул в геттер и увидел что он обращается к двум полям. сначала проверяет равен ли байт нулю и если равен то делает что-то с другим полем, рассматривая его как Double. я записал смещения этих полей и получил имена с помощью процедуры DumpFields. и действительно одно оказалось Boolean а другое Double. Что касается FVolumeMeasured, то я тоже сначала получил смещение в отладчике/дизассемблере, но уже не помню как я на него натолкнулся тогда.
![]() |
Автор: bikovrm 3.9.2018, 20:52 |
... |
Автор: bikovrm 22.10.2018, 20:15 | ||
Пожалуйста, не могли бы Вы помочь мне ещё раз. Нужно прочитать TCategoryButtons, в котором количество строк может быть разным. ![]() Уже задолбался в нём ковыряться. ![]() https://drive.google.com/open?id=1cd97H1fDwADQQKCSGgBxJdnjqBKd01Iz В проге нужно "открыть тест-план F9", -> закладка "пользовательский тест-план" и открыть какой нибуть. В компоненте TCategoryButtons появится список тестов который и нужно прочитать. ------------------ Если читать Вашим методом, то можно получить список полей:
Кинув на форму компонент CategoryButtons1, посмотрел что поля нужно добавлять в "Categories -> (TButtonCategories)". В прочитанных выше полях это скорее всего "FButtonCategories : TButtonCategories @ 760". А дальше не могу найти смещение. Пробовал также найти эти поля через "указатели на указатели" (как в артмани или Cheat Engine), но именно в этом объекте некоторые строки через время все равно теряются, меняется смещение. Нашаманьте пож. ещё раз ![]() |
Автор: STest69 24.1.2020, 10:41 | ||
Здравствуйте. Так получилось что мое приложение состоит в основном из Label-ов и графика, подскажите как именно вы узнали смещение? |