Как программно взаимодействовать с приложением - PullRequest
9 голосов
/ 05 января 2009

Я, скорее всего, скоро буду работать над несколькими проектами, где мне нужно будет взять данные из файла и программно ввести эти данные в другое стороннее (не мое) приложение. Одна проблема: я понятия не имею, как это сделать. Мне нужно будет ввести данные (например, время на табеле, например). Может ли кто-нибудь направить меня в правильном направлении, чтобы приобрести этот навык?

ДОПОЛНИТЕЛЬНЫЕ РЕКВИЗИТЫ: Я написал оригинальное сообщение поздно ночью, поэтому, возможно, не был настолько подробным, как следовало бы. Вот пример: у моего клиента есть приложение ERP, которое они используют для сбора отметок времени у линейных работников, когда они выполняют свою работу и выдают проекты за дверью в течение дня. Это приложение не имеет API, который я могу использовать для подачи данных. Я слышал о парне, который смог на самом деле выдвинуть данные на экран в окнах этого приложения и программно управлять ими, чтобы данные можно было собирать, скажем, в лист Excel, а затем эффективно загружать в это приложение. Вроде обратный скребок экрана. Это не очень похоже на API, но работает.

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

Спасибо за комментарии и ответы, я преследую их всех.

Ответы [ 7 ]

10 голосов
/ 05 января 2009

Вы можете автоматизировать его с помощью скрипта AutoIt . Это простой язык сценариев, который скрывает некоторые сложности отправки сообщений в окна и элементы управления.

6 голосов
/ 05 января 2009

Различные приложения позволяют программно управлять ими различными способами. Два наиболее распространенных подхода:

1) Некоторые приложения предоставляют аргументы командной строки. Пример:

c:\> someapp.exe arg1 arg2

Вы можете вызывать такие приложения из программы на C ++ с помощью следующего вызова:

System("C:\\>someapp.exe arg1 arg2");

2) Другие приложения могут предоставлять гораздо более мощные объектно-ориентированные API. Например, Microsoft Excel позволяет вам программировать его, используя само приложение как объект в вашей программе на C #:

Excel.Application excelApp = new Excel.App()

Когда у вас есть объект приложения, вы можете вызывать методы для управления его поведением. Например, вы можете открыть новый файл Excel с последующим вызовом, например так:

excelApp.Workbooks.Open("\\Somefile.xls", ...);

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

3 голосов
/ 05 января 2009

Я думаю, FindWindow и SendMessage - это функции, которые вы хотите использовать, в общем.

3 голосов
/ 05 января 2009

Это может быть очень и очень сложно, если приложение не предназначено для взаимодействия с ним. Вам нужно будет отправить смоделированные события (например, чтобы сделать вид, будто мышь что-то делает). Один из способов сделать это - написать драйвер мыши, который не подключается к реальной мыши. Но, как я уже сказал, это зависит от приложения. Приложения с большими пользовательскими базами часто имеют API-интерфейсы для обеспечения программного взаимодействия или имеют встроенные возможности сценариев (поэтому вы можете вместо этого заставить приложение использовать ваш код).

0 голосов
/ 05 января 2009

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

0 голосов
/ 05 января 2009

Или, если вы хотите быть еще более «взломанным», начните читать память программы и вводить данные напрямую. : P

Но это может быть очень сложно, и часто вообще не работает из-за того, как программа использует память.

0 голосов
/ 05 января 2009

Однажды я сделал нечто подобное, когда веб-приложение контролировало приложение Windows. Я использовал много Win32 API для этого. Если ваше приложение похожее, то для начала поищите удаленный контроллер Winamp с открытым исходным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...