Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

Имя не скажу ©   (2006-07-29 01:02:00) 

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


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-08-04 23:18:00) [1]


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


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


  (2006-08-03 03:50:00) [2]

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


  (2006-08-03 03:34:00) [3]

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


  (2006-08-03 03:31:00) [4]

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


  (2006-08-03 03:20:00) [5]

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


  (2006-08-03 03:20:00) [6]

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


  (2006-08-03 03:13:00) [7]

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


  (2006-08-03 02:50:00) [8]

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


  (2006-08-03 02:40:00) [9]

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


  (2006-08-03 02:08:00) [10]

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


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

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

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

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

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


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

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

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


atruhin   (2006-08-02 23:38:00) [13]

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


atruhin   (2006-08-02 23:36:00) [14]

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


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

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

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


Eraser   (2006-08-02 20:17:00) [15]

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

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


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

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

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

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


atruhin   (2006-08-02 19:10:00) [17]

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

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


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

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


atruhin   (2006-08-01 23:14:00) [19]

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

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


tButton   (2006-08-01 07:38:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо