Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Вниз

Получить текст под мышкой из чужого окна   Найти похожие ветки 

 
Очень Злой   (2012-11-03 13:57) [0]

программа должна получать текст из чужого окна (в моем случае это браузер (IE или Firefox)).

Пока реализовал это с помощью буфера обмена. Т.е. пользователь выделяет нужный текст и жмет ctrl+c, а программа отслеживает изменения в буфере обмена...
Но проблема в том, что пользователь может неправильно выделить текст (например выделить часть нужного текста, или же захватить часть ненужного).
Можно ли другим способом получить этот текст?
Т.е. нужна возможность получения текста, наодящегося в чужом окне в районе положения мышки, так, чтобы моя программа потом сама могла взять нужное ей кол-во символов из текста до положения мышки и после...
Реально ли такое сделать?
Если да - подскажите куда копать.


 
MBo ©   (2012-11-03 14:55) [1]

посмотри в сторону IAccessible


 
Очень Злой   (2012-11-03 15:31) [2]

Вроде как оно... По крайней мере заработало...

Спасибо за подсказку.


 
Очень Злой   (2012-11-04 16:04) [3]

Вобщем то, что первоначально отелось сделать - работает.
Т.е. с помощью такого кода

GetCursorPos(curpos)
...
if (SUCCEEDED(AccessibleObjectFromPoint(curpos, acc, vChild))) then
   try
     ...
     acc.get_accName(vChild, oName);
     ...
  finally
     VarClear(vChild);
     acc := nil;
   end;
   ...


я получаю строку текста под мышкой

Но
1. Можно ли, и если да то как мне получить другие строки текста, находящиеся рядом с той, где находится курсор мыши?

например в браузере открыт html-документ, который отображается как:


бла-бла-бла
...
Имеется 4 варианта:
a. Вариант 1
b. Вариант 2
c. Вариант 3
d. Вариант 4

...
бла-бла-бла


Наводя курсор на каждую из интересующих меня строчек, я получаю ее текст в своей программе.  Но хотелось бы наведя курсор мыши на первую (или на любую) строку интересующей меня части - получить все (в данном случае 5) строк. Проанализировать получаемую информацию, чтобы выбрать именно требуемые 5 строк и не лезть дальше - это не проблема, но как их получить?
Получать это все путем нескольких запросов интерфейса IAccessible, подставляя каждый раз модифицированное значение переменной curpos (TPoint) ИМХО сильно извращенский метод, да и к тому же все равно он почти ничего не даст (так как шрифт может быть разный в браузере, текст может быть длинным и в окне браузера размещаться на нескольких строчках).
Разве что получивши название объекта под курсором (в данном случае это и есть нужный текст), найти "родительский" объект и перебрать всех его "детей" в поисках нужных. Можно ли так сделать? А то что ни пробую - не получается...

2. Программа сейчас получает текст под курсором везде где курсор летает, что не очень хорошо... А мне нужно только из окна браузеров (причем исключая их меню и прочие элементы управления). Как можно определить что "выдранный" текст у нас является тесктом html-документа из браузера? ну или по крайней мере хотя бы частично предотвратить получение текста из неинтересующих меня приложений/контролов и т.п. ? Можно конечно анализировать получаемый текст и решать: использовать его или нет, но это тоже извращение...


 
Очень Злой   (2012-11-04 18:16) [4]

О. вроде понял как получить родительский объект.  
так вроде работает...

function IaccParent(const IAcc : IAccessible):IAccessible;
var
  ParentDispatch : IDispatch;
begin
  ParentDispatch := nil;
  result:=nil;
  if IAcc.Get_accParent(ParentDispatch)=S_OK then
  if (ParentDispatch = nil) or (ParentDispatch.QueryInterface(IAccessible, result) <> S_OK) then  Result:=nil;
end;


 
Очень Злой   (2012-11-04 19:10) [5]

м-да. Видимо придется отказаться от этой затеи

Полазил через Iaccessible вверх и вниз (по parent и children) и обнаружил что в разных браузерах совершенно разная структура объектов... В файерфоксе еще можно что-то понять, а в ИЕ вообще муть какая-то....


 
MBo ©   (2012-11-05 13:18) [6]

У меня  своего опыта работы с этим нет. Видел, что в на sources.ru есть какой-то пример в FAQ



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
15-1358837720
ПЛОВ
2013-01-22 10:55
2013.06.02
Как правильно работать с таким потоком?


15-1358765049
vxxv
2013-01-21 14:44
2013.06.02
Создать определенный класс.


15-1358864685
Nucer
2013-01-22 18:24
2013.06.02
Исключение при доступе к памяти


2-1351761460
mnj
2012-11-01 13:17
2013.06.02
Получение координат курсора в динамически созданном TImage


15-1358364990
zzz
2013-01-16 23:36
2013.06.02
Посоветуйте принтер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский