![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить текст под мышкой из чужого окна [D7, XP]
Очень Злой © (2012-11-03 13:57:00)программа должна получать текст из чужого окна (в моем случае это браузер (IE или Firefox)).
Пока реализовал это с помощью буфера обмена. Т.е. пользователь выделяет нужный текст и жмет ctrl+c, а программа отслеживает изменения в буфере обмена...
Но проблема в том, что пользователь может неправильно выделить текст (например выделить часть нужного текста, или же захватить часть ненужного).
Можно ли другим способом получить этот текст?
Т.е. нужна возможность получения текста, наодящегося в чужом окне в районе положения мышки, так, чтобы моя программа потом сама могла взять нужное ей кол-во символов из текста до положения мышки и после...
Реально ли такое сделать?
Если да - подскажите куда копать.
MBo (2012-11-05 13:18:00) [1]У меня своего опыта работы с этим нет. Видел, что в на sources.ru есть какой-то пример в FAQ
Очень Злой (2012-11-04 19:10:00) [2]м-да. Видимо придется отказаться от этой затеи
Полазил через Iaccessible вверх и вниз (по parent и children) и обнаружил что в разных браузерах совершенно разная структура объектов... В файерфоксе еще можно что-то понять, а в ИЕ вообще муть какая-то....
Очень Злой (2012-11-04 18:16:00) [3]О. вроде понял как получить родительский объект.
так вроде работает...
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 16:04:00) [4]Вобщем то, что первоначально отелось сделать - работает.
Т.е. с помощью такого кода
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-03 15:31:00) [5]Вроде как оно... По крайней мере заработало...
Спасибо за подсказку.
MBo (2012-11-03 14:55:00) [6]посмотри в сторону IAccessible