Софт-Архив

Getwindowtext img-1

Getwindowtext

Рейтинг: 4.2/5.0 (1874 проголосовавших)

Категория: Windows: другое

Описание

GetWindowText - скачать бесплатно GetWindowText

GetWindowText 2.77

GetWindowText - небольшая портативная (не требующая инсталляции) утилита с помощью которой можно прочитать текст окна (заголовки). Необходимо зажать левую кнопку мыши и навести ее на выбранное окно, после чего в главном окне программы можно будет прочитать его заголовки. GetWindowText поддерживает просмотр дерева каталогов (SysTreeView32), выпадающие списки и списки представления (SysListView32), позволяя читать их содержимое.

Отзывы о GetWindowText 2.77

Действительно "изумительная" полная ЧУШЬ.

Жаль потраченного времени.

Den про GetWindowText 2.57 [21-10-2014]

Да, дерево левого окна проводникf показывает в тексте. Больше ничего от неё добиться не смог. Как ею пользоваться? Пишет название приложения из которого я пытаюсь получить текст.Похоже полная чушь. Win7 64

Andr про GetWindowText 2.56 [28-06-2014]

Достойная программа. Для удобства в работе - значок на панель задач рядом со значком любого онлайн переводчика.

Другие статьи, обзоры программ, новости

Windows API Урок 32

Windows API

Урок 32. Функция GetWindowText

Функция GetWindowText предназначена для получения заголовка окна. В некотором смысле эта функция противоположна функции SetWindowText, которая устанавливает оконный заголовок.

С точки зрения Windows окна - это не только окна приложения, но и контролы, располагающиеся на этих окнах. Например, checkbox'ы, кнопки или текстовые поля (edit'ы). У каждого такого окна есть HWND (потому, собственно говоря, они и являются окнами).

Вот пример кода, показывающий, как мы можем получить число, введенный пользователем в текстовое поле:

Тут hWndEdit - это хендл текстового поля. Наша функция прочитает только 4 байта из текстового поля - но в объявлении массива из char'ов мы пишем 5 элементов, так как последний элемент служит для хранения признака конца строки. Тоже самое и последний параметр функции GetWindowText - он задает, сколько байт (символов) мы собираемся прочитать (это включая нулевой байт - признак конца строки. Т. е. фактически число прочитанных байт будет на единицу меньше)

Функция GetWindowText возвращает число прочитанных байт.

У функции GetWindowText есть еще одна особенность - она не может читать данные из текстовых полей окон другой программы.

Функция GetWindowText

[in] Дескриптор окна или органа управления, содержащего текст.

[out] Указывает на буфер, который примет текст. Указатель на буфер, который получит текст. Если строка является такой же длины или длиннее, чем буфер, она обрезается и завершается символом NULL.

Устанавливает максимальное число символов для копирования в буфер, включая символ NULL. Если текст превышает это ограничение, он усекается.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение - длина, в символах, скопированной строки, не, включая символа конца строки (нуль-терминатора). Если у окна нет заголовка или текста, если строка заголовка - пустая строка или, если дескриптор окна или органа управления недопустимы, возвращаемое значение нулевое. Чтобы получать расширенные данные об ошибках, вызовите GetLastError .

Эта функция не может извлекать текст из поля элемента редактирования в другой прикладной программе.

Если целевое окно находится во владении текущего потока, функция GetWindowText вынуждена отправить сообщение WM_GETTEXT заданному окну или органу управления. Если целевое окно находится во владении другого потока и имеет заголовок GetWindowText извлекает текст заголовка окна. Если у окна нет заголовка, возвращаемое значение является нулевой строкой. Это поведение регулируется в соответствии с проектом. Оно позволяет прикладным программам вызвать функцию GetWindowText без зависания программы, если процесс, который владеет целевым окном, зависает. Однако если целевое окно зависаете, и оно принадлежит вызывающей программе, функция GetWindowText приведет к зависанию вызывающую программу.

Чтобы извлечь текст из органа управления в другом процессе, отправьте сообщение WM_GETTEXT непосредственно вместо вызова GetWindowText.

Смотри также

Блог GunSmoker-а (переводы): Тайная жизнь GetWindowText

вторник, 11 ноября 2008 г. Тайная жизнь GetWindowText

Функция GetWindowText сложнее, чем может вам показаться на первый взгляд. Документация пытается объяснить её сложность простыми словами, которые прекрасно подойдут, если вы не понимаете сложных слов, но это также значит, что вам говорят не всё.

Этот пост - попытка рассказать "всё".

Как окна управляют своим текстом

Для окна (в смысле WinAPI) существует два способа управлять своим текстом (заголовком). Они могут делать это сами или позволить делать это системе. По умолчанию управлением занимается система.

Если оконный класс даёт управление своим текстом системе, то система сделает следующее:

- Обработчик по-умолчанию для сообщения WM_NCCREATE возьмёт параметр lpWindowName (передваваемый CreateWindow/Ex) и сохранит его в "особом месте".

- Обработчик по-умолчанию для сообщения WM_GETTEXT копирует строку из этого "особого места".

- Обработчик по-умолчанию для сообщения WM_SETTEXT копирует строку в это "особое место".

С другой сторны, если оконный класс решит управлять своим текстом сам, то система не будет делать никаких дополнительных действий, а оконный класс будет обязан реагировать на сообщения WM_GETTEXT/WM_SETTEXT и руками сохранять/восстанавливать строку.

Каркасные классы обычно отдают управление текстом системе, а пользовательские классы предпочитают ручное управление.

GetWindowText

У функции GetWindowText есть одна маленькая проблема: она должна возвращать текст окна без зависания. К примеру, функции FindWindow нужно получать заголовки окон во время поиска. Приложениям по переключению задач (Task-switching applications) нужно получать заголовки окон для отображения в окошке переключения. Нельзя допустить, чтобы одно зависшее приложении влияло бы на другие приложения. Это было бы очень нехорошо.

Именно поэтому в этих сценариях не будет работать отправка сообщения WM_GETTEXT, потому что целевое для WM_GETTEXT окно может висеть. Чтобы избавиться от этой проблемы, GetWindowText должна использовать "особое место", т.к. оно не подвержено влиянию зависшего приложения.

С другой стороны, GetWindowText часто используется для чтения строк в элементах управления (контролах) диалогов, а эти контролы часто используют ручное управление текстом. Это требует отправки сообщения WM_GETTEXT, поскольку это единственный способ получения текста у окон с ручным управлением.

Поэтому GetWindowText использует компромиссное решение:

- Если вы пытаетесь использовать GetWindowText для окна в своём собственном процессе, то GetWindowText будет использовать сообщение WM_GETTEXT.

- Если вы пытаетесь использовать GetWindowText для окна в чужом процессе, то GetWindowText будет использовать строку из "особого места" и не будет отправлять сообщение.

Согласно первому правилу, если вы пытаетесь получить текст из окна в своём процессе, а окно при этом висит, то, конечно же, GetWindowText также повиснет. Но поскольку зависшее окно принадлежит вашему процессу, то это будет целиком вашей виной. Вы проиграли, а другие не пострадали - всё честно. При этом отправка сообщений WM_GETTEXT гарантирует корректную работу окон с ручным управлением текстом.

Согласно же второму правилу, если вы пытаетесь получить текст из окна в чужом процессе, тогда GetWindowText не будет отправлять сообщение - она просто прочтёт строку из "особого места". Поскольку самой частой причиной для вызова GetWindowText для окна чужого процесса является чтение заголовков окон и поскольку такие оконные классы используют системное управление, то такое поведение обычно приводит к желаемому результату.

Что касается документации, то она упрощает это до одной фразы: "GetWindowText() cannot retrieve text from a window from another application." ("GetWindowText не может читать текст из окна чужого приложения.").

Что, если мне не нравятся эти правила?

Если вас так уж отягощает второе правило (потому что вам нужно получать текст пользовательского контрола в чужом процессе), то вам никто не мешает слать WM_GETTEXT напрямую. Поскольку при этом вы не будете использовать GetWindowText, то вы и не окажетесь под влиянием этих правил.

Только не забудьте, что если интересующее вас окно будет висеть, то ваше приложение также повиснет, т.к. SendMessage не вернёт управление, пока целевое окно не ответит.

Также заметим, что поскольку WM_GETTEXT лежит в диапазоне базовых системных сообщений (от 0 до WM_USER-1), то вам не нужно делать никакой обработки параметров (и, фактически, вы не должны этого делать). Система автоматически скопирует строку из одного процесса в другой для вас.

А можешь дать пример, когда это на что-то влияет?

Рассмотрим такой элемент управления:

Пусть теперь приложение А делает:

И пусть у нас есть процесс Б, у которого есть описатель окна (hwnd = MyControl.Handle), созданного процессом А (не важно, как он его получил):

Этот код вернёт szBuf = 'Frappy', потому что это именно та строка, которая хранится в "особом месте".

Вернёт szBuf = 'Booga!'.

Интернет, программы, полезные советы: Захват текстового содержимого любых окон - программа GetWindowText

Захват текстового содержимого любых окон - программа GetWindowText

Твитнуть Захват текстового содержимого любых окон - программа GetWindowText

Здравствуйте!

Познакомьтесь с бесплатной, портативной и очень интересной программой, позволяющей производить захват текстового содержимого любых окон - программой GetWindowText. Долго думал над названием статьи, но ничего умного, отражающего суть программы так не придумал. Оставил, как есть. Работа программы может быть описана в нескольких словах. На Вашем экране есть какое-то окно, содержимое которого Вы хотите скопировать. Вызываете программу GetWindowText, нажимает на кнопку программы левой кнопкой мыши и, не отпуская левую кнопку мыши, тащите кнопку программы на нужное окно. В окне программы появляется текст из захваченного окна. Можно использовать эту программу, например, для перевода текстов окна интерфейса(пример я покажу ниже), можно захватывать тексты на любом другом языке. Программа умеет захватывать тексты, организованные в виде дерева(пример покажу) или списками. Программа установки не требует - портативна. Бесплатна. Русский язык поддерживается. Ссылка на скачивание приведена в конце статьи.

Вот исходный пример окна (на английском языке), текст которого Вам бы хотелось скопировать и перевести:

GetWindowText -> Форум на Исходниках

Пожалуйста. выделяйте текст программы тегом [сode=pas]. [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:

1. Преобразовать переменную типа String в тип PChar (PAnsiChar)

2. Как "свернуть" программу в трей.

3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)

4. Как запустить программу/файл? (и дождаться ее завершения)

5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)

(продолжение следует).

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

Повторная попытка - 60 дней. Последующие попытки - бан.

Мат в разделе - бан на три месяца.

Полезные ссылки:

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

Выразить свое отношение к модераторам раздела можно здесь: Rouse_. Krid. P.O.D

GetWindowText A tool to read the window title and text

GetWindowText 2.77

GetWindowText is a very small and portable program with which you can read the window text.

By clicking the left mouse button on the button with GetWindowText icon and by holding down the left mouse button (drag), the read can be started.

Then simply hold your mouse over the window from which the text should be read.

It can be read almost all the texts, e.g. from Edit, Static, Groupbox - Controls, etc.

This program supports also directory trees (SysTreeView32), combobox, and list views (SysListView32) to read the entire contents. When you release the mouse button, the reading will be finished.

* Support for x64 and x32 operating systems

"GetWindowText" does not have to be installed and can be executed easily from the desktop. It's one small, portable utility for Windows PC-s and is also a small usb-stick friend :)

# Employment! Operating systems: Windows 7. Windows 8 and 8.1. Windows Server 2008, Windows Vista, Windows 2003, Windows XP, Windows 2000, Windows Me, Windows NT

# Versions History

Непонятна работа GetWindowText

procedure TForm1.Timer1Timer(Sender: TObject);

 FW: HWND;

 s: string;

 i: integer;

 FW := GetForegroundWindow ;

 i := GetWindowTextLength(FW);

 SetLength(s, i);

 i := GetWindowText(FW, PChar(s), i);

 Edit1.text := s;

И как-то странно получается. Для всех окон, которые я пробовал, записывается заголовок за исключением последнего символа. А последним символом в S идет #0. С какого перепуга он туда пишется?

Ну допустим я это еще могу понять, просто надо SetLength делать на 1 больще.

Но! Если таким образом узнавать заголовок собственного окна - то код работает как я и ожидал - то есть, возвращает полностью заголовок.

Если не понятно - приведу пример. Допустим, в фокусе сейчас окно редактора кода, заголовок "unit1.pas". На первом присвоении I получается 9, что верно. На втором присвоении I получается 8! Девятым символом в S записывается #0. Это можно объяснить.

Но если в фокусе форма моего приложения, которая имеет заголовок "Form1", то на первом присвоении I равно 5, что также верно. А на втором присвоении I получается тоже 5! При этом никакой записи #0 в последний символ S не происходит!

Замечу, что код у меня именно такой, я его скопировал из окна редактора кода.

После серии экспериментов я пришел только к одному мнению - если функция возвращает заголовок окна своего потока, то она работает "правильно" - то есть, какое количество символов ты хочешь скопировать - такое она и копирует. Если же окно относится к другому потоку (или процессу - не проверял), то она копирует иначе.

Сижу и думаю - меня глючит что ли? Или это такой глюк в windows? По идее, вероятнее, что глючит меня, так как баг то вроде простой и его давно бы заметили, а я ничего такого не слышал. С другой стороны, код тоже элементарный, все на ладони, ходил с отладчиком - никаких погрешностей в своем коде не обнаружил.

Кто что скажет?

GetWindowTextLength

"If the function succeeds, the return value is the length, in characters, of the text. Under certain conditions, this value may actually be greater than the length of the text".

"If the target window is owned by the current process. GetWindowTextLength causes a WM_GETTEXTLENGTH message to be sent to the specified window or control."

"Under certain conditions, the GetWindowTextLength function may return a value that is larger than the actual length of the text. This occurs with certain mixtures of ANSI and Unicode, and is due to the system allowing for the possible existence of double-byte character set (DBCS) characters within the text. The return value, however, will always be at least as large as the actual length of the text; you can thus always use it to guide buffer allocation."

"To obtain the exact length of the text, use the WM_GETTEXT, LB_GETTEXT, or CB_GETLBTEXT messages, or the GetWindowText function."

GetWindowText

"If the window text string is as long or longer than the buffer, the string is truncated and terminated with a NULL character. "

"nMaxCount

[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated. "

Игорь Шевченко ©   (05.11.04 23:06) [1]

"If the target window is owned by the current process, GetWindowTextLength causes a WM_GETTEXTLENGTH message to be sent to the specified window or control."

тут по-моему неграмотно написано. У меня хелп от D7 и там вот что написано:

"If the function succeeds, the return value is the length, in characters, of the text. Under certain conditions, this value may actually be greater than the length of the text. For more information, see the following Remarks section."

Соответственно Remarks:

"This function causes a WM_GETTEXTLENGTH message to be sent to the specified window or control."

Ну и далее там идет ваш текст "Under certain conditions. "

Никаких current process.

Игорь Шевченко ©   (05.11.04 23:06) [1]

"nMaxCount

[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated. "

хм, у меня опять же по другому:

"nMaxCount

Specifies the maximum number of characters to copy to the buffer. If the text exceeds this limit, it is truncated"

Ну допустим эту фразу "including the NULL character" я предполагал в первом своем посте. Допустим, так (хоть у меня в хелпе этого и не написано). Но почему тогда код со своим окном отрабатывает корректно?

Из ваших пояснений я не понял ответа на свой вопрос.

Piter ©   (05.11.04 23:51) [2]