Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск каретки в системе


Страницы:   1 2

cerber1 ©   (2004-04-07 23:18:00) 

Как найти положение каретки в произвольном, использующем его приложении при следующих условиях:
1. Приложение может использовать нестандартные(собственные) виды кареток.
2. приложение позволяет масштабировать текст и следовательно размер каретки.
 Задавал этот вопрос на разных форумах и чатах уже более 6 месяцев НОЛЬ ответов.
 Буду рад даже ссылк.


cerber1   (2004-05-26 22:23:00) [1]

2 Cobalt ©   (24.05.04 01:14)

WinSight выдает расположение окна (см. WinSight), но ето все равно не решает проблемеу.


Cobalt   (2004-05-24 01:14:00) [2]

> Может использовать другой анализатор?
Рекомендую кроме анализа самих сообщений анализировать такжерасположение окна, которому приходит сие сообщение.
То есть, смотри не WinSight'ом, а своим хуком.


cerber1   (2004-05-24 00:34:00) [3]

Где найти инфу об Window Manager, ибо в SDK есть толко Window Management?


cerber1   (2004-05-24 00:32:00) [4]

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:22:00) [5]

> 2 Klev   (20.05.04 01:49)
оно конечно можно и через СОМ, но ... если раксрыть все объекты внутри Ворда (см. VBA Word Help) то там тоже про каретку ничего не пишут.


Cobalt   (2004-05-21 19:00:00) [6]

>cerber1 ©   (19.05.04 23:09) [25]
>Люди вы куда пропали?
Поможет только полный анализ всех сообщенийокнам Ворда при нажатии кнопки.


Klev   (2004-05-20 01:49:00) [7]

Вся эта дискуссия наводит на мысли, что
"перцы из мелкософта сваяли нечто покруче чем RichEdit32" и это нечто возможно является COM-объектом. Может быть надо искать пути подхода к ворду с точки зрения COM-технологии.
То, что поле ввода текста в mathcad'е является COM-объектом я точно знаю, ибо класс у энтого окна Afx:400000:28:0:0:5e77.


Игорь Шевченко   (2004-05-20 00:15:00) [8]


> Этим занимается Window Manager. Он знает всё обо всех окнах.


Эт точно.


cerber1   (2004-05-19 23:09:00) [9]

Люди вы куда пропали?
Что по поводу GetCharacterPlacement - мысли или идеи есть?


cerber1   (2004-05-06 00:16:00) [10]

Кажется нашел в MSDK то что надо:
…
The GetCharacterPlacementfunction retrieves information about a character string, such as character widths, caretpositioning, 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)


Cobalt   (2004-04-29 08:50:00) [11]

Возможно, он действительнорисует свою каретку.
Поможет только полный анализ всех сообщенийокнам Ворда при нажатии кнопки.


Cobalt   (2004-04-28 22:58:00) [12]

Хм, действительно, CaretPos - 0:0
Попробуй ставить хук на все сообщения, а то у меня такое подозрение, что там какре-то спец. окно...

> откуда она об этом знает?
Этим занимается Window Manager. Он знает всё обо всех окнах.


cerber1   (2004-04-28 22:46:00) [13]

2 DVM ©   (25.04.04 18:32) [16]

Я согласен узнать, что есть нестандвртная каретка сложно, но рисовать прямоугольник вместо каретки и наделить его функциями картки  это гемор ибо лучше загрузить такой битмап. С другой стороны в Ворде всем рулит ОЛЕ-сервер и он может просто любому с дурацким запросами типа GetCaretPos сказать -"иди-броди". Но с другой строны:
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.    
вернусь к нашим баранам:
именно Win где карета и инвертирует ссответствующую часть изображения. Вопрос - откуда она об этом знает?


Cobalt   (2004-04-27 14:32:00) [14]

2 cerber1 ©  
Это уже стало интересно, как это так - нет каретки?
Можешь скинуть мне исходники? Я потестю тоже...
Почта - в "имени".


DVM   (2004-04-27 00:24:00) [15]


> И тут прикол: В Блокноте и Вордпаде выводятся координаты
> каретки, а в Ворде : "х = 0 : у = 0" по всему тексту. Вот
> поэтому и не знаю что делать.

Потому что как я и написал в ворде нет никаких кареток скорее всего. Есть картинка. Потому и в GetCaretPos() - нули. Очень нестандартный контрол - рабочая область окна ворда.


cerber1   (2004-04-26 23:49:00) [16]

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" по всему тексту. Вот поэтому и не знаю что делать.


Cobalt   (2004-04-25 22:03:00) [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]
Это, конечно, можно сделать. Но необходимостьв этом довольно-таки сомнительна при наличии уже готовой реализации.


DVM   (2004-04-25 18:32:00) [18]

Очень сомневаюсь, что можно узнать о том что в окне есть нестандартная каретка. Точнее ее иммитация.
Например: нарисую я в каком либо месте окна мигающий прямоугольник, заставлю его реагировать на нажатия клавишь, он будет двигаться и оставлять за собой текст - короче эмулирую все внешние признаки каретки. Но все что есть в моем окне - это рисунок. Никакими каретками там и не пахнет - есть только фокус ввода или его нет.


cerber1   (2004-04-25 18:10:00) [19]

2 Cobalt ©   (25.04.04 11:50)
>В общем, для меня тема закрыта.
Не нервничай. - Поробуй сам получить хотя бы из Ворда положение каретки, а потом ори что это просто. Не пробовал то так и скажи.

Да есть фокус, да есть сообщения (WM_KEYDOWN, WM_CHAR, WM_KEYUP), но на сообщения с помощью которых можно найти каретку Ворд не откликается(Ну не хавает он ЕМ_** сообщения, а без них я не знаю как поймать каретку.)
Если отлавливать сообщения (WM_KEYDOWN, WM_CHAR, WM_KEYUP) и по ним с пересчетом размера шрифта находить положения каретки, то это тоже полная лажа ибо в Ворде есть ZOOM  после чего карете-финиш.
И все-таки о последнем как коректно воспользоваться

TWMVKeyToItem = TWMCharToItem;

приведенным Выше?


Cobalt   (2004-04-25 11:50:00) [20]

>>самому реализовывать каретку - бессмысслено, когда уже есть готовое.
>каретка - это тоже вид ресурса – битмап. Грузится как пестня.
Я имел в виду именно реализациимеханизма каретки - то есть используется стандартный механизм отображения каретки.
Ещё раз - сообщения (WM_KEYDOWN, WM_CHAR, WM_KEYUP) приходят окну. Естественно, что у него нет обычного текста .
Но, у него должна быть каретка - у него же фокус ввода!!!

Ещё раз - тебе ведь надо сделать что?Не получать текст - он-то тебе не нужен.

В общем, для меня тема закрыта.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо