· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Где хранится тот текст который отдает ф-ция GetWindowText(...)

Посл.отвђт Сообщенiе


Дата: Сен 26, 2004 11:04:24

Здравствуйте

Вот возник вопрос по сабжу... Есть у меня например EditBox, и интересно узнать где же хранится тот текст который я в него только что набрал и могу получить функцией GetWindowText(...) ?

Спасибо


Дата: Сен 26, 2004 11:23:20

В соответствующем буфере, который выделяется системой при создании эдита. Для эдитов со стилем DS_LOCALEDIT память под буфер выделяется приложением при помощи сообщения EM_SETHANDLE.


Дата: Сен 26, 2004 11:26:52

То есть EM_GETHANDLE отдаст мне адрес начала буфера и я могу просто скопировать текст через movsb ?


Дата: Сен 27, 2004 01:12:04

Не совсем. Полученное значение необходимо передать функции LocalLock(), а она вернёт адрес буфера. После окончании операций необходимо вызывать LocalUnlock(). Учти, что в Windows 95/98/Me это сообщение (EM_GETHANDLE) не пашет, как и EM_SETHANDLE. Эти сообщения пришли в Вин2000 из Windows NT 3.1. И вообще я не пойму, почему бы не воспользоваться функциями GetWindowTextLength() и GetWindowText(). А ещё есть сообщение WM_GETTEXT. Вся эта фигня с хэндлами буфера обычно не нужна.


Дата: Сен 27, 2004 10:10:05

Это процесс изучения механизма работы системы.
Как же получить адрес буффера под 95/98 ?


Дата: Сен 27, 2004 18:35:13

Тогда такой вопрос вдогонку: почему WM_GETTEXT и GetWindowText в некоторых Edit'ах возвращают разные значения (а WM_SETTEXT и SetWindowText соответственно успешно их записывают)? На Win32asm community вопрос уже поднимался, феномену подивились, но объяснения никто не сказал.


Дата: Сен 28, 2004 02:50:44

CyberManiac
А что значит "разные значенiя"? Текст-то в эдите вполне определённый.


Дата: Сен 28, 2004 14:13:41

„Как же получить адрес буффера под 95/98 ?“

Можно ввести в Edit какую-нибудь строку, а потом поискать ее в памяти процесса отладчиком. Так можно найти все буферы, в которых хранятся введенные данные, и заодно убедиться, что их несколько.


Дата: Сен 28, 2004 16:11:00

Foamplast:
А что значит "разные значенiя"? Текст-то в эдите вполне определённый.

Текстов на самом деле - два. Обнаружить это можно так: пишем простейшую программу, которая по хэндлу окна способна показывать тексты, получаемые через WM_GETTEXT и через GetWindowText; если писать вломы - берем уже готорую, например, мою (InqSoft Window Scanner). Потом жмем "Пуск|Выполнить программу", появляется окно с комбо-боксом, внутри комбо сидит Edit. Пишем в нем чего-нибудь, например, "ромашка" и натравливем на этот Edit программу. WM_GETTEXT успешно читает то, что мы написали, GetWindowText возвращает пустую строку.

Но и это еще мелочи. При помощи SetWindowText (или того же Window Scanner) засовываем в это окно слово "хрен", его не видно. Заново читаем содержимое окна обеими способами и видим, что WM_GETTEXT показывает "ромашку", а GetWindowText - "хрен"!


Дата: Сен 28, 2004 18:28:23

„Но и это еще мелочи. При помощи SetWindowText (или того же Window Scanner) засовываем в это окно слово "хрен", его не видно. Заново читаем содержимое окна обеими способами и видим, что WM_GETTEXT показывает "ромашку", а GetWindowText - "хрен"!“

GetWindowText cannot retrieve the text of a control in another application.

SetWindowText cannot change the text of a control in another application.

Они стараются. Очень стараются. Но делают только то, что могут - читают/пишут неизвестно_какую память в СВОЕМ процессе.


Дата: Сен 28, 2004 21:46:54

„в СВОЕМ процессе“

Похоже на то. Я попробовал, и в памяти подопытного процесса "хрен" не обнаружил, а после этого другой процесс благополучно получил "хрен" с помощью GetWindowText неизвестно откуда. То есть, если быть точным, Айс нашел несколько "хренов", но выше 0х80000000. А эта память в Win2000 общая для всех процессов, если я не ошибаюсь.


Дата: Сен 29, 2004 09:34:29

Правда какя-то фигня:
Для чужого процесса WM_GETTEXT читает только то, что пишет WM_SETTEXT,
GetWindowText читает только то, что пишет SetWindowText,
а то, что пишет SetWindowText - нихрена не видно.

Самое интересное, что такая муть - только для EditBox'ов.
Для Label, Button,GroupBox,CheckBox,RadioButton чужого процесса (потока?) - GET/SETWindowText() и WM_GET/SETTEXT работают нормально!
Да и просто для заголовка окна - тоже.

Чего это edit такой капризный? И че это за разные буфера для Функции и для сообщения?


Дата: Сен 29, 2004 14:36:56

Вот тут всё расписано, как и почему.
http://blogs.msdn.com/oldnewthing/archive/2003/08/21/54675.aspx


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073