как программно нажать на кнопку в запущенном приложении, используя код C # - PullRequest
4 голосов
/ 16 января 2011

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

Ответы [ 3 ]

6 голосов
/ 16 января 2011

Да, это возможно с Windows API. Вам нужно отправить сообщение в это окно. Сначала используйте Spy ++, чтобы получить идентификаторы всех кнопок, которые вы хотите нажать. Spy ++ - это инструмент Visual Studio, который показывает, какие сообщения отправляются приложению при нажатии этих кнопок. Затем используйте функцию PostMessage () (Windows API) для программной отправки того же сообщения.

Вы также можете, например, взглянуть на Winamp (музыкальный плеер для Windows), там есть документация о том, как нажимать его кнопки из внешнего приложения. Вы можете сделать то же самое для других приложений, вам просто нужно знать идентификаторы всех элементов управления и имена окон или их классов.

вот код для нажатия кнопки паузы в Winamp:

#define AMP_PAUSE 40046
HWND hwnd = FindWindow("Winamp v1.x", 0);
if(hwnd) SendMessage(hwnd, WM_COMMAND, AMP_PAUSE, 0);

Это написано на C ++. Если вы делаете это в C #, используйте PInvoke, чтобы получить доступ к Windows API. Я полагаю, вы знаете, как это сделать. На первом этапе FindWindow получает дескриптор окна, идентифицирует его по имени своего класса. Затем мы используем SendMessage или PostMessage для отправки сообщения. Существует четыре параметра: окно для отправки сообщения, идентификатор сообщения и два параметра.

В Spy ++ вы можете найти те параметры, которые вам нужны для FindWindow и SendMessage. Пожалуйста, запустите его и поиграйте с ним немного, чтобы увидеть, что он может сделать.

2 голосов
/ 16 января 2011

Если вы хотите избежать непосредственного использования WIN API, есть небольшая библиотека, которая может помочь вам в этом: WindowScrape .

Вы можете использовать его прямо из C #. Некоторые из особенностей:

  • Поиск окон и дочерних элементов управления, зарегистрированных в памяти.
  • Изменить заголовки окон
  • Изменить текст элементов пользовательского интерфейса (разрешения / конфиденциальность)
  • Нажмите на элементы пользовательского интерфейса
  • Прочитать заголовки окон
  • Читать текст из элементов пользовательского интерфейса
  • Навигация по иерархии объектов
  • Задать местоположение объекта
  • Установить размеры объекта

Могут быть и другие подобные библиотеки, но на данный момент это единственная, которую я знаю.

Отредактировано

Пример использования:

using System.Windows.Forms;

//WindowScrape
using WindowScrape.Types;

namespace WindowsFormsTestApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var npad = HwndObject.GetWindowByTitle("Untitled - Notepad");
        }
    }
}
1 голос
/ 16 января 2011

Если это приложение WPF, вы можете взглянуть на AutomationPeers

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