Выгрузка данных из хитрого окна

laki

Народ подскажите пожалуйста.
Есть вот такое окно стороннего приложения.

Есть hwnd самого окошка и есть hwnd списка. Кто-нибудь может подсказать как можно программно получить эти данные.
заранее спасибо

evgen5555

Всё, что можно сделать, есть в Spy++

laki

а подробнее?

evgen5555

Открываешь студию, в меню Tools выбираешь Spy++, нажимаешь кнопку с иконкой бинокля, перетаскиваешь прицел на нужное окно и смотришь параметры.

maggi14

судя по картинке, Spy не поможет
хотя, возможно, у меня просто мало опыта
Открываешь Spy++, находишь нужный hWnd и смотришь доступные свойства. Часто (но далеко не всегда) тексты представлены как тайтл окошка, и их можно считать или записать с помощью, насколько я помню, SendMessage или PostMessage.

0000

Ну судя по картинке это расширенный WC_LISTVIEW со стилем LVS_REPORT + OWN_DRAW.
Ну и соответвенно можно попробовать получать текст через посылку соответсвующих сообщений/макросов как напр. ListView_GetItemText и ListView_GetItemCount.
Хотя это может только для своего LISTVIEW работает или еще че. Надо проверить как-нить на досуге.

SPARTAK3959

В крайнем случае можно через CreateRemoteThread подгрузить свою dll'ку и сделать это через нее. Могу дать готовый пример программы, осуществляющей внедрение.

0000

Гы-гы, напомнило извращения с форума на www.sources.ru по Delphi в разделе WinAPI - такое чувство там сделать могут что угодно

laki

посмотрел спаем идут одни WM_USER с какимито магическими цифрами например:

WM_USER + 1002 (0x000007ea)
wParam: 0x00000005
lParam: 0xffffffff
Message Sent
Time: 13:11:32.0715
WM_USER + 1002 Return value
Return: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 (0x000007ee)
wParam: 0x00003000
lParam: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 Return value
Return: 0x00003000
Message Sent
Time: 13:11:32.0715
WM_USER + 1002 (0x000007ea)
wParam: 0x00000004
lParam: 0xffffffff
Message Sent
Time: 13:11:32.0715
WM_USER + 1002 Return value
Return: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 (0x000007ee)
wParam: 0x00003000
lParam: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 Return value
Return: 0x00003000
Message Sent
Time: 13:11:32.0715
WM_USER + 1002 (0x000007ea)
wParam: 0x00000003
lParam: 0xffffffff
Message Sent
Time: 13:11:32.0715
WM_USER + 1002 Return value
Return: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 (0x000007ee)
wParam: 0x00003000
lParam: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 Return value
Return: 0x00003000
Message Sent
Time: 13:11:32.0715
WM_USER + 1002 (0x000007ea)
wParam: 0x00000002
lParam: 0xffffffff
Message Sent
Time: 13:11:32.0715
WM_USER + 1002 Return value
Return: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 (0x000007ee)
wParam: 0x00003000
lParam: 0x00000000
Message Sent
Time: 13:11:32.0715
WM_USER + 1006 Return value
Return: 0x00003000
Message Sent
Time: 13:11:32.0715

maggi14

свойства окна смотри, а не сообщения

laki

допустим dll injection я сделаю события перехвачу у этого окна как вообще осуществляется проставление этих цифр.
стандартные макросы не подходят это какой-то рукописный лист.

laki


Item Value
Class Name MultiList
Text
Rectangle 13, 92, 140, 488
Size 127, 396
Client Rectangle 0, 0, 127, 396
Client Size 127, 396
Styles WS_CHILD
WS_VISIBLE

StylesEx WS_EX_LEFT
WS_EX_LTRREADING
WS_EX_RIGHTSCROLLBAR

ID 0

Properties

Class specific Window is Ansi

maggi14

раз text пустой, то ничего посоветовать не могу. Это как раз то, что я упомянул выше:
судя по картинке, Spy не поможет
хотя, возможно, у меня просто мало опыта

0000

> стандартные макросы не подходят это какой-то рукописный лист.
Проверил - для окна чужого приложения макросы работают. Для рукописного листа, если он сделан поверх стандартного по идее тоже должно работать. Если же каждая строка это другой тип окна, то надо его определить - в TotalCommander панелька списока файлов например это TMyListBox - у которого элементы это обернутые TEdit судя по всему (то есть текст сдирается обычным посылом WM_GETTEXT).

bleyman

А их можно селектить? Если да, то напиши прогу, которая эмулирует нажатия разных кнопок и тырит цифирки из клипборда =)

evgen5555

LV_GETITEM всё-таки попробуй

vall

такие циферки и распознать недолго, если лень можно и шрифт заменить на самопал легко распознающийся.

laki

пробовал не фига

Dasar

по виду - похоже на owner draw, соответственно в лоб текст получить не удастся.
обходные решения:
1. распознать
2. перехватить функцию DrawText (или как она там)
3. попробовать заставить его вывести в какой-нибудь метафайл

maggi14

а это не джававское окошко?

laki

нет это не джавовское окошко. прога на плюсах похоже написана.

otets-mihail

А по сетке данные отловить не пробовал? =)

laki

они зашифрованы.

0000

Кстати вот тут http://forum.sources.ru/index.php?showtopic=140506 похожая тема

evgen5555

А кому ты сообщение шлешь?

laki

MultiList - у

evgen5555

У него же есть дочерние списки, им надо

laki

чайлдовых окон у него нет.

evgen5555

А на чём это вообще писано? Маза поискать контрол в инете.

laki

написано это какими-то прогерами из сибири . контрола в инете нет искал. скорее всего это выводиться при помощи DrawText. спай++ показывает что после обновления всех цифр вызывается WM_PAINT.

vall

написано это какими-то прогерами из сибири
скорее всего дельфа =)

otets-mihail

а не проще из других источников получать котировки?

vall

это не есть путь истинного программиста Васи

laki

нет не проще. трейдеры работают только через эту систему.

laki

откуда такой вывод?

vall

очень вероятно. большинство таких поделий что я видел были на дельфе
по экзешнику не запакованному не так сложно определить чем он собран.
этот контрол что-нить умеет?
ресайзится или сортироватся?
можно конечно прямо в памяти процесс поискать эти цифки и порюхать структуры, но это как повезёт.

laki

большинство таких поделий
много видел?
можно конечно прямо в памяти процесс поискать эти цифки и порюхать структуры, но это как повезёт.
у трейдера в среднем открыто 20-30 таких окон. и как определить какая цифра к какому окну привязана?

bleyman

Тогда не мучайся - кэпчури и распознавай, благо распознавать при фиксированном шрифте - как нефиг делать: определяешь точную позицию каждой цифры, выдираешь прямоугольничек, переводишь в грейскейл и попиксельно суммируешь разницу между яркостью распознаваемой и эталонной картинки. В качестве эталона лучше использовать слегка размазанные цифры.
Кэпчурить можно по-разному. Можно посылать ему WM_PAINT со своим dc, который типа на картинку в памяти указывает. Можно даже попытаться добиться того, чтобы он в результате отрисовал вообще все цифры, а не только те, которые попадают в клиентрект. Не получится - тогда придётся поебаться со скроллерами етс.
В принципе, задача "выдрать у чужой проги текст" сама по себе довольно, хм, загадочная, так что исполнение через жопу её не сильно испортит Разве что в худшем случае процесс кэпчуринга будет сильно зависеть от настроек машины - фонтов, например.

otets-mihail

Тогда не мучайся - кэпчури и распознавай
Не мучаться, это перехватывать вызовы DrawText, как советовал ДГ выше.

evgen5555

Вот я видел как минимум семь довольно дорогих программных комплексов (>70k$) написанных на Delphi

evgen5555

Причем большинство было из новосиба или ебурга

ava3443

Система межбанковских расчётов центрального/национального банка одной из стран СНГ написана на Delphi. Сейчас меняют на другую, цена >1M$

laki

эта система тоже недешевая. просто надо сделать это вручную так как модуль который позволяет это делать средствами системы, стоит денег.
Оставить комментарий
Имя или ник:
Комментарий: