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

Тема в разделе "WASM.WIN32", создана пользователем sep, 26 сен 2004.

  1. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    Здравствуйте



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



    Спасибо
     
  2. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    В соответствующем буфере, который выделяется системой при создании эдита. Для эдитов со стилем DS_LOCALEDIT память под буфер выделяется приложением при помощи сообщения EM_SETHANDLE.
     
  3. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    То есть EM_GETHANDLE отдаст мне адрес начала буфера и я могу просто скопировать текст через movsb ?
     
  4. Foamplast

    Foamplast New Member

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

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    Это процесс изучения механизма работы системы.

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

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Тогда такой вопрос вдогонку: почему WM_GETTEXT и GetWindowText в некоторых Edit'ах возвращают разные значения (а WM_SETTEXT и SetWindowText соответственно успешно их записывают)? На Win32asm community вопрос уже поднимался, феномену подивились, но объяснения никто не сказал.
     
  7. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    CyberManiac

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

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98




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

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Foamplast:

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



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



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

    RobinFood New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2004
    Сообщения:
    45
    Адрес:
    Ukraine




    <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-->



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

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98




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

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    Правда какя-то фигня:

    Для чужого процесса WM_GETTEXT читает только то, что пишет WM_SETTEXT,

    GetWindowText читает только то, что пишет SetWindowText,

    а то, что пишет SetWindowText - нихрена не видно.



    Самое интересное, что такая муть - только для EditBox'ов.

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

    Да и просто для заголовка окна - тоже.



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

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615