Здравствуйте Вот возник вопрос по сабжу... Есть у меня например EditBox, и интересно узнать где же хранится тот текст который я в него только что набрал и могу получить функцией GetWindowText(...) ? Спасибо
В соответствующем буфере, который выделяется системой при создании эдита. Для эдитов со стилем DS_LOCALEDIT память под буфер выделяется приложением при помощи сообщения EM_SETHANDLE.
Не совсем. Полученное значение необходимо передать функции LocalLock(), а она вернёт адрес буфера. После окончании операций необходимо вызывать LocalUnlock(). Учти, что в Windows 95/98/Me это сообщение (EM_GETHANDLE) не пашет, как и EM_SETHANDLE. Эти сообщения пришли в Вин2000 из Windows NT 3.1. И вообще я не пойму, почему бы не воспользоваться функциями GetWindowTextLength() и GetWindowText(). А ещё есть сообщение WM_GETTEXT. Вся эта фигня с хэндлами буфера обычно не нужна.
Тогда такой вопрос вдогонку: почему WM_GETTEXT и GetWindowText в некоторых Edit'ах возвращают разные значения (а WM_SETTEXT и SetWindowText соответственно успешно их записывают)? На Win32asm community вопрос уже поднимался, феномену подивились, но объяснения никто не сказал.
Можно ввести в Edit какую-нибудь строку, а потом поискать ее в памяти процесса отладчиком. Так можно найти все буферы, в которых хранятся введенные данные, и заодно убедиться, что их несколько.
Foamplast: А что значит "разные значенiя"? Текст-то в эдите вполне определённый. Текстов на самом деле - два. Обнаружить это можно так: пишем простейшую программу, которая по хэндлу окна способна показывать тексты, получаемые через WM_GETTEXT и через GetWindowText; если писать вломы - берем уже готорую, например, мою (InqSoft Window Scanner). Потом жмем "Пуск|Выполнить программу", появляется окно с комбо-боксом, внутри комбо сидит Edit. Пишем в нем чего-нибудь, например, "ромашка" и натравливем на этот Edit программу. WM_GETTEXT успешно читает то, что мы написали, GetWindowText возвращает пустую строку. Но и это еще мелочи. При помощи SetWindowText (или того же Window Scanner) засовываем в это окно слово "хрен", его не видно. Заново читаем содержимое окна обеими способами и видим, что WM_GETTEXT показывает "ромашку", а GetWindowText - "хрен"!
<font color="blue]GetWindowText cannot retrieve the text of a control in another application.</font><!--color--> <font color="blue]SetWindowText cannot change the text of a control in another application.</font><!--color--> Они стараются. Очень стараются. Но делают только то, что могут - читают/пишут неизвестно_какую память в СВОЕМ процессе.
Похоже на то. Я попробовал, и в памяти подопытного процесса "хрен" не обнаружил, а после этого другой процесс благополучно получил "хрен" с помощью GetWindowText неизвестно откуда. То есть, если быть точным, Айс нашел несколько "хренов", но выше 0х80000000. А эта память в Win2000 общая для всех процессов, если я не ошибаюсь.
Правда какя-то фигня: Для чужого процесса WM_GETTEXT читает только то, что пишет WM_SETTEXT, GetWindowText читает только то, что пишет SetWindowText, а то, что пишет SetWindowText - нихрена не видно. Самое интересное, что такая муть - только для EditBox'ов. Для Label, Button,GroupBox,CheckBox,RadioButton чужого процесса (потока?) - GET/SETWindowText() и WM_GET/SETTEXT работают нормально! Да и просто для заголовка окна - тоже. Чего это edit такой капризный? И че это за разные буфера для Функции и для сообщения?