![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить слово под курсором из любой программы?
Имя не скажу © (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]хм =)
а у кого спрашивает что под курсором?
у любого компонента?
или у какого-то определённого?
если у кого-то одного можно заточить
точнее - написать
а этот код закопай обратно =)