Форум: "WinAPI";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
ВнизПоиск каретки в системе Найти похожие ветки
← →
cerber1 © (2004-04-07 23:18) [0]Как найти положение каретки в произвольном, использующем его приложении при следующих условиях:
1. Приложение может использовать нестандартные(собственные) виды кареток.
2. приложение позволяет масштабировать текст и следовательно размер каретки.
Задавал этот вопрос на разных форумах и чатах уже более 6 месяцев НОЛЬ ответов.
Буду рад даже ссылк.
← →
Diamond Cat © (2004-04-07 23:23) [1]положение относительно чего?
← →
Cobalt © (2004-04-08 00:47) [2]GetCaretPos ?
← →
cerber1 © (2004-04-08 23:01) [3]2 Diamond Cat
> Положение каретки всегда возвращается относительно МЕМО-подобного EDITORa где находится каретка. Вопрос si disabled!
2 Cobalt
> GetCaretPos работает максимум относительно TCustomMemo и не расчитан на нестандартные типы кареток
2 ALL
Пример приведенный в Microsoft SDK for Delphi не пашет с такими каретами.
← →
Cobalt © (2004-04-08 23:07) [4]If the function fails, the return value is zero. To get extended error information, call GetLastError.
← →
Diamond Cat © (2004-04-08 23:26) [5]
> > Положение каретки всегда возвращается относительно МЕМО-подобного
> EDITORa где находится каретка. Вопрос si disabled!
собственно по этому и вопрос относительно чего, вдруг относительно экрана.
Getcaretposlдолжна работать полюбому во всех контролах имеющих текстовый ввод. Просто нужно перещитывать позицию относительно фонтов
← →
cerber1 © (2004-04-10 23:25) [6]Объясняю дополнительные условия описанные выше:
речь идет не о масштабировании текста(в смысле размера шрифта),
а о масштабировании текста как изображения.
При таких раскладах каретка тоже масштабируется и ее положение даже отностиельно родного окна редактирования изменяется(например в Word, Corel и пр.) Кроме этого при вводе текста в графической оболочке, для него(текста) положение МЕМО-подобного поля ввода определяется мануальным позиционированием(sorry, за слова такие).
Есть конечно вариант: заХУЧИТЬ все месаги от мыши и клавы(и прочеей мануальной вводилки), но это не спасает от масштабирования. Неужели придется через видеопамять все ловить?
← →
Cobalt © (2004-04-11 10:03) [7]2 cerber1 © (10.04.04 23:25) [6]
Я дико извиняюсь, но похоже на бред :(
Ты лучше скажи, что тебе надо получить, а то действия у тебя такие сумбурные. Нахрена тебе эта каретка? Собрался копировать изображение тексат, а потом распознавать его? Пишешь свою OCR?
← →
cerber1 © (2004-04-12 19:56) [8]2 Cobalt © (11.04.04 10:03) [7]
Смысл задачи состоит в том, что необходимо оставить на экране видимой только ту часть изображения(+- вверх, вниз и всторону) в которой в текущий момент идет редактирование(ввод, удаление или изменение) текста. Эта задача действительно из разряда бредовых как для нормальных людей. Но в некоторых сферах деятельности это один из самых дешевых способов решения серьёзных проблем. Извините за тайнопись, работа такая.
← →
Cobalt © (2004-04-12 23:14) [9]Вот теперь понятно.
А прога какая? Что использует для вывода текста?
Или это Word/Excel?
Не совсем понятна проблема с
>Пример приведенный в Microsoft SDK for Delphi не пашет с такими каретами.
что это значит? Возвращает ошибку? Какую?
Возвращает нулевые координаты? Ищите окно, в котором идёт ввод, определяйте его координаты относительно основного окна.
← →
cerber1 © (2004-04-14 21:09) [10]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-14 23:38) [11]То есть, иными словами, ты не пробовал отлавливать положение каретки?
Насчёт того, что не видишь окон - сделай хук, и проверяй все нажатия клавиш - в какие окна они приходят с полной иерархией до самого верха(имя окна, тип, родитель; имя родителя, тип родителя, дедушка :)).
И ещё - а каретка точно используется? (для Matchcad?) а то ведь, сам понимаешь, самому реализовывать каретку - бессмысслено, когда уже есть готовое.
← →
cerber11 (2004-04-25 11:17) [12]Это уже испробовано:
Word - не отвечает на ЕМ_*** месаги, даже на самую безобидную: EM_GETRECT -> в ответ одни 0. Отсюда вывод(предположение) – перцы из мелкософта сваяли нечто покруче чем RichEdit32, что в принципе и неудивительно.
>самому реализовывать каретку - бессмысслено, когда уже есть готовое.
каретка - это тоже вид ресурса – битмап. Грузится как пестня.
И еще одно:
To display a solid caret, Windows inverts every pixel in the rectangle; to display a gray caret, Windows inverts every other pixel; to display a bitmap caret, Windows inverts only the white bits of the bitmap.
Если "Окна" знают где каретка, то почему все так сложно?
И еще. В messages.pas есть такой прикольній рекорд:
TWMVKeyToItem = TWMCharToItem;
…
TWMCharToItem = packed record
Msg: Cardinal;
Key: Word;
CaretPos: Word;
ListBox: HWND;
Result: Longint;
end;
как им воспользоваться?
← →
cerber11 (2004-04-25 11:19) [13]cerber11=cerber1
ЗЫ: забыл пароль...
← →
Cobalt © (2004-04-25 11:50) [14]>>самому реализовывать каретку - бессмысслено, когда уже есть готовое.
>каретка - это тоже вид ресурса – битмап. Грузится как пестня.
Я имел в виду именно реализации механизма каретки - то есть используется стандартный механизм отображения каретки.
Ещё раз - сообщения (WM_KEYDOWN, WM_CHAR, WM_KEYUP) приходят окну. Естественно, что у него нет обычного текста.
Но, у него должна быть каретка - у него же фокус ввода!!!
Ещё раз - тебе ведь надо сделать что? Не получать текст - он-то тебе не нужен.
В общем, для меня тема закрыта.
← →
cerber1 © (2004-04-25 18:10) [15]2 Cobalt © (25.04.04 11:50)
>В общем, для меня тема закрыта.
Не нервничай. - Поробуй сам получить хотя бы из Ворда положение каретки, а потом ори что это просто. Не пробовал то так и скажи.
Да есть фокус, да есть сообщения (WM_KEYDOWN, WM_CHAR, WM_KEYUP), но на сообщения с помощью которых можно найти каретку Ворд не откликается(Ну не хавает он ЕМ_** сообщения, а без них я не знаю как поймать каретку.)
Если отлавливать сообщения (WM_KEYDOWN, WM_CHAR, WM_KEYUP) и по ним с пересчетом размера шрифта находить положения каретки, то это тоже полная лажа ибо в Ворде есть ZOOM после чего карете-финиш.
И все-таки о последнем как коректно воспользоваться
TWMVKeyToItem = TWMCharToItem;
приведенным Выше?
← →
DVM © (2004-04-25 18:32) [16]Очень сомневаюсь, что можно узнать о том что в окне есть нестандартная каретка. Точнее ее иммитация.
Например: нарисую я в каком либо месте окна мигающий прямоугольник, заставлю его реагировать на нажатия клавишь, он будет двигаться и оставлять за собой текст - короче эмулирую все внешние признаки каретки. Но все что есть в моем окне - это рисунок. Никакими каретками там и не пахнет - есть только фокус ввода или его нет.
← →
Cobalt © (2004-04-25 22:03) [17]2 cerber1 ©
Ладно, продолжаем разговор.
Но, тем не менее, - может, всё-таки внимательнее читать справку, а?
lParam (LPARAM) (LPRECT) lprc; // address of structure for rectangle
В каком АП этот lParam у тебя указывает? В томже, что и Word?
И потом - зачем тебе эти сообщения?
Короче, брось ты это TWMVKeyToItem. Внедряйся в АП Word"a, и GetCaretPos - независимо от окна ты получишь адрес.
The caret position is always given in the client coordinates of the window that contains the caret.
А это окно - активное на данный момент.
Кстати, откуда такая информация о
cerber1 © (08.04.04 23:01) [3]
> GetCaretPos работает максимум относительно TCustomMemo и не расчитан на нестандартные типы кареток
???
DVM © (25.04.04 18:32) [16]
Это, конечно, можно сделать. Но необходимость в этом довольно-таки сомнительна при наличии уже готовой реализации.
← →
cerber1 © (2004-04-26 23:49) [18]2 Cobalt ©
Чтобы не гонять воздух над клавиатурой, привожу пример Хука, который использую для отлавливания каретки (пример взял в кладовке и немного переделал):
в ДЛЛ:
function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
AppWnd: HWND; // дескриптор приложения, в котором произошло нажатие клавишы
p0:tpoint;
begin
if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;
AppWnd:= GetForegroundWindow(); // получаем дескриптор приложения, в котором произошло нажатие клавишы. Можно поставить GetFocus – эффект тотже.
GetCaretPos(p0); // получить положение каретки в кординатах Едитора
//послать собщение приложению обработчику
SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, makeWparam(p0.x, p0.y),AppWnd);
// разрешить обработку Ноока для остальных
CallNextHookEx(GlobalData^.SysHook, Code, WParam, lParam);
Result:= 0;
end;
В программе:
procedure TForm1.WndProc(var Msg: TMessage);
var i:integer;
s1:string;
begin
inherited ; // выполняем всё то, что должно происходить при поступлении сообщения окну
{Но если пришло моё сообщение - выполняем следующий код}
if Msg.Msg = WM_MYKEYHOOK then
begin
//Выводим кординаты каретки в application.Title – там их всегда видно
application.Title:="x = "+inttostr(msg.WParamHi)+": y = "+inttostr(msg.WParamLo);
end;
end;
И тут прикол: В Блокноте и Вордпаде выводятся координаты каретки, а в Ворде : "х = 0 : у = 0" по всему тексту. Вот поэтому и не знаю что делать.
← →
DVM © (2004-04-27 00:24) [19]
> И тут прикол: В Блокноте и Вордпаде выводятся координаты
> каретки, а в Ворде : "х = 0 : у = 0" по всему тексту. Вот
> поэтому и не знаю что делать.
Потому что как я и написал в ворде нет никаких кареток скорее всего. Есть картинка. Потому и в GetCaretPos() - нули. Очень нестандартный контрол - рабочая область окна ворда.
← →
Cobalt © (2004-04-27 14:32) [20]2 cerber1 ©
Это уже стало интересно, как это так - нет каретки?
Можешь скинуть мне исходники? Я потестю тоже...
Почта - в "имени".
← →
cerber1 © (2004-04-28 22:46) [21]2 DVM © (25.04.04 18:32) [16]
Я согласен узнать, что есть нестандвртная каретка сложно, но рисовать прямоугольник вместо каретки и наделить его функциями картки это гемор ибо лучше загрузить такой битмап. С другой стороны в Ворде всем рулит ОЛЕ-сервер и он может просто любому с дурацким запросами типа GetCaretPos сказать -"иди-броди". Но с другой строны:
To display a solid caret, Windows inverts every pixel in the rectangle; to display a gray caret, Windows inverts every other pixel; to display a bitmap caret, Windows inverts only the white bits of the bitmap.
вернусь к нашим баранам:
именно Win где карета и инвертирует ссответствующую часть изображения. Вопрос - откуда она об этом знает?
← →
Cobalt © (2004-04-28 22:58) [22]Хм, действительно, CaretPos - 0:0
Попробуй ставить хук на все сообщения, а то у меня такое подозрение, что там какре-то спец. окно...
> откуда она об этом знает?
Этим занимается Window Manager. Он знает всё обо всех окнах.
← →
Cobalt © (2004-04-29 08:50) [23]Возможно, он действительнорисует свою каретку.
Поможет только полный анализ всех сообщений окнам Ворда при нажатии кнопки.
← →
cerber1 © (2004-05-06 00:16) [24]Кажется нашел в MSDK то что надо:
…
The GetCharacterPlacement function retrieves information about a character string, such as character widths, caret positioning, ordering within the string, and glyph rendering. The type of information returned depends on the dwFlags parameter and is based on the currently selected font in the given display context. The function copies the information to the specified GCP_RESULTS structure or to one or more arrays specified by the structure.
…
но не знаю, как корректно передать в нее нужные параметры, чтобы забрать положение каретки. Ибо в D5 не нашел (наверно его тем просто не было) модуль wingdi.pas
2 DVM
эта функция если верить:) MS некритична к любителям рисовать прямоугольники вместо кареток если использовать вывод на экран через GDI32.DLL(а это почти всегда, за исключением, если не ошибаюсь, прямого обращения у видюхе, DirectX и OGL)
← →
cerber1 © (2004-05-19 23:09) [25]Люди вы куда пропали?
Что по поводу GetCharacterPlacement - мысли или идеи есть?
← →
Игорь Шевченко © (2004-05-20 00:15) [26]
> Этим занимается Window Manager. Он знает всё обо всех окнах.
Эт точно.
← →
Klev (2004-05-20 01:49) [27]Вся эта дискуссия наводит на мысли, что
"перцы из мелкософта сваяли нечто покруче чем RichEdit32" и это нечто возможно является COM-объектом. Может быть надо искать пути подхода к ворду с точки зрения COM-технологии.
То, что поле ввода текста в mathcad"е является COM-объектом я точно знаю, ибо класс у энтого окна Afx:400000:28:0:0:5e77.
← →
Cobalt © (2004-05-21 19:00) [28]>cerber1 © (19.05.04 23:09) [25]
>Люди вы куда пропали?
Поможет только полный анализ всех сообщений окнам Ворда при нажатии кнопки.
← →
cerber1 © (2004-05-24 00:22) [29]> 2 Klev (20.05.04 01:49)
оно конечно можно и через СОМ, но ... если раксрыть все объекты внутри Ворда (см. VBA Word Help) то там тоже про каретку ничего не пишут.
← →
cerber1 © (2004-05-24 00:32) [30]2 Cobalt © (21.05.04 19:00)
Попробовал winsight-om посмотреть список сообщений посылаемых в Ворд, получил на нажатие клавиши:
WM_KEYDOWN ...BLA-BLA
WM_CHAR ...BLA-BLA
WM_KEYUP ...BLA-BLA
Может использовать другой анализатор?
← →
cerber1 © (2004-05-24 00:34) [31]Где найти инфу об Window Manager, ибо в SDK есть толко Window Management?
← →
Cobalt © (2004-05-24 01:14) [32]> Может использовать другой анализатор?
Рекомендую кроме анализа самих сообщений анализировать также расположение окна, которому приходит сие сообщение.
То есть, смотри не WinSight"ом, а своим хуком.
← →
cerber1 © (2004-05-26 22:23) [33]2 Cobalt © (24.05.04 01:14)
WinSight выдает расположение окна (см. WinSight), но ето все равно не решает проблемеу.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.035 c