Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как получить слово под курсором мыши из любой прог
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Система
Леонид
Есть такая проблемка, мне нужно в любой программе (ну пусть для начала хотябы в 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
Цитата
Программа эта работает хорошо...

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

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

И вообще нельзя ли unit полностью напечатать, от слова unit ?
Barmutik
Сделайте сами библиотеку типов.. импортируйте и всё...
guest
Цитата(Guest @ 18:07:2005, 23:34 )
И вообще нельзя ли unit полностью напечатать, от слова unit ?


в Delphi:
Project\Import Type Library
Add c:\winnt\system32\oleacc.dll
потом как добавится нажимаешь Create Unit.. smile.gif
Olegus
Такой вопрос, этой темой кто либо инетресуется ещё???

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

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

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

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

А можно этот пункт поподробнее. Дальше все ясно, но как перехватить TextOut для всех приложений?
Ломать dll ?
zubr
2 варианта:
1. Внедряемся в адрессное пространство чужого процесса через глобальный хук. В аттачменте пример.
2. Чтобы dll-ка подгружалась при загрузке модуля user32.dll (любое гуи-приложение загружает user32.dll) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
параметр AppInit_DLLs - имя dll-ки
alexBlack
Любопытный исходник. Спасибо
European
Для: alexBlack
Мог бы zubr-а и репутацией поблагодарить
Ru55
zubr
Исходник конечно любопытный...
Пример использования еще бы к нему...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.