Чтение из текстового поля в другом приложении

Есть ли способ для приложения Windows получить доступ к другим данным приложений, а именно к текстовому полю ввода в графическом интерфейсе и захватить текст там для обработки в нашем собственном приложении?

Если это возможно, существует ли способ «защитить» ваше приложение, чтобы предотвратить его?

EDIT: три первых ответа, похоже, касаются получения заголовка другого приложения, а не определенного поля ввода текста в этом окне.

Я не ожидаю от Windows API, так что вы можете быть более точным, как я могу найти определенное текстовое поле в этом окне, каковы его предварительные требования (кажется, что знание дескриптора windows требуется, требуется ли знание текстового поля Как я могу это получить? и т.д. …)

Фрагменты кода на C ++ действительно были бы оценены по достоинству. MSDN-справка трудно просматривать, поскольку Win32-API имеет такие ужасные соглашения об именах.

Завершено! См. Мой ответ ниже для справки в C ++.

Для чтения текстового содержимого из текстового windows другого приложения вам нужно будет каким-то образом обработать окно управления текстовым полем. В зависимости от того, как разработан пользовательский интерфейс приложения (если он имеет пользовательский интерфейс), существует несколько способов, которыми вы можете воспользоваться для получения этого дескриптора. Вы можете использовать «FindWindow» / «FindWindowEx», чтобы найти свой элемент управления или использовать «WindowFromPoint», если это имеет смысл. В любом случае, когда у вас есть дескриптор текстового элемента управления, вы можете отправить ему сообщение «WM_GETTEXT», чтобы получить его содержимое (при условии, что оно является стандартным текстовым полем). Вот выдуманный образец (без ошибок проверки):

HWND hwnd = (HWND)0x00310E3A; char szBuf[2048]; LONG lResult; lResult = SendMessage( hwnd, WM_GETTEXT, sizeof( szBuf ) / sizeof( szBuf[0] ), (LPARAM)szBuf ); printf( "Copied %d characters. Contents: %s\n", lResult, szBuf ); 

Я использовал «Spy ++», чтобы получить дескриптор windows с текстовым полем, которое, казалось, лежало.

Что касается защиты ваших собственных текстовых полей от такого осмотра, вы всегда можете подclassифицировать свое текстовое поле (см. «SetWindowLong» с «GWL_WNDPROC» для параметра «nIndex») и выполнить специальную обработку сообщения «WM_GETTEXT» убедитесь, что обслуживаются только запросы одного и того же процесса.

Хорошо, я несколько понял это.

Начальная точка теперь точно знает дескриптор windows, мы знаем только частичное название windows, поэтому прежде всего найти это главное окно:

 ... EnumWindows((WNDENUMPROC)on_enumwindow_cb, 0); ... 

который перечисляется через все windows на рабочем столе. Он выполняет обратный вызов с каждым из этих оконных дескрипторов:

 BOOL CALLBACK on_enumwindow_cb(HWND hwndWindow, LPARAM lParam) { TCHAR wsTitle[2048]; LRESULT result; result = SendMessage(hwndWindow, WM_GETTEXT, (WPARAM) 2048, (LPARAM) wsTitle); ... 

и с помощью wsTitle и небольшой магии регулярных выражений мы можем найти нужное окно.

Используя ранее упомянутый Spy ++, я мог бы выяснить имя classа поля редактирования текста и использовать его для поиска искомого поля в hwndWindow :

 hwndEdit = FindWindowEx(hwndWindow, NULL, L"RichEdit20W", NULL); 

и затем мы можем прочитать текст из этого поля:

 result = SendMessage(hwndEdit, WM_GETTEXT, (WPARAM) 4096, (LPARAM) wsText); 

Надеюсь, это поможет любому, кто сражается с той же проблемой!

Посмотрите на AutoHotkey . Если вам нужен API для вашего приложения, посмотрите на их источники. Чтобы предотвратить это, используйте собственный виджет вместо WinForms, MFC или Win32 API. Это не безупречно, но помогает.

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

Да, это возможно во многих отношениях (один способ – использовать WINAPI GetWindow и GetWindowText).

Сначала возьмите дескриптор текстового поля, из которого вы хотите получить текст (используя FindWindow, EnumChildWindows и другие API), а затем:

Старый VB6-codeexample, декларация API:

 Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long 

Код для извлечения текста:

 Dim MyStr As String MyStr = String(GetWindowTextLength(TextBoxHandle) + 1, Chr$(0)) GetWindowText TextBoxHandle, MyStr, Len(MyStr) MsgBox MyStr 

Вы также можете получить текст из элемента управления richedit с сообщением EM_GETTEXTRANGE, но он работает только в том же процессе, в котором был создан элемент управления.

 HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName ); 

http://msdn.microsoft.com/en-us/library/ms633499.aspx

  • Переместить макеты, когда отображается мягкая клавиатура?
  • Создание пользовательской кнопки в Java с помощью JButton
  • Как совместить прослушиватели событий с запросом на событие?
  • Как установить фоновое изображение в JPanel
  • Создать редактор гитарных аккордов в WPF (из RichTextBox?)
  • Как подключить одну панель к другой
  • как выйти из блокировки XNextEvent xlib
  • Сериализовать компоненты JavaFX
  • Редактор графического редактора Netbeans, создающий собственный непонятный код
  • Как я могу улучшить внешний вид приложения для Android?
  • Как удалить все дочерние элементы?
  • Interesting Posts

    Сериализуемые classы и динамические прокси в EF – как?

    Как создать круговой (бесконечный) RecyclerView?

    Чрезмерное торрентирование и здоровье жесткого диска

    Изменение каталога хранилища данных MongoDB

    Высококачественное сжатие JPEG с помощью c #

    Как сопоставить / скопировать кнопку мыши в качестве кнопки на клавиатуре в Windows 7?

    Какой источник питания мне нужен для поддержки моей системы?

    Компьютер загружается на черный экран PXE, затем сообщает «нет загрузочного устройства»,

    Как добавить звездочку в текстовый редактор MS Word

    Высота анимации jQuery

    Как я могу использовать несколько сводных таблиц на одном листе без ошибки перекрытия?

    Как скрыть (не удалять) любой контакт из списка Skype?

    Есть ли причина не использовать целые типы фиксированной ширины (например, uint8_t)?

    Как вы можете заставить Excel 2007 прекратить форматирование больших чисел в качестве научной нотации?

    Ошибка Xcode при загрузке в App Store: «Не найдено подходящих записей приложений»

    Давайте будем гением компьютера.