| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 элемента с текстом? |
| Автор: ne0n 27.7.2008, 14:54 |
| Rrader, Ыыыы да не обязательно извращаться с нейросетями, можно обычными шаблонами обойтись. |
| Автор: lazutov 28.10.2008, 18:43 |
| Соответственно имеем приложение. Пусть, например, браузер FireFox. Соответственно, текст отрисовывается в РАЗНЫХ Элементах. Рисунок в аттаче: Вот ,например, так раполагаются разные элементы в Firefox (выделены прямоугольниками). Вопрос: как по коррдинатам мыши получить координаты и размеры эмемента. |
| Автор: Alix 29.10.2008, 17:26 |
| Есть вариант с написанием компонента для FireFox, которому дают координату экранную, которая простыми махинациями превращается в координату на окне текущей страницы. Далее зная ее можно выловить элемент, в котором находится искомое слово, например, DIV или A. Как дальше, честно говоря, не знаю. В принципе, то что надо сделать чтобы работало досюда, я могу объяснить, правда писать придется на Си, т.к. под дельфи я библиотек mozill'ы не встречал, а самому было лень переводить. С другой стороны не думаю, что все так безысходно, т.к. если сам браузер может определить что там за слово (кстати, если оно выделено, то всё еще проще), то и необходимый интерфейс для компонентов должен предоставлять, просто я так глубоко этим не интересовался. Конечно, кроме случаев когда слово - картинка. |
| Автор: MetalFan 29.10.2008, 18:36 | ||
хм.. просто на изображениях нифига не переводит текст... а на лабелах переводит |
| Автор: 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' кинте недостающее |
| Автор: 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 | ||
lazutov, что не понятно то? вот тебе пример, как обещал... три способа в одном http://www.filehoster.ru/files/bq8198 вот описанные мною выше проблемы действительно хитрые короче, я слабак. будем ждать что там MetalFan наковыряет к стати, преславутый IAccessible основан на вызове месаджа WM_GETOBJECT... но от этого не легче, ибо как я понял, если этого интерфейса у объекта изначально не предусмотренно, то и взять с такого объекта нечего |
| Автор: MetalFan 1.11.2008, 08:31 |
| остается перехват вызова функции вывода на канву... |
| Автор: CompWorm 1.11.2008, 15:15 |
| через getDC чтоль? - обновил для канвы http://www.filehoster.ru/files/bq8657 я все больше склоняюсь к методам Rrader'а... то есть через распознание изображения. к примеру, IAccessible дает не слово, а фразу до перевода каретки или смены шрифта, что вносит вопрос о том как же выковырять нужное слово под курсором... вот сегодня пытаюсь получить клиентские координаты курсора над объектом. в сочетании с getDC и анализом графики, как предлагает Rrader (пока без нейросетей, хотя с ними лучше) эти координаты помогли бы вычленить нужное слово. отсюда вопрос: как получить локальные координаты мыши над объектом? например, можно проползти по всей иерархии и с помощью ClipRect подсчитать координату мыши как разницу между абсолютным положением ректангла объекта и координаты мыши... способ геморный |
| Автор: lazutov 1.11.2008, 18:00 | ||
Файл не найден. Вторую ссылку видел и поцентов на 80 понял. То ли у меня с мозгами очень туго, , left, width,heigth) элемента, а я получаю либо нули, либо еррры. Заранее спасибо. |
| Автор: CompWorm 1.11.2008, 23:01 | ||
| чудеса! действительно не пашет ссылка... а с утра проверял - работала http://www.filehoster.ru/files/bq8657 http://rar.ifolder.ru/8860521
нет у него таких свойств |
| Автор: CompWorm 5.11.2008, 17:07 |
| я выше написал, что из TStringGrid получить данные незя... беру свои слова обратно. вот в этой статье Rrader отжигает по поводу значений из чужих процессов http://forum.vingrad.ru/articles/topic-226725/unread-1.html статейка суровая полагаю, желающих развить из этого тему для текста под курсором не найдется |
| Автор: Rrader 6.11.2008, 13:38 |
| CompWorm, использовать предложенные в статье методы для получения текста под курсором - ну очень громоздко, а подчас и нереально. И только для программ Delphi/BCB. |