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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Есть такая проблемка, мне нужно в любой программе (ну пусть для начала хотябы в Internet Explorer`е и Outlook`е) получить то слово над которым находится курсор мыши. Я случайно наткнулся на програму QDictionary, она это умеет делать, правда не всегда у нее получается но это мелочи, главное это можно сделать в принципе. Немного покопавшись я выяснил что для этого используется библиотека Active Accessibility 2.0, точнее функция AccessibleObjectFromPoint из библиотеки OleAcc.dll. После долгих скитаний по форумам и совместного мозгового штурма, был рожен такой код:
Код:
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;
Программа эта работает хорошо, кроме одного НО, если скажем в IE подвести курсор к предложению, то моя программа получит его полностью, в то время как мне необходимо получить ТОЛЬКО то слово над которым завис курсор. Прошу помогите побороть эту проблему.
 
G

Guest

#2
Программа эта работает хорошо...
Хотелось бы узнать как она работает... :)
Лично у меня на строчке
Код:
Accessibility_TLB; // Импортировать из oleacc.dll
требует Accessibility_TLB.dcu!
А где его взять то? :)

И вообще нельзя ли unit полностью напечатать, от слова unit ?
 
B

Barmutik

#3
Сделайте сами библиотеку типов.. импортируйте и всё...
 
G

guest

#4
<!--QuoteBegin-Guest+18:07:2005, 23:34 -->
<span class="vbquote">(Guest @ 18:07:2005, 23:34 )</span><!--QuoteEBegin-->И вообще нельзя ли unit полностью напечатать, от слова unit ?[/quote]

в Delphi:
Project\Import Type Library
Add c:\winnt\system32\oleacc.dll
потом как добавится нажимаешь Create Unit.. :)
 
O

Olegus

#5
Такой вопрос, этой темой кто либо инетресуется ещё???

Вообще встретил похожую проблеммку, интересно кто разбирался с ней...
Данным методом попробовал работать но в случаи доступа к тексту из редактора, например ворда, текст не получаю... получаю только значения кнопок и меню, а есть необходимость получить текст напрямую из ворда, нельзя ли как это сделать???

С проблеммой получения текста из эксплорера та же проблемма, получаю всю строку целиком а не слово на котором стоит курсор... Причём эта же проблемма встречается при доступе к статическому тексту в приложениях...

Буду благодарен если кто подскажет возможные пути обхода даных проблемм или альтернативные методы решения проблеммы...
 
A

alexBlack

#6
Слово в IE получить удалось. Файл прилагаю. С другими приложениями проблема остается. Неужели нельзя проше чем распознавание символов по изображению под курсором ?
 

Вложения

A

alexBlack

#7
Были вопросы по подключению dll. выкладываю полные файлы
 

Вложения

Z

zubr

#8
Для: alexBlack
Не совсем эффективное решение. Тем более работает только с ИЕ. Мне видится решение данного вопроса в направлении перехвата GDI-функций TextOut, ExtTextOut, а еще лучше в режиме ядра DrvTextOut. Любое GUI Windows-приложение для вывода текста в контекст своего устройства использует данные функции.
 
S

Silver Wind

#9
Для: zubr
А каким образом TextOut связан с текстом под курсором мыши? Эта функция отвечает за отрисовку текста, а текст может рисовываться где угодно.
 
Z
#10
А каким образом TextOut связан с текстом под курсором мыши? Эта функция отвечает за отрисовку текста, а текст может рисовываться где угодно.
Что значит где угодно? Текст рисуется в контексте устройства. А контекст устройства для GUI-приложения - это окно.
Примерная схема:
1. Ставим хук на TextOut.
2. В хуковом событии (при вызове функции TextOut) определяем инденитификатор текущего процесса GetCurrentThreadId
3. Там же с помощью функции GetGUIThreadInfo определяем хэндл окна.
4. Прописываем, текст, хендл, координаты текста в XML-файл.
Дальше дело техники - отлавливаем положение курсора, хендл окна под курсором, проверяем, что есть в XML.
 
Z
#12
2 варианта:
1. Внедряемся в адрессное пространство чужого процесса через глобальный хук. В аттачменте пример.
2. Чтобы dll-ка подгружалась при загрузке модуля user32.dll (любое гуи-приложение загружает user32.dll) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
параметр AppInit_DLLs - имя dll-ки
 

Вложения

R
#15
zubr
Исходник конечно любопытный...
Пример использования еще бы к нему...
 
M

madeyou

#16
ну так кто-нить решил сию проблему? ооочень надо, ПОМОГИТЕ!!!
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#17
А в теме все ваианты решения написаны. Даже исходник есть.. Вам осталось только по сделать конкетную реализацию сделать. Все исходные данные здесь написаны..
 
A

AVRast

#18
Все оказалось проще, чем я думал. zubr - ГУРУ! Спасибо!!!
 
Статус
Закрыто для дальнейших ответов.