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


Автор: observateur 8.1.2008, 08:21
Прошу помочь всем кто знает как работает принцип программы TranslateIt, кто не знает могу подсказать, что с помощью этой программы можно встретив незнакомое слово в тексте и вам не надо отвлекаться от чтения и искать перевод в словаре, просто подведите указатель мыши к незнакомому слову и тут же получите перевод. Так что если кто знает подскажите пожалуйста как начать эту программу или же какие элементы программирования я должен использовать здесь. Заранее спасибо!

Автор: NT_AUTHORITY 8.1.2008, 21:31
Слушай, что я придумал. Смысл сводится к тому, чтобы преобразовать координаты мыши в индекс (ну, понимаешь - индекс символа).  Никаких стандартных функций и сообщений я для этого не нашёл поэтому для этого надо:
1. Получить индекс линии. Canvas.GetTextHeight(RichEdit1.Lines[0]) - высота одной линии, чтобы получить текущую линию, надо координату y мыши поделить на эту высоту. 
2. Получить индекс символа. Здесь ничего умнее подбора в голову не приходит - 
Код

s := RichEdit1.Lines[index];
ind := 0; w := 0;
while w < x (мышиной) do begin
   w := w + Canvas.GetTextWifth(s[ind]); 
    ind = ind + 1;
end;

3. От ind выделить слово - посмотреть, где пробелы, и всё!

Словами сказать просто, но и на деле реализовать данную вещь на мой взгляд не сложно. Решение это, может быть и грубоватое, но другого ничего нет. Да, и если у RichEdit нет канвы, можно создать свою и присвоить ей Font RichEditа.

Автор: Sunvas 8.1.2008, 21:45
NT_AUTHORITY, а ты уверен, что в правильном направлении идешь? Я вот, например нет. Когда-то я юзал этой программой и знаю, что она в принципе работает везде: и в браузере и в блокноте и даже на кнопке "Пуск". Напрашивается вариант, что тут идет метод распознавания слова под мышью.

Автор: remax 8.1.2008, 21:46
В качестве уточнения вопроса. Незнакомые слова мышкой ловим в своем приложении или чужом?

Автор: mmvds 8.1.2008, 23:26
Цитата(Sunvas @  8.1.2008,  21:45 Найти цитируемый пост)
NT_AUTHORITY, а ты уверен, что в правильном направлении идешь? Я вот, например нет. Когда-то я юзал этой программой и знаю, что она в принципе работает везде: и в браузере и в блокноте и даже на кнопке "Пуск". Напрашивается вариант, что тут идет метод распознавания слова под мышью. 

Слово "Пуск" точно задано графически, значит требуется распознавание текста, задача прямо скажем не тривиальная.
Вот нашел исходники одной OCR на Delphi: 
http://dump.ru/files/n/n9162146133 (54 кб)
Было еще и полное описание, вот только не найду :(

Если упростить условие, например - необходимо выделять слово для перевода, то задача существенно упрощается, достаточно копировать выделенный текст в буфер обмена, а далее выводить перевод под указателем мыши.

Автор: NT_AUTHORITY 9.1.2008, 15:46
Sunvas, mmvds! Вы чего-то недопонимаете. 

Цитата

Слово "Пуск" точно задано графически, значит требуется распознавание текста


Слово "Пуск" задано не графически.  При вашем желании я могу вас всех в этом убедить, но в данной теме речь идёт не об этом. 

Цитата

когда-то я юзал этой программой и знаю, что она в принципе работает везде: и в браузере и в блокноте


В своём первом посту я привёл лишь общий алгоритм, позволяющий получить слово под мышью, не углубляясь в детали. Насколько я понял, вам нужно сделать это не только в своём приложении, но и в чужом. А раз так, то нужно поставить MouseHook, который в MouseProc вернёт хэндл окна, на котором мышь, её координаты. Зная дескриптор окна, мы можем получить его текст. И дальше будем проверять, контрол мультистрочный или однострочный. Если мультистрочный, то действовать так, как описано выше (только на WinAPI - с помощью сообщений). Если однострочный, то просто переводить текст окна.

Вот, собственно, и всё!  smile 

Автор: mmvds 9.1.2008, 16:54
<оффтоп>
Цитата(NT_AUTHORITY @  9.1.2008,  15:46 Найти цитируемый пост)
Слово "Пуск" задано не графически.  При вашем желании я могу вас всех в этом убедить, но в данной теме речь идёт не об этом. 

Угу, виноват, в свое время делал замену пуска по следующей статье:
http://www.delphiworld.narod.ru/base/change_start_button_caption.html
Цитата

Для начала создайте какой-нибудь Bitmap, который вы будете натягивать на кнопку [т.к. такого понятия как "заголовок кнопки ПУСК" в действительности не существует], а та надпись, что находится на стартовой кнопке, является рисунком. Создавая рисунок, учитывайте размеры и то, что левая сторона должна быть "плоской", как у нас на рисунке слева, это связано с особенностями наложения....


Аналогичная статья есть в http://www.drkb.ru/

Сейчас нашел в инете способ через замену строки в ресурсах explorer.exe, проверил - прокатило.
</оффтоп>

По поводу решения, NT_AUTHORITY +1
Вот только с определением нужного текста в блокноте/ворде еще более менее понятно, там можно вычислить символ, а значит и слово, к которому подведен указатель мыши, а как быть например, с браузером, на странице которого,например, куча таблиц?
Или я опять что-то не понимаю?

Автор: Yanis 9.1.2008, 20:15
Цитата(NT_AUTHORITY @  9.1.2008,  16:46 Найти цитируемый пост)
Зная дескриптор окна, мы можем получить его текст.

Это условие и следствие никогда не будут верны на 100%.
Только 25% -- либо получишь текст либо нет, а возможно и кривой, если будет распознавание текста.

Цитата(NT_AUTHORITY @  9.1.2008,  16:46 Найти цитируемый пост)
Если однострочный, то просто переводить текст окна

В принципе можно согласиться, что у окна (рассматривается понятие «окно» с точки зрения Windows API) может быть текст, но не всегда текст окна является тем текстом, который отображается на экране.

Цитата(NT_AUTHORITY @  9.1.2008,  16:46 Найти цитируемый пост)
Слово "Пуск" задано не графически.

При большом желании можно поспорить, если бы форум позволял smile Даже при том условии, что я знаю, что текст задан в ресурсе и является текстом окна…

P. S. К спору готов, но не на форуме smile

Автор: NT_AUTHORITY 9.1.2008, 20:30
Цитата

Вот только с определением нужного текста в блокноте/ворде еще более менее понятно, там можно вычислить символ, а значит и слово, к которому подведен указатель мыши, а как быть например, с браузером, на странице которого,например, куча таблиц?

Хм... Не поспоришь... К тому же, окно может иметь полосу прокрутки... Нужно переводить координаты мыши в контекст окна. Ну, а на случай таблиц тоже можно что-нито придумать. К тому же, может быть это и не стоит в условии задачи...
Цитата

у окна (рассматривается понятие «окно» с точки зрения Windows API) может быть текст, но не всегда текст окна является тем текстом, который отображается на экране.

Согласен, но об этом здесь речь не идёт. Ведь основная задача - перевод текста в мультистроковых контролах типа RichEdit'a.

Автор: Yanis 9.1.2008, 20:58
Цитата(NT_AUTHORITY @  9.1.2008,  21:30 Найти цитируемый пост)
Ведь основная задача - перевод текста в мультистроковых контролах типа RichEdit'a.

Ну да, возможно так оно и есть. Тут уже автор должен пояснить.
К сожалению не работал с программой «TranslateIt!»…

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