Delphi чтение текста WINAPI
Это всё правильно. Но: переведённая мною цитата из MSND - "приложения
посылают сообщение WM_GETTEXTLENGTH для определения длины текста,
ассоциированного с окном, в символах". Если окно является обычным окном, то
ассоциированным текстом является его заголовок, если стандартным контролом,
то им является текст в этом окне, в зависимости от типа контрола: кнопки
возвращают текст на себе (OK или Cancel, например), списки возвращают текст
"подсвеченно" элемента итп. То же относится и к функции GetWindowText().
Описанная тобой ситуация похожа на то, что у тебя собственные, созданные
тобой дочерние окна, которые обслуживаются не ОС, а твоим приложением, и при
этом не имеющие заголовков. Если ты намеревался таким образом получить
текст, отображаемый в окне, как например отображает набранный в документе
текст MS Word, то вынужден огорчить: ничего не получится. ОС не запоминает,
что приложение рисует в своём окне. Этот текст НЕ СТАНОВИТСЯ ассоциированным
с окном, хотя бы потому, что там кроме текста могут быть ещё и изображения.
Вместо этого она посылает приложению сообщение о необходимости перерисовать
такое-то окно (WM_PAINT), и приложение само должно это сделать. Это сделано
из соображений экономии системных ресурсов: проще приложению сохранять
состояние своего окна наиэкономнейшим способом (например, программист может
просто запоминать текст в массиве строк, чтобы по запросу вновь его
перерисовать какими-нибудь DrawText()-ами), вместо того чтобы ОС запоминала
целый битовый образ окна, временно "затираемого" другими окнами. Это ещё и
быстрее на порядок будет, если программист не ламер последний, конечно. Это
всё азбука Windows-программирования, но если ты используешь что-нибудь типа
VCL, то ты вполне может этого и не знать, ибо эта библиотека сама заботится
обо всех подобных нюансах (точнее, заботятся её канвы - Canvas), если только
ты явно не программируешь иным образом.
Чтобы решить эту проблему, тебе нужно будет или самому обрабатывать
сообщения WM_GETTEXTLENGTH и WM_GETTEXT в своих дочерних окнах, или
использовать собственные сообщения, из разряда WM_USER, что лучше, ибо в
этом случае они не будут пересекаться со стандартными WM_GETTEXTLENGTH и
WM_GETTEXT, предназначенными вообще-то для других и вполне определённых
целей.
Кстати, "по настояшему" профессиональные программисты на Builder-е и Delphi
редко используют канвы на полную катушку из сображений экономии системных
ресурсов. Канва ведь всё равно в общем случае не может сохранить свой
констекст иначе, как битовое изображение. Представь, если MS Word будет
сохранять 200-страничный документ в виде Bitmap-а, да ещё с "принтерным"
разрешением 600 dpi, а не 96 или 120, как на большинстве мониторов.
--
С уважением, boroda
mailto:boroden***@s*****.ru
Номер выпуска : 4138
Возраст листа : 540 (дней)
Количество подписчиков : 527
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/332780
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте, Шматко.
Вы писали 14 марта 2005 г., 14:03:07:
Все это мне известно.
Даже текст из блокнота?
Именно его я использую для тестирования