Как запустить другую программу и взаимодействовать с ее текстовым полем при полной загрузке (или в режиме ожидания) - PullRequest
0 голосов
/ 29 апреля 2019

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

Я уже написал некоторый код для этого, и он работает нормально, но я 'используя Thread.Sleep (), чтобы дождаться загрузки программы.Я думал о чем-то вроде WaitForInputIdle (), но я не уверен, как это работает.

private IntPtr handle;
private void launchProgram()
        {
                // Copy the text in the datafield to Clipboard
                Clipboard.SetText(serialTextBox.Text, TextDataFormat.Text);
                bool isRunning = Process.GetProcessesByName("Serial Search.exe").Any();
                using (Process process = new Process())
                {
                    if (!isRunning)
                    {                       
                        process.StartInfo.FileName = @"C:\Serial Search.exe";
                        process.Start();
                        // Give the process some time to startup - I want to remove this line and interact when fully loaded
                        Thread.Sleep(2000);
                        Process[] pname = Process.GetProcessesByName("Serial Search.exe");
                        if (pname.Length > 0)
                        {
                            handle = pname[0].MainWindowHandle;
                            SetForegroundWindow(handle);
                        }
                        var activatedHandle = GetForegroundWindow();
                        var vPprocess = Process.GetProcessesByName("Serial Search.exe");
                        while (GetActiveWindowTitle() == "Serial Search")
                        {
                            SendKeys.Send("^V");
                            SendKeys.Send("{ENTER}");
                            break;
                        }
                    }
                    else
                    {
                        Process[] pname = Process.GetProcessesByName("Serial Search.exe");
                        handle = pname[0].MainWindowHandle;
                        SetForegroundWindow(handle);
                        var activatedHandle = GetForegroundWindow();
                        var vPprocess = Process.GetProcessesByName("Serial Search.exe");
                        while (GetActiveWindowTitle() == "Serial Search")
                        {
                            SendKeys.Send("^A");
                            SendKeys.Send("^V");
                            SendKeys.Send("{ENTER}");
                            break;
                        }
                    }
                }
            }
        }

Я хочу удалить часть Thread.Sleep и просто заставить форму мгновенно взаимодействовать с .exe всякий раз, когда онзагружен.Есть идеи, как мне это сделать?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы можете упростить код до:

private IntPtr handle;
private void launchProgram()
{
    handle = IntPtr.Zero;
    string fullPathFileName = @"C:\Serial Search.exe";
    string friendlyFileName = System.IO.Path.GetFileNameWithoutExtension(fullPathFileName);
    Process P = Process.GetProcessesByName(friendlyFileName).FirstOrDefault();
    if (P != null)
    {
        handle = P.MainWindowHandle;
    }
    else
    {
        P = Process.Start(fullPathFileName);
        P.WaitForInputIdle();
        handle = P.MainWindowHandle;
    }

    if (!handle.Equals(IntPtr.Zero))
    {
        // Copy the text in the datafield to Clipboard
        Clipboard.SetText(serialTextBox.Text, TextDataFormat.Text);
        handle = pname[0].MainWindowHandle;
        SetForegroundWindow(handle);
        SendKeys.Send("^A");
        SendKeys.Send("^V");
        SendKeys.Send("{ENTER}");
    }
}

Обратите внимание, что Process.GetProcessesByName () ожидает «дружественную» версию имени файла без «.exe» в конце:

Имя процесса является понятным именем для процесса, например Outlook, это не включает расширение .exe или путь.

0 голосов
/ 29 апреля 2019

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

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