Как сделать программу, которая проверяет, открыто ли другое окно, а затем заполняет формы? - PullRequest
1 голос
/ 05 июля 2011

Я пытаюсь создать программу, которая проверяет, открыто ли определенное окно (из отдельной программы), а затем, если оно открыто, оно автоматически заполняет формы в этом окне.Я понятия не имею, с чего начать, я посмотрел его в Интернете и не смог найти ничего по теме.

Примером этого является попытка автоматически ввести информацию для входа в отдельную форму Windows.

Как бы это было сделано?Это вообще возможно?Если возможно, я хотел бы получить ответы на C #.

Ответы [ 7 ]

3 голосов
/ 05 июля 2011

Я бы посмотрел на Windows Automation API и на System.Windows.Automation пространство имен.

0 голосов
/ 06 июля 2011

Вам придется использовать Spy ++ или другой инструмент, чтобы получить имя класса и имя окна. Вероятно, они должны быть конфигурируемыми, не рекомендуется жестко кодировать значения. Здесь мы делаем цикл и ищем окно, а затем закрываем его. Я включил соответствующий импорт, подписи Windows API и пример кода.

//DLL Imports

using System.Runtime.InteropServices;

//For Sending Keys

using System.Windows.Forms;



        // Get a handle to an application window.
        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        private static extern IntPtr FindWindow(string lpClassName,
            string lpWindowName);

        // Activate an application window.
        [DllImport("USER32.DLL")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

Пример кода:

    IntPtr handle= IntPtr.Zero;
    int retryCount = 0;

    //Try until max is reached
    while (retryCount < 30)
    {
        //Get a handle to the window  
        handle= FindWindow(WindowClassName, WindowName);

        //We found the window
        if (handle!= IntPtr.Zero)
        {
            retryCount = 30;
            //Send Close Command 
            SetForegroundWindow(handle);
            SendKeys.SendWait("%{F4}");
        }

        retryCount++;
        //Wait 2 seconds before trying again
        System.Threading.Thread.Sleep(2000);
  }
0 голосов
/ 05 июля 2011

Это для веб-приложения или настольного приложения? Ответ будет сильно различаться в зависимости от того, какой это.

С веб-сайтами намного проще IMO - быстрый сценарий на Perl, использующий curl, вероятно, самый простой способ, а также отличный опыт обучения. Вы также можете использовать C # и API curl или просто вызывать C # Run () для выполнения вызовов командной строки для самого curl (консольного приложения). Суть: вам нужно сделать POST / GET HTTP-вызовы с заданной информацией. Fiddler - ваш друг здесь - используйте его, чтобы узнать, как веб-сайт ожидает звонки, а затем имитировать его, используя curl.

Приложение Windows потребует некоторых вызовов PInvoke для прокачки сообщений Windows в данном приложении; например C ++ здесь будет проще, в зависимости от вашего опыта / требований, или вы можете легко обернуть вызовы API C ++ в C # с помощью PInvoke. В любом случае, AFAIK, нет способа сделать это для приложения Windows в 100% -ом управляемом коде - я, конечно, могу ошибаться, но я никогда не видел этого и заинтересован в том, чтобы найти его возможным. Итог: вам нужно позвонить в win32 API, чтобы узнать, какое это окно, а затем отправить нажатия клавиш в это окно в соответствующих местах.

0 голосов
/ 05 июля 2011

Если вы можете ввести зависимость от WPF, изучите использование UI Automation Framework WPF.Он предназначен для использования как для автоматического тестирования пользовательского интерфейса, так и для вспомогательных технологий, таких как программы чтения с экрана, поэтому он определенно подойдет для заполнения формы в другом приложении.

0 голосов
/ 05 июля 2011

Это определенно возможно.

Вам понадобятся Win32 API для взаимодействия (получение дескрипторов для элементов управления других приложений и отправка им оконных сообщений);этот сайт бесценен: http://pinvoke.net/

Вам нужно будет понять элементы управления и способы их нацеливания.Бесценным для этого является Winspector Spy, но я думаю, что этого продукта больше не будет.Ищите альтернативы Winspector.Я знаю, что он поставляется с AutoHotkey (бесплатно), но я не думаю, что он такой же полнофункциональный, как Winspector.

Хотя вы, вероятно, можете написать несколько хороших оболочек для C # вокруг этого материала, большую часть работыдолжно быть сделано в Win32 API, а не в классах / методах .NET Framework.

0 голосов
/ 05 июля 2011

Чтобы найти окно с определенным заголовком, используйте interop из C # для вызова функции Win32 EnumWindows , которая даст вам характеристики и заголовки окон.Затем вы можете активировать окно и вызвать SendInput , чтобы отправить нажатия клавиш.

0 голосов
/ 05 июля 2011

AutoIt - это язык сценариев, специально разработанный для этой цели

http://www.autoitscript.com/

Если вам действительно нужно это в программе на C #, вы можете использовать интерфейс COM AutoIt.

РЕДАКТИРОВАТЬ: вот очень похожий вопрос:

Что такое хорошая, если таковая имеется, библиотека автоматизации Windows .NET?

Ответы, приведенные там, должны помочь вам.

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