![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение текста любого окна...
Iam © (2002-11-19 11:38:00)Как получить текст любого окна? Не его название, а текст Hint"а, например.
Ihor Osov"yak, я видел вы занимались этой проблемой...
Игорь Шевченко (2002-11-19 14:32:00) [1]Я помню возню, о которой идет речь.
Кстати, да, текст, который "относится" к окну и текст, который в окне отображается (даже в заголовке окна) это в общем случае, две большие разницы и, опять же, в общем случае, совершенно друг с другом не соотносятся. Но исключений из правила (Игорь Шевченко © (19.11.02 14:15)) не так уж и много встречается.
К счастью.
С уважением,
Ihor Osov'yak (2002-11-19 14:22:00) [2]"text that corresponds to a window" - как я понимаю, это далеко не то, что контрол, отображает на экране. А видимый текс как раз и имеют ввиду при разговоре на сабжевую тематику. ... И как потверждение вспоминаю свое двухнедельное занятие с каким-то навороченным mfc гридом, который представлял одно окошко и ничего не говорил на тему WM_GETTEXT. И на GetWindowText также. И думаю, в любой программе таких примеров куча. И как пример особого изврата (частного случая) - делфийская лейба, которая хендла не имеет, но текст с которой вышеописанным мною методом получить можно.
Игорь Шевченко (2002-11-19 14:15:00) [3]An application sends a WM_GETTEXT message to copy the text that corresponds to a windowinto a buffer provided by the caller.
Даже не знаю, что и сказать...
Ihor Osov'yak (2002-11-19 14:12:00) [4]> Задача-то, кстати, практического смысла не имеет, а мы тут пальцы гнем :-)))
Здесь согласен. Вообще-то было бы интересно услышать от
Iam (19.11.02 12:34), зачем ему хинты?
Или это он в опровержение на Reindeer Moss Eater (19.11.02 12:32), скажем так, частный пример и не очень удачный.
То что Reindeer Moss Eater (19.11.02 12:32) не прав, утверждая
"любого" - это я таки так. В смысле неправ. :-)
Игорь Шевченко (2002-11-19 14:05:00) [5]Ihor Osov"yak © (19.11.02 13:36)
Это один из вариантов. Никто не мешает сделеать такие Hint"ы.
> Даже если это так, то в MemoryDC теми же апишными функциями
> текст выводтся. А мы их ловим.
А как мы узнаем, что нам надо ловить их при выводе в MemoryDC ?
Мало ли что приложение в какие DC выводит...Если при этом еще заниматься анализом, что впоследствии с этими DC происходит, то задача сильно выходит за рамки "Получение текста из Hint"a".
Задача-то, кстати, практического смысла не имеет, а мы тут пальцы гнем :-)))
Ihor Osov'yak (2002-11-19 13:36:00) [6]2 Игорь Шевченко © (19.11.02 13:16/
По поводу MemoryDC установленный факт или это просто рабочая гипотеза (мой експириенс не позволяет мне с ходу ответить на этот вопрос)?
Даже если это так, то в MemoryDC теми же апишными функциями текст выводтся. А мы их ловим. Конечно, тут есть трудность, что простым форсажем перерисовки не заставишь сработать эти вызовы тогда, когда нам это удобно (ибо MemoryDC уже и готов, и он вероятнее всего по новому не будет формироватся). Но можно пытатся ловить апи, которые создают этот dc, потом ловить вывод в dc, а потом уже на основании того с какого MemoryDC идет перенос картинки в целевое окно выуживать с логов искомый текст. Занятие конечно муторное, но вполне решаемое.
Игорь Шевченко (2002-11-19 13:16:00) [7]Ihor Osov"yak © (19.11.02 13:06)
Потому, что если текст в hint"е появляется копированием в его DC содержимого MemoryDC с заранее подготовленным текстом, то как снять ? :-)
С уважением,
Ihor Osov'yak (2002-11-19 13:06:00) [8]2 Игорь Шевченко © (19.11.02 12:54) - ну почему, же,
см Ihor Osov"yak © (19.11.02 12:34)
повторюсь - тестовым приложение идет блокировка вывода в хинтах также. А нем где блокировка - там можно сделать и сьем.
Зы. Только пари я заключать с Вами не стану, уже есть текущее - про хендлы файлов. Ну разьве что кто-то разработку "перехватчика хинтов в общем случае" профинансирует :-)
Игорь Шевченко (2002-11-19 12:54:00) [9]У Hint"a в общем случае - никак.
Iam (2002-11-19 12:41:00) [10]2Ihor Osov"yak.
Спасибо :)
Ihor Osov'yak (2002-11-19 12:38:00) [11]2 Iam (19.11.02 12:37)
Без проблем, я понял
Iam (2002-11-19 12:37:00) [12]2Ihor Osov"yak: Простите, это я для Игоря Шевченко пояснял. Не корректно как то получилось.
Iam (2002-11-19 12:34:00) [13]Поясняю. У Hinta как текст взять?
Ihor Osov'yak (2002-11-19 12:34:00) [14]Да, получилось. Методом перехвата соотв. апишных функций.
Но: не работает для IE, Acrobat Reader.. Для IE - юзаем соотв. интерфейсы, проблем нет. Для Acrobat Reader - не анализировал. Возможно они делают динамическую загрузку адресов соотв. апишных функций, я делал перехват статически подгружаемых. Также возможно будут проблемы с разного рода издательскими пакетамы, делающими ну очень уж хитрую отрисовку (к ним с некоторой натяжкой можно отнести и вышеупомянутого ридера).
Зы, меня не интересовало решение в общем случае, мне нужно было для конкретной программы, этим и обьясняется и мой останов на пол-пути (верне подготовку специализироаного решения для одного приложения)
Хинты счас проверю ( у меня есть тестовое приложение, просто блокирующе вывод) - да, вывод текста хинтов блокируется также.
Примерный метод решения:
- Ставим общесистемнвй хук на очередь сообщения ( с целью внедрить свою длл)
- в своей длл смотрим куда внедрились - если это не целевое приложение, ничего не делаем, если целевое - делаем подмену соотв. апишных вызовов (тут была трабла для dll от mfc - нужно было назначить соотв. права на соотв. участки образов длл - я с этим несколько дней воевал, спасибо, на этом форуме просветили)
- со своих обработчиков конешно зовем настоящие апи, чтобы картинку не споганить, но попутно своему шпиону шлем инфу какой текст выводится и по каким координатам
- в шпионе делаем на основании координат синтез того, что видит юзер. Очень муторное занятие :-).
Зы. шлем инфо не про весь вывод, в этом потоке инфо можно захлебнутся, а только тогда, когда шпион попросит, указав соотв. окно, с которого нужно делать сьем. Крнечно после этого шпион заставляет соотв. окно перерисовыватся.
Зы2. Алгоритм может и не универсальный, но для меня подошел. Немного еще поизращавшись наверно можно подготовить и универсальное решение.
Reindeer Moss Eater (2002-11-19 12:32:00) [15]Текст любого окна получается с помощью WM_GETTEXT.
Для некоторых классов окон это будет заголовок окна.
Игорь Шевченко (2002-11-19 12:31:00) [16]Iam (19.11.02 12:30)
Тогда поясни, плз, что ты имеешь в виду.
WindowText для Edit"а, к примеру, это его содержимое.
Iam (2002-11-19 12:30:00) [17]Дык не его название....
Игорь Шевченко (2002-11-19 12:22:00) [18]Либо WM_GETTEXT, либо GetWindowText вроде, больше никак...