|
|
| Посл.отвђт | Сообщен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 |