Консольное приложение, отображающее окно сообщения при ошибке - PullRequest
2 голосов
/ 01 апреля 2010

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

Однако, если есть какие-либо ошибки, приложение поставщика покажет окно сообщения с кодом ошибки и сообщением об ошибке и подождет, пока кто-нибудь нажмет кнопку ОК. При нажатии кнопки «ОК» приложение выйдет с кодом ошибки в качестве кода выхода.

Поскольку мое приложение будет службой Windows на сервере, проблема в том, чтобы кто-то нажимал на кнопку «ОК». Просто интересно, каково было бы лучшее решение, чтобы обойти это.

Мой код вызова приложения поставщика: ...

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "someapp.exe"
startInfo.Arguments = "somefile.txt";

Process jobProcess = Process.Start(startInfo);
jobProcess.WaitForExit();

int exitCode = jobProcess.ExitCode;

1 Ответ

1 голос
/ 01 апреля 2010

Очень быстрый, неприятный и грязный код ниже. То, что вы действительно хотите сделать, - это создать цикл, который каждую секунду ищет определенное диалоговое окно или отправляет в него команду enter, если он ее видит. Это должно перевернуть вас, но пока (непроверено, кстати):

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "someapp.exe"
startInfo.Arguments = "somefile.txt";

Process jobProcess = Process.Start(startInfo);

//wait for the process to potentially finish...if it generally takes a minute to end, wait a minute and a half, etc
System.Threading.Thread.Sleep(60 * 1000);

Process[] processes = Process.GetProcessesByName("someapp");

if (processes.Length == 0)
{
  break; //app has finished running
}
else
{
  Process p = processes[0];  
  IntPtr pFoundWindow = p.MainWindowHandle;
  SetFocus(new HandleRef(null, pFoundWindow));
  SetForegroundWindow((int)pFoundWindow);
  SendKeys.SendWait("{ENTER}");          
}

int exitCode = jobProcess.ExitCode;

Вариант B состоит в том, чтобы изменить консольное приложение - найдите вызов MessageBoxA и замените его на MOV EAX, 1, чтобы диалоговое окно никогда не показывалось и пользователь не нажимал «ОК».

...