Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
Гость_Леонид_*
|
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 подвести курсор к предложению, то моя программа получит его полностью, в то время как мне необходимо получить ТОЛЬКО то слово над которым завис курсор. Прошу помогите побороть эту проблему. Сообщение отредактировал Серёга - 14:04:2005, 08:15 |
|
Сообщение
#1
|
|
![]() |
|
Гость_Guest_*
|
18:07:2005, 22:34
|
|
Инопланетный гость |
Цитата Программа эта работает хорошо... Хотелось бы узнать как она работает... Лично у меня на строчке Код Accessibility_TLB; // Импортировать из oleacc.dll требует Accessibility_TLB.dcu! А где его взять то? И вообще нельзя ли unit полностью напечатать, от слова unit ? |
|
Сообщение
#2
|
|
|
|
19:07:2005, 06:34
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 2 450 Регистрация: 27:05:2004 Из: Минск Пользователь №: 561 Специализация: Delphi, RDBMS, C# Репутация: 8
|
Сделайте сами библиотеку типов.. импортируйте и всё...
|
|
Сообщение
#3
|
|
|
Гость_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.. |
|
Сообщение
#4
|
|
|
Гость_Olegus_*
|
28:02:2006, 08:43
|
|
Инопланетный гость |
Такой вопрос, этой темой кто либо инетресуется ещё???
Вообще встретил похожую проблеммку, интересно кто разбирался с ней... Данным методом попробовал работать но в случаи доступа к тексту из редактора, например ворда, текст не получаю... получаю только значения кнопок и меню, а есть необходимость получить текст напрямую из ворда, нельзя ли как это сделать??? С проблеммой получения текста из эксплорера та же проблемма, получаю всю строку целиком а не слово на котором стоит курсор... Причём эта же проблемма встречается при доступе к статическому тексту в приложениях... Буду благодарен если кто подскажет возможные пути обхода даных проблемм или альтернативные методы решения проблеммы... |
|
Сообщение
#5
|
|
|
|
11:10:2007, 11:50
|
|
Новенький ![]() Группа: Программист Сообщений: 13 Регистрация: 11:10:2007 Пользователь №: 13 130 Специализация: программист Репутация: 0
|
Слово в IE получить удалось. Файл прилагаю. С другими приложениями проблема остается. Неужели нельзя проше чем распознавание символов по изображению под курсором ?
Прикрепленные файлы
|
|
Сообщение
#6
|
|
|
|
6:12:2007, 05:08
|
|
Новенький ![]() Группа: Программист Сообщений: 13 Регистрация: 11:10:2007 Пользователь №: 13 130 Специализация: программист Репутация: 0
|
Были вопросы по подключению dll. выкладываю полные файлы
Прикрепленные файлы
|
|
Сообщение
#7
|
|
|
|
6:12:2007, 07:45
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Для: alexBlack
Не совсем эффективное решение. Тем более работает только с ИЕ. Мне видится решение данного вопроса в направлении перехвата GDI-функций TextOut, ExtTextOut, а еще лучше в режиме ядра DrvTextOut. Любое GUI Windows-приложение для вывода текста в контекст своего устройства использует данные функции. |
|
Сообщение
#8
|
|
|
|
6:12:2007, 09:39
|
|
Новенький ![]() Группа: Программист Сообщений: 99 Регистрация: 30:07:2007 Из: Витебск Пользователь №: 12 080 Специализация: программист Репутация: 6
|
Для: zubr
А каким образом TextOut связан с текстом под курсором мыши? Эта функция отвечает за отрисовку текста, а текст может рисовываться где угодно. |
|
Сообщение
#9
|
|
|
|
6:12:2007, 10:43
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Цитата А каким образом TextOut связан с текстом под курсором мыши? Эта функция отвечает за отрисовку текста, а текст может рисовываться где угодно. Что значит где угодно? Текст рисуется в контексте устройства. А контекст устройства для GUI-приложения - это окно. Примерная схема: 1. Ставим хук на TextOut. 2. В хуковом событии (при вызове функции TextOut) определяем инденитификатор текущего процесса GetCurrentThreadId 3. Там же с помощью функции GetGUIThreadInfo определяем хэндл окна. 4. Прописываем, текст, хендл, координаты текста в XML-файл. Дальше дело техники - отлавливаем положение курсора, хендл окна под курсором, проверяем, что есть в XML. |
|
Сообщение
#10
|
|
|
|
7:12:2007, 05:09
|
|
Новенький ![]() Группа: Программист Сообщений: 13 Регистрация: 11:10:2007 Пользователь №: 13 130 Специализация: программист Репутация: 0
|
|
|
Сообщение
#11
|
|
|
|
7:12:2007, 15:31
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
2 варианта:
1. Внедряемся в адрессное пространство чужого процесса через глобальный хук. В аттачменте пример. 2. Чтобы dll-ка подгружалась при загрузке модуля user32.dll (любое гуи-приложение загружает user32.dll) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows параметр AppInit_DLLs - имя dll-ки
Прикрепленные файлы
|
|
Сообщение
#12
|
|
|
|
10:12:2007, 05:14
|
|
Новенький ![]() Группа: Программист Сообщений: 13 Регистрация: 11:10:2007 Пользователь №: 13 130 Специализация: программист Репутация: 0
|
Любопытный исходник. Спасибо
|
|
Сообщение
#13
|
|
|
|
10:12:2007, 08:31
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 816 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
Для: alexBlack
Мог бы zubr-а и репутацией поблагодарить |
|
Сообщение
#14
|
|
|
|
3:04:2008, 06:38
|
|
Новенький ![]() Группа: Программист Сообщений: 1 Регистрация: 3:04:2008 Пользователь №: 16 340 Репутация: 0
|
zubr
Исходник конечно любопытный... Пример использования еще бы к нему... |
|
Сообщение
#15
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 09:39 |