Очистка экрана приложения Windows в C # - PullRequest
12 голосов
/ 17 декабря 2008

Мне нужно очистить данные из приложения Windows, чтобы выполнить запрос в другой программе. Кто-нибудь знает хорошую отправную точку для этого в .NET?

Ответы [ 5 ]

16 голосов
/ 17 декабря 2008

Возможно, вы захотите посмотреть сообщение WM_GETTEXT . Это может использоваться для чтения текста из других окон - это архаичная часть Windows API, и если вы находитесь в C #, вам потребуется p / invoke для этого.

Проверьте на этой странице для примера того, как сделать это в C #.

По сути, вы сначала FindControlEx (), чтобы получить дескриптор окна, которое вы хотите (по заголовку).

Во-вторых, вы рекурсивно перечислите элементы управления в этом окне с помощью EnumChildWindows (), чтобы найти все дочерние элементы управления окна и все эти дочерние элементы, пока у вас не будет полной карты целевой формы.

Вот выделенная часть превосходного объяснения Тета-га из ответов Google:

Чтобы получить содержимое любого элемента управления textbox или listbox, все, что нам нужно, - это дескриптор окна. Если вы уже получили ручку окна, переходите к части 2 объяснения.

ЧАСТЬ 1: Получение ручки управления

  • Чтобы получить дескриптор элемента управления, мы сначала получаем дескриптор его родительского окна. Мы можем сделать это с помощью метода Win32 FindControlEx (). Этот метод берет заголовок окна (например, «Калькулятор») и / или имя его класса и возвращает его дескриптор.
  • Как только мы получим дескриптор родительского окна, мы можем вызвать метод Win32 EnumChildWindows. Этот метод принимает метод обратного вызова, который он вызывает с дескриптором каждого дочернего элемента управления, который он находит для указанного родителя. Например, если мы вызовем этот метод с помощью дескриптора окна «Калькулятор», он вызовет метод обратного вызова с дескриптором элемента управления «текстовое поле», а затем снова с дескрипторами каждой из кнопок в окне «Калькулятор» и т. Д. .
  • Поскольку нас интересует только дескриптор элемента управления textbox, мы можем проверить класс окна в методе обратного вызова. Для этого можно использовать метод Win32 GetClassName (). Этот метод берет дескриптор окна и предоставляет нам строку, содержащую имя класса. Таким образом, текстовое поле принадлежит? Изменить? класс, список для класса «ListBox» и так далее. Как только вы определили, что у вас есть ручка для правильного управления, вы можете прочитать его содержимое.

ЧАСТЬ 2: чтение содержимого элемента управления

  • Вы можете прочитать содержимое элемента управления с помощью функции Win32 SendMessage () и использовать ее для передачи сообщения WM_GETTEXT целевому элементу управления. Это даст вам текстовое содержание элемента управления. Этот метод будет работать для текстового поля, кнопки или статического элемента управления.
  • Однако вышеприведенный подход потерпит неудачу, если вы попытаетесь прочитать содержимое списка. Чтобы получить содержимое списка, нам нужно сначала использовать SendMessage () с сообщением LB_GETCOUNT, чтобы получить количество элементов списка. Затем нам нужно вызвать SendMessage () с сообщением LB_GETTEXT для каждого элемента в списке.
8 голосов
/ 17 декабря 2008

Проверьте ManagedSpy, исходный код предоставляется. ( ссылка )

0 голосов
/ 23 июля 2012

screenscraperstudio.com

Создает VB-код "вашего диалогового окна скребка".

Я еще не купил его, так что могу ошибаться, но это единственный способ (если не считать того, что вы сами используете обмен сообщениями Spy ++, как другие способы ускользнуть от вышеупомянутого ...)

0 голосов
/ 17 декабря 2008

Coding The Wheel - статья о том, как он смог получить информацию из приложения для покера.

Проверка: deconstructing-the-poker-client-1 . Это может быть полезно.

0 голосов
/ 17 декабря 2008

"Возможно, вы сможете использовать System.Diagnostics.Process.GetProcessesByName (" ProcName ") и получить дескриптор главного окна, оттуда вы можете использовать Win32 API для получите дескриптор текстового поля, используемого для отображения текста, который вы хотите. С помощью ручки текстового поля вы можете получить или установить содержимое. я нет свист с Win32 API, но с небольшим исследованием я смог для выполнения аналогичных задач. Надеюсь, это поможет "

взято отсюда: http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic1657.aspx

...