
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.121] |
![]() |
|
Сообщ.
#1
,
|
|
|
мне нужно получить текст из edit в чужом окне. Попытаюсь объяснить, к примеру я кидаю на форму эдит в объект инспекторе в свойство text что-то пишу, компилирую, смотрю spy++ текст из этита видно его так же можно получить например посылая сообщения WM_GETTEXT, но если я в процессе работы программы что-то напишу в этит spy++ все равно показывает то что было изначально и WM_GETTEXT тоже. А мне надо именно возможность получить тот текст который на данный момент в эдите. Погуглил наткнулся на функцию GetDlgItemText, возможно это то что я ищу, но я не пойму что мне передать вторым параметром? что за идентификатор элемента управления, где его взять?
|
Сообщ.
#2
,
|
|
|
Цитата WinApi @ GetDlgItemText Она используется, только если диалог загружен из ресурса, это не твой случай |
Сообщ.
#3
,
|
|
|
а как же тогда получить текст?
|
![]() |
Сообщ.
#4
,
|
|
Цитата Fr0sT @ Она используется, только если диалог загружен из ресурса ![]() Вообще, нет никакой разницы между окнами, загруженными из ресурса и созданными динамически. Все они в итоге создаются одинаково - регистрация класса с оконной процедурой + CreateWindow(Ex) + цикл обработки сообщений. Включая всяких "зверей" типа суперклассированных и message-only окон. Получить текст (он же заголовок) окна можно через WM_GETTEXT или GetWindowText. А для дочерних (не top-level) окон - ещё и через GetDlgItemText, поскольку любое такое окно имеет свой CtrlID (тот самый "идентификатор элемента управления"), получаемый через GetDlgCtrlID. Но часто бывает (особенно для Edit'ов), что взять текст окна, который отображается на экране просто не получится: -- обработчик WM_GETTEXT в оконной процедуре может по запросу отослать совсем другой текст (скажем, пустую строку). -- GetWindowText вообще читает текст окна из какой-то своей (одной ей известной) области памяти. Туда же, кстати SetWindowText пишет. Соотв-но, можно получить совсем не то, что ожидается. -- GetDlgItemText тоже часто возвращает только то, что получила от SetDlgItemText (т.е., опять получаем не то, что хотим). Подробности тут. Цитата WinApi @ а как же тогда получить текст? Попробуй так ![]() ![]() 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; |
Сообщ.
#5
,
|
|
|
Цитата 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,..) для обычного\нормального эдита должен выдавать его текущий текст |
Сообщ.
#6
,
|
|
|
Цитата А вот вызов SendMessage(..,WM_GETTEXT,..) для обычного\нормального эдита должен выдавать его текущий текст смотри ка, работает )) ![]() |
Сообщ.
#7
,
|
|
|
leo
Цитата см."горячую" дискуссию на тему "чего не договаривает мсдн, или как ее читать между строк" Цитата Spy++ юзает GetWindowText и соотв-но всегда показывает текст из WindowName, который для дельфийских эдитов = тому, что было задано в инспекторе объектов. А вот вызов SendMessage(..,WM_GETTEXT,..) для обычного\нормального эдита должен выдавать его текущий текст упомянутая "горячая" дискуссия подсказывает, что у вас 6 версия Spy++, - это так? ![]() ибо после 6 (7...10) - Spy++ использует именно SendMessage(WM_GETTEXT) попутно и насчет "чего не договаривает мсдн, или как ее читать между строк": случай Джефри Рихтера (поначалу выбрал для Spy++ GetWindowText) вполне иллюстрирует ситуацию с мсдн ![]() |
![]() |
Сообщ.
#8
,
|
|
! По поводу упомянутой "горячей дискуссии" - не советую обоим, особенно товарищу kero_xmemor продолжать общение в том-же духе, как было в изначальной теме. Пока что устное предупреждение. |
![]() |
Сообщ.
#9
,
|
|
Цитата leo @ Какой смысл пробовать вызывать GetWindowText для эдита чужого приложения, если он 100% вернет не реальный\текущий текст эдита, а лишь то, что попало в WindowName при его создании?! Да, sorry. Брал кусок из одной своей ф-ции и лишний код зацепил. Конечно, GetWindowText тут не нужна. Код поправил. Цитата WinApi @ смотри ка, работает Работает, если чужая прога не зависла. А если зависла, то зависнет и твоя, потому как будет до посинения ждать возврата из SendMessage. Так что тут лучше юзай SendMessageTimeOut (как в посте #4). |