我试图通过使用来自c#的命令args调用它来与供应商app集成。它旨在自动执行我们需要执行的过程,而不需要任何人与应用程序进行交互。如果在运行该过程时没有错误,则可以正常工作。
但是,如果有任何错误,供应商应用程序将显示一个包含错误代码和错误消息的消息框,并等待某人单击确定按钮。单击确定按钮后,它将退出应用程序,并将错误代码作为退出代码返回。
由于我的应用程序将成为服务器上的Windows服务,需要有人点击一个好的按钮将是一个问题。只是想知道解决这个问题的最佳解决方案是什么。
我调用供应商应用的代码是......
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "someapp.exe"
startInfo.Arguments = "somefile.txt";
Process jobProcess = Process.Start(startInfo);
jobProcess.WaitForExit();
int exitCode = jobProcess.ExitCode;
答案 0 :(得分: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以便对话框永远不会显示,就像用户单击“确定”一样。