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

Тема в разделе "Delphi - Система", создана пользователем -, 14 апр 2005.

Статус темы:
Закрыта.
  1. Гость

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

    Guest Гость

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

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

    Barmutik Гость

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

    guest Гость

    <!--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.. :)
     
  5. Olegus

    Olegus Гость

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

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

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

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

    alexBlack Гость

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

    Вложения:

    • uGetWord.pas
      Размер файла:
      6,9 КБ
      Просмотров:
      230
  7. alexBlack

    alexBlack Гость

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

    Вложения:

    • uGetWord.rar
      Размер файла:
      68,7 КБ
      Просмотров:
      214
  8. zubr

    zubr Гость

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

    Silver Wind Гость

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

    zubr Гость

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

    alexBlack Гость

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

    zubr Гость

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

    Вложения:

    • Intercept.zip
      Размер файла:
      4,5 КБ
      Просмотров:
      298
  13. alexBlack

    alexBlack Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: alexBlack
    Мог бы zubr-а и репутацией поблагодарить
     
  15. Ru55

    Ru55 Гость

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

    madeyou Гость

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

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    А в теме все ваианты решения написаны. Даже исходник есть.. Вам осталось только по сделать конкетную реализацию сделать. Все исходные данные здесь написаны..
     
  18. AVRast

    AVRast Гость

    Все оказалось проще, чем я думал. zubr - ГУРУ! Спасибо!!!
     
  19. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Ну у него в медальке так и написано=)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей