Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Delphi - Система _ Как получить слово под курсором мыши из любой прог

Автор: Леонид 14:04:2005, 04:38

Есть такая проблемка, мне нужно в любой программе (ну пусть для начала хотябы в 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 подвести курсор к предложению, то моя программа получит его полностью, в то время как мне необходимо получить ТОЛЬКО то слово над которым завис курсор. Прошу помогите побороть эту проблему.

Автор: Guest 18:07:2005, 22:34

Цитата
Программа эта работает хорошо...

Хотелось бы узнать как она работает... smile.gif
Лично у меня на строчке
Accessibility_TLB; // Импортировать из oleacc.dll

требует Accessibility_TLB.dcu!
А где его взять то? huh.gif

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

Автор: Barmutik 19:07:2005, 06:34

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

Автор: guest 28:01:2006, 10:28

Цитата(Guest @ 18:07:2005, 23:34 )
И вообще нельзя ли unit полностью напечатать, от слова unit ?


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

Автор: Olegus 28:02:2006, 08:43

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

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

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

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

Автор: alexBlack 11:10:2007, 11:50

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

 uGetWord.pas ( 6.92 килобайт ) : 120
 

Автор: alexBlack 6:12:2007, 05:08

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

 uGetWord.rar ( 68.71 килобайт ) : 91
 

Автор: zubr 6:12:2007, 07:45

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

Автор: Silver Wind 6:12:2007, 09:39

Для: zubr
А каким образом TextOut связан с текстом под курсором мыши? Эта функция отвечает за отрисовку текста, а текст может рисовываться где угодно.

Автор: zubr 6:12:2007, 10:43

Цитата
А каким образом TextOut связан с текстом под курсором мыши? Эта функция отвечает за отрисовку текста, а текст может рисовываться где угодно.

Что значит где угодно? Текст рисуется в контексте устройства. А контекст устройства для GUI-приложения - это окно.
Примерная схема:
1. Ставим хук на TextOut.
2. В хуковом событии (при вызове функции TextOut) определяем инденитификатор текущего процесса GetCurrentThreadId
3. Там же с помощью функции GetGUIThreadInfo определяем хэндл окна.
4. Прописываем, текст, хендл, координаты текста в XML-файл.
Дальше дело техники - отлавливаем положение курсора, хендл окна под курсором, проверяем, что есть в XML.

Автор: alexBlack 7:12:2007, 05:09

Цитата(zubr @ 6:12:2007, 13:43 ) *
Примерная схема:
1. Ставим хук на TextOut.

А можно этот пункт поподробнее. Дальше все ясно, но как перехватить TextOut для всех приложений?
Ломать dll ?

Автор: zubr 7:12:2007, 15:31

2 варианта:
1. Внедряемся в адрессное пространство чужого процесса через глобальный хук. В аттачменте пример.
2. Чтобы dll-ка подгружалась при загрузке модуля user32.dll (любое гуи-приложение загружает user32.dll) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
параметр AppInit_DLLs - имя dll-ки

 Intercept.zip ( 4.54 килобайт ) : 117
 

Автор: alexBlack 10:12:2007, 05:14

Любопытный исходник. Спасибо

Автор: European 10:12:2007, 08:31

Для: alexBlack
Мог бы zubr-а и репутацией поблагодарить

Автор: Ru55 3:04:2008, 06:38

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

Форум Invision Power Board (http://nulled.ws)
© Invision Power Services (http://nulled.ws)