在错误时显示消息框的控制台应用程序

3

我正在尝试通过从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;

2
在控制台应用程序中使用消息框显示错误是一个非常糟糕的设计。那真的很糟糕。 - Zach Johnson
与其他供应商的应用相比,这部分还算不错。:( - holz
1个回答

1
下面是非常快速、肮脏的代码。你真正想做的是循环查找特定的对话框,每秒钟发送一个回车键,如果它看到了它。这应该能让你暂时解决问题,但是(顺便说一句,未经测试):
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,以便对话框永远不会显示出来,就像用户单击了“确定”一样。


我尝试过类似的方法,但当我的应用程序作为服务运行时它不起作用。该进程的MainWindowHandle值为零。 - holz
试一试。 - szevvy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接