На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Получить текст из Edit в чужом окне
    мне нужно получить текст из edit в чужом окне. Попытаюсь объяснить, к примеру я кидаю на форму эдит в объект инспекторе в свойство text что-то пишу, компилирую, смотрю spy++ текст из этита видно его так же можно получить например посылая сообщения WM_GETTEXT, но если я в процессе работы программы что-то напишу в этит spy++ все равно показывает то что было изначально и WM_GETTEXT тоже. А мне надо именно возможность получить тот текст который на данный момент в эдите. Погуглил наткнулся на функцию GetDlgItemText, возможно это то что я ищу, но я не пойму что мне передать вторым параметром? что за идентификатор элемента управления, где его взять?
      Цитата WinApi @
      GetDlgItemText

      Она используется, только если диалог загружен из ресурса, это не твой случай
        а как же тогда получить текст?
          Цитата Fr0sT @
          Она используется, только если диалог загружен из ресурса

          :no:
          Вообще, нет никакой разницы между окнами, загруженными из ресурса и созданными динамически. Все они в итоге создаются одинаково - регистрация класса с оконной процедурой + CreateWindow(Ex) + цикл обработки сообщений. Включая всяких "зверей" типа суперклассированных и message-only окон.

          Получить текст (он же заголовок) окна можно через WM_GETTEXT или GetWindowText. А для дочерних (не top-level) окон - ещё и через GetDlgItemText, поскольку любое такое окно имеет свой CtrlID (тот самый "идентификатор элемента управления"), получаемый через GetDlgCtrlID.

          Но часто бывает (особенно для Edit'ов), что взять текст окна, который отображается на экране просто не получится:
          -- обработчик WM_GETTEXT в оконной процедуре может по запросу отослать совсем другой текст (скажем, пустую строку).
          -- GetWindowText вообще читает текст окна из какой-то своей (одной ей известной) области памяти. Туда же, кстати SetWindowText пишет. Соотв-но, можно получить совсем не то, что ожидается.
          -- GetDlgItemText тоже часто возвращает только то, что получила от SetDlgItemText (т.е., опять получаем не то, что хотим).

          Подробности тут.

          Цитата WinApi @
          а как же тогда получить текст?

          Попробуй так
          ExpandedWrap disabled
            function WindowGetText(wnd:HWND):string;
            var
             szText:array[0..MAX_PATH-1] of Char;
             dw:Cardinal;
            begin
             Result:='';
             if ((SendMessageTimeOut(wnd,WM_GETTEXT,MAX_PATH,Cardinal(@szText),SMTO_ABORTIFHUNG,5000,dw) <> 0)
             and (dw<>0)) then Result:=szText;
            end;
            Цитата Krid @
            -- GetWindowText вообще читает текст окна из какой-то своей (одной ей известной) области памяти. Туда же, кстати SetWindowText пишет. Соотв-но, можно получить совсем не то, что ожидается.

            Эта "область" хранит название (заголовок\caption\title) окна - lpWindowName, переданное в CreateWindow(Ex). Поэтому, если бы не "притянутые за уши" эдит-контролы, хранящие свой текст отдельно от названия окна, то указанные функции (или хотя бы ф-ю InternalGetWindowText) было бы правильнее назвать Get\SetWindowName (или Caption\Title) - см."горячую" дискуссию на тему "чего не договаривает мсдн, или как ее читать между строк"

            Цитата Krid @
            Попробуй так

            Какой смысл пробовать вызывать GetWindowText для эдита чужого приложения, если он 100% вернет не реальный\текущий текст эдита, а лишь то, что попало в WindowName при его создании?!

            Цитата WinApi @
            но если я в процессе работы программы что-то напишу в этит spy++ все равно показывает то что было изначально и WM_GETTEXT тоже

            Spy++ юзает GetWindowText и соотв-но всегда показывает текст из WindowName, который для дельфийских эдитов = тому, что было задано в инспекторе объектов. А вот вызов SendMessage(..,WM_GETTEXT,..) для обычного\нормального эдита должен выдавать его текущий текст
              Цитата
              А вот вызов SendMessage(..,WM_GETTEXT,..) для обычного\нормального эдита должен выдавать его текущий текст

              смотри ка, работает )) :good:
                leo
                Цитата
                см."горячую" дискуссию на тему "чего не договаривает мсдн, или как ее читать между строк"

                Цитата
                Spy++ юзает GetWindowText и соотв-но всегда показывает текст из WindowName, который для дельфийских эдитов = тому, что было задано в инспекторе объектов. А вот вызов SendMessage(..,WM_GETTEXT,..) для обычного\нормального эдита должен выдавать его текущий текст

                упомянутая "горячая" дискуссия подсказывает, что у вас 6 версия Spy++, - это так? :)
                ибо после 6 (7...10) - Spy++ использует именно SendMessage(WM_GETTEXT)

                попутно и насчет "чего не договаривает мсдн, или как ее читать между строк":
                случай Джефри Рихтера (поначалу выбрал для Spy++ GetWindowText) вполне иллюстрирует ситуацию с мсдн :)
                Сообщение отредактировано: kero_xmemor -
                  !
                  По поводу упомянутой "горячей дискуссии" - не советую обоим, особенно товарищу kero_xmemor продолжать общение в том-же духе, как было в изначальной теме.
                  Пока что устное предупреждение.
                    Цитата leo @
                    Какой смысл пробовать вызывать GetWindowText для эдита чужого приложения, если он 100% вернет не реальный\текущий текст эдита, а лишь то, что попало в WindowName при его создании?!

                    Да, sorry. Брал кусок из одной своей ф-ции и лишний код зацепил. Конечно, GetWindowText тут не нужна.
                    Код поправил.

                    Цитата WinApi @
                    смотри ка, работает

                    Работает, если чужая прога не зависла. А если зависла, то зависнет и твоя, потому как будет до посинения ждать возврата из SendMessage. Так что тут лучше юзай SendMessageTimeOut (как в посте #4).
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0293 ]   [ 16 queries used ]   [ Generated: 21.08.25, 22:39 GMT ]