![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск каретки в системе
cerber1 © (2004-04-07 23:18:00)Как найти положение каретки в произвольном, использующем его приложении при следующих условиях:
1. Приложение может использовать нестандартные(собственные) виды кареток.
2. приложение позволяет масштабировать текст и следовательно размер каретки.
Задавал этот вопрос на разных форумах и чатах уже более 6 месяцев НОЛЬ ответов.
Буду рад даже ссылк.
cerber11 (2004-04-25 11:19:00) [21]cerber11=cerber1
ЗЫ: забыл пароль...
cerber11 (2004-04-25 11:17:00) [22]Это уже испробовано:
Word - не отвечает на ЕМ_*** месаги, даже на самую безобидную: EM_GETRECT -> в ответ одни 0. Отсюда вывод(предположение) – перцы из мелкософта сваяли нечто покруче чем RichEdit32, что в принципе и неудивительно.
> самому реализовывать каретку - бессмысслено, когда уже есть готовое.
каретка - это тоже вид ресурса – битмап. Грузится как пестня.
И еще одно:
To display a solid caret, Windows invertsevery pixel in the rectangle; to display a gray caret, Windows invertsevery other pixel; to display a bitmap caret, Windows invertsonly the white bits of the bitmap.
Если "Окна" знают где каретка, то почему все так сложно?
И еще. В messages.pas есть такой прикольній рекорд:
TWMVKeyToItem = TWMCharToItem;
…
TWMCharToItem = packed record
Msg: Cardinal;
Key: Word;
CaretPos: Word;
ListBox: HWND;
Result: Longint;
end;
как им воспользоваться?
Cobalt (2004-04-14 23:38:00) [23]То есть, иными словами, ты не пробовал отлавливать положение каретки?
Насчёт того, что не видишь окон - сделай хук, и проверяй все нажатия клавиш - в какие окна они приходят с полной иерархией до самого верха(имя окна, тип, родитель; имя родителя, тип родителя, дедушка :)).
И ещё - а каретка точно используется? (для Matchcad?) а то ведь, сам понимаешь, самому реализовывать каретку - бессмысслено, когда уже есть готовое.
cerber1 (2004-04-14 21:09:00) [24]2 Cobalt
Вскрываю карты. Идея поиска каретки на экране посетила меня после того как я начал пробовать искать ее в Worde. Основные приложения, на которые должно быть направлено данное снадобье - Microsoft Office(97-XP) и Mathcad(2000-2003). Естественно при желании построить универсальный отлавливатель каретки, абсолютно не было возможности получить от производителя(что и не удивительно) исходных(первичных) названий контролов в которых будет производиться редактирование текста. Решил попробовать почти универсальную, но криво заточеную тулзу - WinSight32 от Борланда. Каково же было мое удивление, когда эти гребаные приложения не сообщали гражданину WinSight32 о введеном тексте(сообщались только события WM_KEYDOWN, WM_CHAR, WM_KEYUP). Да есть обработка нажатия клавиш и перемещения мыши, но нет окна с текстом(можете попробовать самостоятельно это недолго и небольно). Решил проверить на Блокноте и Wordpade - рулез все окна с названиями, положением и содержимым - берите хавайте Господа. А с обозначенными выше приложениями - ЛАЖА.
Вот я и подумал: если формально есть Editor в котором происходит редактирование, но система (пардон WinSight32) его не видит, то как можно найти этот гребаный Editor другими методами(под словом "метод" понимать "способ действия") и как до него достучаться через API-функции(собственно поэтому я и задал вопрос в этой ветке)???.
А пример в microsoft SDK не пашет по той причине, что он расчитан на слежение за каретой в клиентском окне, but this is for kids.
Cobalt (2004-04-12 23:14:00) [25]Вот теперь понятно.
А прога какая? Что использует для вывода текста?
Или это Word/Excel?
Не совсем понятна проблема с
>Пример приведенный в Microsoft SDK for Delphi не пашет с такими каретами.
что это значит? Возвращает ошибку? Какую?
Возвращает нулевые координаты? Ищите окно, в котором идёт ввод, определяйте его координаты относительно основного окна.
cerber1 (2004-04-12 19:56:00) [26]2 Cobalt © (11.04.04 10:03) [7]
Смысл задачи состоит в том, что необходимо оставить на экране видимой только ту часть изображения(+- вверх, вниз и всторону) в которой в текущий момент идет редактирование(ввод, удаление или изменение) текста. Эта задача действительно из разряда бредовых как для нормальных людей. Но в некоторых сферах деятельности это один из самых дешевых способов решения серьёзных проблем. Извините за тайнопись, работа такая.
Cobalt (2004-04-11 10:03:00) [27]2 cerber1 © (10.04.04 23:25) [6]
Я дико извиняюсь, но похоже на бред :(
Ты лучше скажи, что тебе надо получить, а то действия у тебя такие сумбурные. Нахрена тебе эта каретка? Собрался копировать изображение тексат, а потом распознавать его? Пишешь свою OCR?
cerber1 (2004-04-10 23:25:00) [28]Объясняю дополнительные условия описанные выше:
речь идет не о масштабировании текста(в смысле размера шрифта),
а о масштабировании текста как изображения.
При таких раскладах каретка тоже масштабируется и ее положение даже отностиельно родного окна редактирования изменяется(например в Word, Corel и пр.) Кроме этого при вводе текста в графической оболочке, для него(текста) положение МЕМО-подобного поля ввода определяется мануальным позиционированием(sorry, за слова такие).
Есть конечно вариант: заХУЧИТЬ все месаги от мыши и клавы(и прочеей мануальной вводилки), но это не спасает от масштабирования. Неужели придется через видеопамять все ловить?
Diamond Cat (2004-04-08 23:26:00) [29]
> > Положение каретки всегда возвращается относительно МЕМО-подобного
> EDITORa где находится каретка. Вопрос si disabled!
собственно по этому и вопрос относительно чего, вдруг относительно экрана.
Getcaretposlдолжна работать полюбому во всех контролах имеющих текстовый ввод. Просто нужно перещитывать позицию относительно фонтов
Cobalt (2004-04-08 23:07:00) [30]If the function fails, the return value is zero. To get extended error information, call GetLastError.
cerber1 (2004-04-08 23:01:00) [31]2 Diamond Cat
> Положение каретки всегда возвращается относительно МЕМО-подобного EDITORa где находится каретка. Вопрос si disabled!
2 Cobalt
> GetCaretPos работает максимум относительно TCustomMemo и не расчитан на нестандартные типы кареток
2 ALL
Пример приведенный в Microsoft SDK for Delphi не пашет с такими каретами.
Cobalt (2004-04-08 00:47:00) [32]GetCaretPos ?
Diamond Cat (2004-04-07 23:23:00) [33]положение относительно чего?