【发布时间】:2020-10-08 23:36:27
【问题描述】:
使用C#,我需要打开一个程序,等到该程序完全加载完毕,然后我想运行cmd.exe运行附加命令来操作程序的原始实例。
我正在尝试让一个名为 GerbView 的特定程序以某种方式运行。该程序用于查看 Gerber 文件,PCB 制造商用于蚀刻 PCB 的文件。该程序可以使用自己的 Open 命令在内部加载 Gerber 文件。但是,我的程序旨在处理其中一些 Gerber 文件,然后使用 GerbView 加载这些已处理的 Gerber 文件。我能够完成此任务的唯一方法是通过命令行界面。可以打开 Gerber 文件的命令是 gerbview {filename}。
我知道 Process 类可以使用 FileName 和 Arguments 属性轻松完成此操作,但我需要向同一个实例添加更多文件。执行此操作的命令是 gerbview /add {filename}。
最后一个命令将启动程序,如果一个实例已经打开,它只会添加一个额外的文件来查看。现在这就是我的问题所在。在我提出最终解决方案(见下文)之前,我的程序一直打开多个实例(尽管使用了 /add 参数),可能是因为程序还没有准备好输入,而其余的 /add 参数正在执行。只有当我添加 1 秒延迟时,代码才能正确运行。但是,当我通过 Microsoft Teams 向某人展示时,旧行为又回来了,直到我增加了延迟(我假设 Teams 广播导致需要更大的延迟)。以下是我目前的解决方案(程序是windows窗体的一部分):
Process gerbView;
Process cmd;
bool gerbViewActive;
// The is the windows form constructor
public WindowsFormGUI()
{
InitializeComponent();
gerbViewActive = false;
}
private void buttonRunProgram_Click(object sender, EventArgs e)
{
OpenFileDialog loadFiles = new OpenFileDialog
{
Multiselect = true,
InitialDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).FullName
};
if (loadFiles.ShowDialog() == DialogResult.OK)
{
if (!gerbViewActive)
{
gerbView = new Process();
gerbView.EnableRaisingEvents = true;
gerbView.Exited += new EventHandler(GerbView_Exited);
gerbView.StartInfo.FileName = @"C:\Program Files\Software Companions\GerbView\gerbview.exe";
gerbView.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
gerbView.Start();
gerbViewActive = true;
}
// wait until GerbView loads before running the cmd process.
Thread.Sleep(2000);
string[] files = loadFiles.FileNames;
cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.WorkingDirectory = @"C:\Program Files\Software Companions\GerbView\";
cmd.Start();
using (StreamWriter cmdInput = cmd.StandardInput)
{
for (int index = 0; index < files.Length; index++)
{
cmdInput.WriteLine("gerbview.exe /add " + files[index]);
}
}
cmd.Close();
}
}
private void GerbView_Exited(object sender, EventArgs e)
{
gerbViewActive = false;
gerbView.Close();
}
任何帮助或建议将不胜感激。
【问题讨论】:
-
欢迎并祝贺您的第一篇文章!我喜欢您提供的详细信息,但我可以理解为什么有人会否决您-您需要更多地关注您的问题。此外,您可以展示更多的故障排除。祝您的解决方案一切顺利!
标签: c#