【问题标题】:Console app showing message box on error控制台应用程序显示错误消息框
【发布时间】:2010-04-01 10:33:22
【问题描述】:

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

【问题讨论】:

  • 在控制台应用程序中使用消息框显示错误是一种糟糕的设计。这太可怕了。
  • 与其他厂商的应用相比,这部分还是不错的。 :(

标签: c# console-application messagebox


【解决方案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 以便对话框永远不会出现,就像用户单击“确定”一样。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多