Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

Как получить слово под курсором из любой программы?   Найти похожие ветки 

 
Имя не скажу   (2006-07-29 01:02) [0]

В одном форуме раскопал:


implementation

{$R *.dfm}

uses
Accessibility_TLB; // Импортировать из oleacc.dll

function AccessibleObjectFromPoint(Pt: TPoint; var Acc: IAccessible; var Child: Variant): HRESULT;
stdcall; external "OleAcc.dll" name "AccessibleObjectFromPoint";

var
OldPoint: TPoint;

procedure RecalcText(Wnd: HWND; uMsg, idEvent: UINT; dwTime: DWORD); stdcall;
var
P: TPoint;
A: IAccessible;
V: Variant;
begin
if GetCursorPos(P) and ((P.X <> OldPoint.X) or (P.Y <> OldPoint.Y)) then
begin
 OldPoint := P;
 if Succeeded(AccessibleObjectFromPoint(P, A, V)) then
   Form1.Caption := A.accName[V]
 else
   Form1.Caption := ""
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetTimer(Handle, 1, 1000, @RecalcText)
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
KillTimer(Handle, 1)
end;


Но он получает целое предложение под курсором, а никак не отдельное слово. Как этого добиться?


 
Германн ©   (2006-07-29 01:16) [1]

2 Имя не скажу
А я и не хочу спрашивать. :-)


> Но он получает целое предложение под курсором, а никак не
> отдельное слово. Как этого добиться?

А кто "он"?
У "него" и спрашивай!

Сам "раскопал", сам и "закапывай"! :-)


 
Имя не скажу   (2006-07-29 01:20) [2]


> 2 Имя не скажу
> А я и не хочу спрашивать. :-)

Все равно не скажу ))))


> А кто "он"?
> У "него" и спрашивай!

Моя (т.е.) раскопанная программа, конечно)


 
Германн ©   (2006-07-29 01:48) [3]

Ну и. Так в чём сбс-но проблема?
Не то "раскопал" что-ли?


 
Имя не скажу   (2006-07-31 23:29) [4]

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


 
tButton ©   (2006-08-01 07:38) [5]

хм =)
а у кого спрашивает что под курсором?
у любого компонента?
или у какого-то определённого?
если у кого-то одного можно заточить
точнее - написать
а этот код закопай обратно =)


 
atruhin ©   (2006-08-01 23:14) [6]

> Как получить слово под курсором из любой программы?

Вобщем никак. Только распознавание образов, но судя по вопросу, это не реально


 
Dmitrij_K   (2006-08-01 23:58) [7]

Есть программа переводчик translateit.ru она как-то это далает. Как?


 
atruhin ©   (2006-08-02 19:10) [8]

> Есть программа переводчик translateit.ru она как-то это
> далает. Как?

А ты попробуй, с помощью этой программы, перевести надпись элемента TLabel.
Что получится?
Вообще как она не знаю, но например Ligvo делает очень просто, запускается по двойному нажатию Ctrl-Insert? Ctrl-C, т.е. при первом нажатии, текст помещается в буфер, при втором переводится.


 
Юрий Зотов ©   (2006-08-02 20:01) [9]

> atruhin ©   (02.08.06 19:10) [8]

TLabel - это элемент только для той программы, в которой он живет. Для остальных программ это не элемент, а просто рисунок и никаких надписей в нем нет. Соответственно, получить то, чего нет - невозможно.

PS
Я в курсе, что Земля не совсем круглая.


 
Eraser ©   (2006-08-02 20:17) [10]

> [8] atruhin ©   (02.08.06 19:10)
> > Есть программа переводчик translateit.ru она как-то это
>
> > далает. Как?
>
> А ты попробуй, с помощью этой программы, перевести надпись
> элемента TLabel.
> Что получится?

как правильно заметил Юрий Зотов, именно TLabel перехватить не удасться, но и Земля действительно не совсем круглая :) это значит, что во программах (особенно написаных на MSVC++) в т.ч. системных используется аналог не TLabel, а TStaticText, т.е. оконный элемент, прочитать заголовок которого не составляет труда. Но тут уж как повезет, попадется TLabel - текст "вытащить" не удастся, TStaticText - удастся )


 
atruhin ©   (2006-08-02 23:36) [11]

> [9] Юрий Зотов ©   (02.08.06 20:01)


> [10] Eraser ©   (02.08.06 20:17)

Я не понял, чего мне то объяснять бросились? Я это и так знаю.
Автор задал конкретный вопрос:
> Как получить слово под курсором из любой программы?

Я ответил что из любой никак. На последовавшие вопросы привел пример.


 
atruhin ©   (2006-08-02 23:38) [12]

Кстати помимо TLabel нельзя получить слово из любого элемента, где надпись просто выводится в OnDraw....


 
Eraser ©   (2006-08-03 00:47) [13]

> [12] atruhin ©   (02.08.06 23:38)
> Кстати помимо TLabel нельзя получить слово из любого элемента,
> где надпись просто выводится в OnDraw....

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


 
Юрий Зотов ©   (2006-08-03 01:37) [14]

Поясню, о чем идет речь в топике. Не о рисованных надписях, конечно. И даже не о всех окнах, а только о тех, которые поддерживают IAccessible (а в современных версиях Windows этот интерфейс поддерживают чуть ли не все стандартные контролы).

Где-то с год назад подобный вопрос уже задавался, тема для меня была новая, заинтересовался  - ну и набросал этот пример получения текста, полагая, что дальнейшее (выделить из уже готового текста одно нужное слово) уже несложно и что для этого надо просто поизучать IAccessible более подробно, чем это сделал я при написании примера. Тем более, что есть программы, которые действительно это делают (QDictionary, например) - значит, это возможно.

Видимо, за прошедший год этот пример (как оно обычно и бывает) расползся по Сети, но вторую часть задачи (выделение слова) за это время так никто и не решил (вероятно, по той же причине, по которой Джо был неуловимым). Сейчас попробовал сделать это "на скорую руку" - не получилось, нужно браться более серьезно. Но тратить на неактуальную для меня задачу какое-то заметное время... честно говоря, не могу позволить себе такой роскоши. Сорри.

Так что задачка остается актуальной и если кому интересно поломать над ней голову - MSDN в руки и вперед. Решение точно есть, надо его найти.


 
имя   (2006-08-03 02:08) [15]

Удалено модератором


 
имя   (2006-08-03 02:40) [16]

Удалено модератором


 
имя   (2006-08-03 02:50) [17]

Удалено модератором


 
имя   (2006-08-03 03:13) [18]

Удалено модератором


 
имя   (2006-08-03 03:20) [19]

Удалено модератором


 
имя   (2006-08-03 03:20) [20]

Удалено модератором


 
имя   (2006-08-03 03:31) [21]

Удалено модератором


 
имя   (2006-08-03 03:34) [22]

Удалено модератором


 
имя   (2006-08-03 03:50) [23]

Удалено модератором
Примечание: Мужики, хорош флудить.


 
Имя не скажу   (2006-08-04 23:18) [24]


> Юрий Зотов ©   (03.08.06 01:37) [14]
> Поясню, о чем идет речь в топике. Не о рисованных надписях,
>  конечно. И даже не о всех окнах, а только о тех, которые
> поддерживают IAccessible (а в современных версиях Windows
> этот интерфейс поддерживают чуть ли не все стандартные контролы).
>


Прошу прощения, именно это я и имел в виду :)))



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.053 c
15-1156231179
Шмелъ
2006-08-22 11:19
2006.09.17
Сайт


15-1156945347
vecna
2006-08-30 17:42
2006.09.17
Mazda vs Focus


2-1155647931
apic
2006-08-15 17:18
2006.09.17
Динамическое создание компонентов...


2-1156450074
vain
2006-08-25 00:07
2006.09.17
ShellListView


2-1156587361
small
2006-08-26 14:16
2006.09.17
фокус в TstringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский