Форум: "Начинающим";
Текущий архив: 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