Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Получить текст(слово)из-под курсора


Автор: lazutov 25.7.2008, 19:14
Здравствуйте,
как осуществить получение СЛОВА из под курсора из других приложений(IE, FireFox, Outlook...)?
Где-то (возможно даже на этом форуме) видел то ли готовое решение, то ли библиотеку; поиск не помог.
Подобное видел в приложениях: TranslateIT, Lingvo
Кто чем может помочь?
Заранее спасибо. 

Автор: Rrader 26.7.2008, 08:58
Это сделано на искусственных нейросетях. Касательно Лингво 12 могу сказать на 100% - используется библиотека LvHook.dll, в которой помимо прочих устанавливается хук на WH_MOUSE.
В дополнение к этому там есть еще такие библиотеки, как FineNet.dll и FineObj.dll - файлы достались от небезызвестного FineReader'a, сети отлично обучены. Лингво анализирует положение мыши и настройку кнопок (GetKeyState) для перевода. Фотографирует область (получает hDC, определяет выравнивание текста, производит координатную обработку) и пытается произвести Text recognition.

Автор: lazutov 26.7.2008, 12:16
мда, хотя бы примерчик на это дело...

Автор: volvo877 26.7.2008, 12:19
Ну, начать можешь с самой первой ссылки внизу страницы, в разделе "А здесь смотрели?" ...

Автор: lazutov 26.7.2008, 13:28
Прошёлся по интернету. 
везде советуют юзать WindowFromPoint и WM_GETTEXT.
 но вот вопрос: как их синхронизировать? Как получть handle элемента с текстом?

Автор: Rrader 26.7.2008, 13:42
Цитата(lazutov @  26.7.2008,  20:28 Найти цитируемый пост)
но вот вопрос: как их синхронизировать? Как получть handle элемента с текстом?

Это бессмысленно. Слово из под курсора так не получить (в браузерах все отрисовывается).  Вперед на http://basegroup.ru изучать алгоритмы нейронных сетей. По теме: классификация образов.

Автор: ne0n 27.7.2008, 14:54
Rrader,  Ыыыы да не обязательно извращаться с нейросетями, можно обычными шаблонами обойтись.

Автор: lazutov 28.10.2008, 18:43
Соответственно имеем приложение.
Пусть, например, браузер FireFox.
Соответственно, текст отрисовывается в РАЗНЫХ Элементах.
Рисунок в аттаче: Вот ,например, так раполагаются разные элементы в Firefox (выделены прямоугольниками).
Вопрос: как по коррдинатам мыши получить координаты и размеры эмемента. 
 smile 

Автор: Alix 29.10.2008, 17:26
Есть вариант с написанием компонента для FireFox, которому дают координату экранную, которая простыми махинациями превращается в координату на окне текущей страницы. Далее зная ее можно выловить элемент, в котором находится искомое слово, например, DIV или A. Как дальше, честно говоря, не знаю. В принципе, то что надо сделать чтобы работало досюда, я могу объяснить, правда писать придется на Си, т.к. под дельфи я библиотек mozill'ы не встречал, а самому было лень переводить. 
С другой стороны не думаю, что все так безысходно, т.к. если сам браузер может определить что там за слово (кстати, если оно выделено, то всё еще проще), то и необходимый интерфейс для компонентов должен предоставлять, просто я так глубоко этим не интересовался. Конечно, кроме случаев когда слово - картинка.

Автор: MetalFan 29.10.2008, 18:36
Цитата(Rrader @  26.7.2008,  08:58 Найти цитируемый пост)
Касательно Лингво 12 могу сказать на 100% - используется библиотека LvHook.dll, в которой помимо прочих устанавливается хук на WH_MOUSE.
В дополнение к этому там есть еще такие библиотеки, как FineNet.dll и FineObj.dll - файлы достались от небезызвестного FineReader'a, сети отлично обучены. Лингво анализирует положение мыши и настройку кнопок (GetKeyState) для перевода. Фотографирует область (получает hDC, определяет выравнивание текста, производит координатную обработку) и пытается произвести Text recognition. 

хм.. просто на изображениях нифига не переводит текст... а на лабелах переводит  smile 

Автор: MetalFan 29.10.2008, 19:48
исследую проблему...
наткнулся на платную и недешевую библиотеку - http://www.softplatz.com/Soft/Development/Components-Libraries/Text-Capture-Component-GetWord.html
можно скачать заценить...
немножко поковыряв ее можно прийти к выводу, что там осуществляется попытка перехвата TextOut'а.
также была замечена функция AccessibleObjectFromPoint...
в аттаче эксперимент с ее использованием. 
копаем дальше?

Автор: MetalFan 30.10.2008, 15:30
никому не интересно... ну и ладно)

Автор: lazutov 30.10.2008, 19:58
[Fatal Error] IAccTest_Form.pas(7): File not found: 'oleacc.dcu'
кинте недостающее smile

Автор: MetalFan 30.10.2008, 22:14
lazutov, нет делфи на этой машине. в 2006 уже точно есть такой файлик...
приаттачил

Автор: Qu1nt 30.10.2008, 23:24
Работает. Делаем компонент и начинаем зарабатывать $ = )

Автор: MetalFan 30.10.2008, 23:31
Qu1nt, да там не все так просто... для лабела например этим способом ничего не приходит...

Автор: CompWorm 31.10.2008, 00:43
блин, как щас помню, была такая тема... там сравнивали механизм с лингво, но то-ли потерлась та тма, то ли хз.

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

Автор: lazutov 31.10.2008, 06:56
а не подскажите, как получить координаты  и размеры элемента, с которого брался текст?

Автор: MetalFan 31.10.2008, 08:54
CompWorm, да, тоже что-то такое припоминается....
lazutov, см.методы IAccessible


Автор: CompWorm 31.10.2008, 11:04
MetalFan, 
занятная программка у тебя... но работает она далеко не везде. к примеру, меню, тривью не пашет... не читается код из окна дельфи 7

посмотри меню фраерфокса - там что-то определяется, но все менюшки перепутаны

функция
lAcc.Set_accValue(lAccCh, 'крякнуто!');
работает исключительно с текстовыми окнами...
стоит отметить, что lAcc.Get_accDescription дает тулпиксовый текст.

попробую вечером дополнить твою прогу обыными методами определения текста и класа объекта...

вопрос тебе... а почему из браузера дается текст до перевода коретки или окончания форматирования текста, а не до пробела? ты пробовал до первого пробела определить текст, игнорируя форматирование текста?

Автор: lazutov 31.10.2008, 23:16
как я только эти IAccessible не крутил. нет результата.

Автор: CompWorm 1.11.2008, 00:41
Цитата

как я только эти IAccessible не крутил. нет результата. 


lazutov, что не понятно то? вот тебе пример, как обещал... три способа в одном
http://www.filehoster.ru/files/bq8198

вот описанные мною выше проблемы действительно хитрые  smile  целый день голову ломаю как к этим выпадающим менюшкам подкопаться... вот щас пытаюсь через хендл получить контроль над объектом, проанализировать по таблице известных слассов и вытащить нужное свойство... проблема в том, что я даже на форме не способен достать текст пункта меню под курсором... куда уж там к чужим объектам. 
короче, я слабак. будем ждать что там MetalFan наковыряет smile 

к стати, преславутый IAccessible основан на вызове месаджа  WM_GETOBJECT... но от этого не легче, ибо как я понял, если этого интерфейса у объекта изначально не предусмотренно, то и взять с такого объекта нечего smile 

Автор: MetalFan 1.11.2008, 08:31
остается перехват вызова функции вывода на канву...

Автор: CompWorm 1.11.2008, 15:15
через getDC чтоль?
- обновил для канвы
http://www.filehoster.ru/files/bq8657

я все больше склоняюсь к методам Rrader'а... то есть через распознание изображения.
к примеру, IAccessible дает не слово, а фразу до перевода каретки или смены шрифта, что вносит вопрос о том как же выковырять нужное слово под курсором...

вот сегодня пытаюсь получить клиентские координаты курсора над объектом. в сочетании с getDC и анализом графики, как предлагает Rrader (пока без нейросетей, хотя с ними лучше) эти координаты помогли бы вычленить нужное слово.

отсюда вопрос: как получить локальные координаты мыши над объектом?
например, можно проползти по всей иерархии и с помощью ClipRect подсчитать координату мыши как разницу между абсолютным положением  ректангла объекта и координаты мыши... способ геморный  smile  (есть другие предложения?) ну и проанализировать все что есть в области курсора   smile 

Автор: lazutov 1.11.2008, 18:00
Цитата

lazutov, что не понятно то? вот тебе пример, как обещал... три способа в одном
http://www.filehoster.ru/files/bq8198

Файл не найден.
Вторую ссылку видел и поцентов на 80 понял.
То ли у меня с мозгами очень туго, smile  то ли я что-то не так делаю.Необходимо получить координаты (Top
, left, width,heigth) элемента, а я получаю либо нули, либо еррры.
Заранее спасибо. 

Автор: CompWorm 1.11.2008, 23:01
чудеса! действительно не пашет ссылка... а с утра проверял - работала  smile 
http://www.filehoster.ru/files/bq8657
http://rar.ifolder.ru/8860521

Цитата

width, heigth

нет у него таких свойств  smile  - посмотри пример с гетДС в файлике... там Right и Bottom, если я тебя правильно понял

Автор: CompWorm 5.11.2008, 17:07
я выше написал, что из TStringGrid получить данные незя...
беру свои слова обратно. smile 
вот в этой статье    Rrader отжигает по поводу значений из чужих процессов
http://forum.vingrad.ru/articles/topic-226725/unread-1.html
 smile 
статейка суровая smile 
полагаю, желающих развить из этого тему для текста под курсором не найдется  smile 

Автор: Rrader 6.11.2008, 13:38
CompWorm, использовать предложенные в статье методы для получения текста под курсором - ну очень громоздко, а подчас и нереально. И только для программ Delphi/BCB.

Цитата(CompWorm @  6.11.2008,  00:07 Найти цитируемый пост)
статейка суровая  smile  

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)