我试图通过使用来自C#的命令args调用与供应商应用程序集成。它的意思是使我们需要执行的过程自动化,而无需任何人与应用程序进行交互。如果在运行该进程时没有错误,则可以正常工作。

但是,如果有任何错误,供应商应用程序将显示一个包含错误代码和错误消息的消息框,并等待某人单击“确定”按钮。单击确定按钮时,它将退出应用程序,并返回错误代码作为退出代码。

由于我的应用程序将成为服务器上的Windows服务,因此需要有人单击“确定”按钮将是一个问题。只是想知道最好的解决方案是解决这个问题。

我调用供应商应用程序的代码是...

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

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

int exitCode = jobProcess.ExitCode;

最佳答案

下面的代码非常快速,讨厌和肮脏。您真正想要做的是有一个循环,该循环每秒查找一个特定的对话框,或者在看到该对话框时向其发送回车。但是,这应该使您暂时不知所措(顺便说一句,顺便说一句):

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,这样对话框就不会显示出来,就像用户单击“确定”一样。

07-26 09:29
查看更多