Как получить текст из окна имеющего в данный момент фокус?
От: Аноним  
Дата: 23.06.04 19:49
Оценка:
Как получить текст из окна имеющего в данный момент фокус (окно не мое, а произвольного приложения)?
Re: Как получить текст из окна имеющего в данный момент фоку
От: Zhukov  
Дата: 24.06.04 00:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Как получить текст из окна имеющего в данный момент фокус (окно не мое, а произвольного приложения)?


Ставь глобальный хук, например, на активизацию окна (msdn->hooks).
Этот хук должен храниться в dll. Теперь Dll будет подгружаться в адресное пространство любого процесса, активизируещего окно. Ну, а находясь в адресном пространстве процесса можно использовать функцию GetWindowText.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Как получить текст из окна имеющего в данный момент ф
От: shapod Украина  
Дата: 24.06.04 03:27
Оценка:
Здравствуйте, Zhukov

> Ну, а находясь в адресном пространстве процесса можно использовать функцию

GetWindowText.

IMHO: этой функции "по барабану" в каком адресном пространстве она
находится. Главное хедел окна иметь. А хендел окна получаем через
GetFocus().

Хук для этой задачи ставить стоит, только если ты синхронно хочешь ловить
все изменения текста.

Шаповаленко Денис.
Posted via RSDN NNTP Server 1.9 beta
Re[3]: Как получить текст из окна имеющего в данный момент ф
От: shapod Украина  
Дата: 24.06.04 03:39
Оценка:
Отвечу сам себе Еще не проснулся... и слегка ошибся.
> IMHO: этой функции "по барабану" в каком адресном пространстве она
находится.

Функции не "по барабану".
В вашем случае нужно послать WM_GETTEXT:

[msdn]
To retrieve the text of a control in another process, send a WM_GETTEXT
message directly instead of calling GetWindowText
[/msdn]

Шаповаленко Денис.
Posted via RSDN NNTP Server 1.9 beta
Re[4]: Как получить текст из окна имеющего в данный момент ф
От: Zhukov  
Дата: 24.06.04 04:33
Оценка:
Здравствуйте, shapod, Вы писали:


S>Отвечу сам себе Еще не проснулся... и слегка ошибся.

>> IMHO: этой функции "по барабану" в каком адресном пространстве она
S>находится.

S>Функции не "по барабану".

S>В вашем случае нужно послать WM_GETTEXT:

S>[msdn]

S>To retrieve the text of a control in another process, send a WM_GETTEXT
S>message directly instead of calling GetWindowText
S>[/msdn]

И ещё не по барабану, какая версия ОС. В 2000 и старше Ваш подход не сработает,
поэтому юзать хуки.

S>Шаповаленко Денис.
... << RSDN@Home 1.1.3 stable >>
Re: Как получить текст из окна имеющего в данный момент фоку
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 24.06.04 10:31
Оценка: 6 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Как получить текст из окна имеющего в данный момент фокус (окно не мое, а произвольного приложения)?


Где-то я уже писал:

HWND hForeground = 0; 
HWND hFocused = 0;
DWORD dwForegroungThreadID = 0;
DWORD dwCurrentTreadID = 0;
TCHAR achBuffer[BUFFER_SIZE + 1];

hForeground = ::GetForegroundWindow();
dwForegroungThreadID = ::GetWindowThreadProcessId(hForeground, NULL);
dwCurrentTreadID = GetCurrentThreadId();

hFocused = ::GetFocus();

::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, TRUE);
::SendMessage(hFocused, WM_GETTEXT, BUFFER_SIZE, (LPARAM)achBuffer);
::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, FALSE);


В achBuffer получили текст.
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: Как получить текст из окна имеющего в данный момент ф
От: SergH Россия  
Дата: 24.06.04 10:53
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>В achBuffer получили текст.


Хороший способ. Еще можно WM_GETTEXTLENGTH послать для определения длинны.
Делай что должно, и будь что будет
Re[3]: Как получить текст из окна имеющего в данный момент ф
От: BlackHeretic Израиль  
Дата: 24.06.04 11:09
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Нахлобуч, Вы писали:


Н>>В achBuffer получили текст.


SH>Хороший способ. Еще можно WM_GETTEXTLENGTH послать для определения длинны.


Все равно хуки нужны. Если это Edit со стилем ES_PASSWORD, то тока через хуки
ICQ 156156278
Re: Как получить текст из окна имеющего в данный момент фоку
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 24.06.04 14:40
Оценка: 1 (1) -1
Hello , you wrote:

> Как получить текст из окна имеющего в данный момент фокус (окно не мое,

> а произвольного приложения)?

В общем случае — никак.
В частном может получится использованием WM_GETTEXT.

--
Всего хорошего, Слава
http://slava.users.otts.ru
Posted via RSDN NNTP Server 1.9 beta
Re[2]: Как получить текст из окна имеющего в данный момент ф
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.06.04 16:10
Оценка:
Н>Где-то я уже писал:

Н>
Н>::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, TRUE);
Н>::SendMessage(hFocused, WM_GETTEXT, BUFFER_SIZE, (LPARAM)achBuffer);
Н>::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, FALSE);
Н>


Н>В achBuffer получили текст.


??? Зачем аттачится к imput queue целевого треда? Поясните?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Как получить текст из окна имеющего в данный момент ф
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.06.04 16:11
Оценка: 1 (1)
Н>>В achBuffer получили текст.

SH>Хороший способ. Еще можно WM_GETTEXTLENGTH послать для определения длинны.


Что в нем хорошего? Какой смысл в аттаче к input queue?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Как получить текст из окна имеющего в данный момент ф
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.06.04 16:12
Оценка:
Z>И ещё не по барабану, какая версия ОС. В 2000 и старше Ваш подход не сработает,
Z>поэтому юзать хуки.

Сработает.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Как получить текст из окна имеющего в данный момент ф
От: SergH Россия  
Дата: 24.06.04 16:41
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Что в нем хорошего? Какой смысл в аттаче к input queue?


Ну тормознул я, тормознул

А так, мысли следующие:
— получить окно с фокусов ввода — задача нетривиальная, GetFockus действует только в раках потока. Но c этим Attach, очевидно не справится.
— как минимум запароленые едиты в Win2000 не отдают свой текст насторону. Может для этого? Хотя поможет ли?

В общем, не знаю.
Делай что должно, и будь что будет
Re[5]: Как получить текст из окна имеющего в данный момент ф
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.06.04 17:03
Оценка: 37 (3) +1
AS>>Что в нем хорошего? Какой смысл в аттаче к input queue?

SH>Ну тормознул я, тормознул


Эээ... кхм. ок, по пунктам

SH>А так, мысли следующие:

SH>- получить окно с фокусов ввода — задача нетривиальная, GetFockus действует только в раках потока. Но c этим Attach, очевидно не справится.

Отнюдь, он справится, но не в ТАКОМ виде:

hFocused = ::GetFocus();
::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, TRUE);
::SendMessage(hFocused, WM_GETTEXT, BUFFER_SIZE, (LPARAM)achBuffer);
::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, FALSE);

В таком
::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, TRUE);
hFocused = ::GetFocus();
::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, FALSE);
::SendMessage(hFocused, WM_GETTEXT, BUFFER_SIZE, (LPARAM)achBuffer);

будет работать как надо.
Т.е. сам процесс получения текста труда не представляет, проблема в получении окна, которому принадлежит фокус ввода.

SH>- как минимум запароленые едиты в Win2000 не отдают свой текст насторону. Может для этого? Хотя поможет ли?

Насчет запороленых эдитов было какое то очень простое и оригинальное решение... сейчас поищу. Вот:
http://www.theone.ru/lists/bugtraq/msg01741.html
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: Как получить текст из окна имеющего в данный момент ф
От: SergH Россия  
Дата: 24.06.04 17:30
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Насчет запороленых эдитов было какое то очень простое и оригинальное решение... сейчас поищу. Вот:

AS>http://www.theone.ru/lists/bugtraq/msg01741.html

Вот это дыра! Браво, Microsoft!
Делай что должно, и будь что будет
Re[5]: Как получить текст из окна имеющего в данный момент ф
От: shapod Украина  
Дата: 24.06.04 17:40
Оценка:
Здравствуйте, Zhukov
> И ещё не по барабану, какая версия ОС. В 2000 и старше Ваш подход не
сработает,
> поэтому юзать хуки.

Да вы шо? Как любят у нас в одной конференции говорить: URL? (т.е.
откуда такая информация)

Сам пользовал в XP Pro.

Правда есть куча "НО". Условие задано некорректно: что за окно, какие у него
стили и т.п?

Шаповаленко Денис.

PS: Смотрю повальная мода на хуки пошла.
Posted via RSDN NNTP Server 1.9 beta
Re[6]: Как получить текст из окна имеющего в данный момент ф
От: SergH Россия  
Дата: 24.06.04 17:44
Оценка:
Здравствуйте, shapod, Вы писали:

S>PS: Смотрю повальная мода на хуки пошла.


Ну так, хук левой — вещь смертельная..
Делай что должно, и будь что будет
Re[6]: Как получить текст из окна имеющего в данный момент ф
От: Аноним  
Дата: 13.07.04 17:44
Оценка:
Здравствуйте, Andrew S, Вы писали:

::SendMessage(hFocused, WM_GETTEXT, BUFFER_SIZE, (LPARAM)achBuffer);

AS>будет работать как надо.
AS>Т.е. сам процесс получения текста труда не представляет, проблема в получении окна, которому принадлежит фокус ввода.

Этот метод работает , но не со всеми окнами. Например, не работает с окном редактора VS.NET. Возвращает пустую строку. Как это исправить?
Re[7]: Как получить текст из окна имеющего в данный момент ф
От: Andrew S Россия http://alchemy-lab.com
Дата: 13.07.04 18:11
Оценка: :)
А>Этот метод работает , но не со всеми окнами. Например, не работает с окном редактора VS.NET. Возвращает пустую строку. Как это исправить?

Вероятно, переписать студию?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.