Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Как получить слово под курсором мыши из любой прог
Гость_Леонид_*
сообщение 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
 
Новая тема 
Ответов (1 - 14)
Гость_Guest_*
сообщение 18:07:2005, 22:34
Цитата Ответить 





Инопланетный гость






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

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

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

И вообще нельзя ли unit полностью напечатать, от слова unit ?
Подняться вверх 
 
Сообщение #2
Barmutik
Вставить ник
сообщение 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.. smile.gif
Подняться вверх 
 
Сообщение #4
Гость_Olegus_*
сообщение 28:02:2006, 08:43
Цитата Ответить 





Инопланетный гость






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

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

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

Буду благодарен если кто подскажет возможные пути обхода даных проблемм или альтернативные методы решения проблеммы...
Подняться вверх 
 
Сообщение #5
alexBlack
Вставить ник
сообщение 11:10:2007, 11:50
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 13
Регистрация: 11:10:2007
Пользователь №: 13 130
Специализация: программист



Репутация: - 0 +


Слово в IE получить удалось. Файл прилагаю. С другими приложениями проблема остается. Неужели нельзя проше чем распознавание символов по изображению под курсором ?
Прикрепленные файлы
Прикрепленный файл  uGetWord.pas ( 6.92 килобайт ) Кол-во скачиваний: 107
 
Подняться вверх 
 
Сообщение #6
alexBlack
Вставить ник
сообщение 6:12:2007, 05:08
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 13
Регистрация: 11:10:2007
Пользователь №: 13 130
Специализация: программист



Репутация: - 0 +


Были вопросы по подключению dll. выкладываю полные файлы
Прикрепленные файлы
Прикрепленный файл  uGetWord.rar ( 68.71 килобайт ) Кол-во скачиваний: 70
 
Подняться вверх 
 
Сообщение #7
zubr
Вставить ник
сообщение 6:12:2007, 07:45
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 899
Регистрация: 19:11:2003
Пользователь №: 133



Репутация: - 11 +


Для: alexBlack
Не совсем эффективное решение. Тем более работает только с ИЕ. Мне видится решение данного вопроса в направлении перехвата GDI-функций TextOut, ExtTextOut, а еще лучше в режиме ядра DrvTextOut. Любое GUI Windows-приложение для вывода текста в контекст своего устройства использует данные функции.
Подняться вверх 
 
Сообщение #8
Silver Wind
Вставить ник
сообщение 6:12:2007, 09:39
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 99
Регистрация: 30:07:2007
Из: Витебск
Пользователь №: 12 080
Специализация: программист



Репутация: - 6 +


Для: zubr
А каким образом TextOut связан с текстом под курсором мыши? Эта функция отвечает за отрисовку текста, а текст может рисовываться где угодно.
Подняться вверх 
 
Сообщение #9
zubr
Вставить ник
сообщение 6:12:2007, 10:43
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 899
Регистрация: 19:11:2003
Пользователь №: 133



Репутация: - 11 +


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

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


Новенький
*

Группа: Программист
Сообщений: 13
Регистрация: 11:10:2007
Пользователь №: 13 130
Специализация: программист



Репутация: - 0 +


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

А можно этот пункт поподробнее. Дальше все ясно, но как перехватить TextOut для всех приложений?
Ломать dll ?
Подняться вверх 
 
Сообщение #11
zubr
Вставить ник
сообщение 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-ки
Прикрепленные файлы
Прикрепленный файл  Intercept.zip ( 4.54 килобайт ) Кол-во скачиваний: 89
 
Подняться вверх 
 
Сообщение #12
alexBlack
Вставить ник
сообщение 10:12:2007, 05:14
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 13
Регистрация: 11:10:2007
Пользователь №: 13 130
Специализация: программист



Репутация: - 0 +


Любопытный исходник. Спасибо
Подняться вверх 
 
Сообщение #13
European
Вставить ник
сообщение 10:12:2007, 08:31
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 816
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Для: alexBlack
Мог бы zubr-а и репутацией поблагодарить
Подняться вверх 
 
Сообщение #14
Ru55
Вставить ник
сообщение 3:04:2008, 06:38
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 1
Регистрация: 3:04:2008
Пользователь №: 16 340



Репутация: - 0 +


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


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 09:39
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net