Process.StartInfo澄清c#

时间:2017-05-11 10:29:05

标签: c# .net wpf process kill


我正在尝试使用Process类从主要进程中运行另一个进程。

AudioRecordProcess = new Process();
AudioRecordProcess.StartInfo.UseShellExecute = false;
AudioRecordProcess.StartInfo.FileName = @"RecordAudio\RecordAudio";
AudioRecordProcess.StartInfo.CreateNoWindow = true;

这个过程开始很好但是:

  • 即使我在运行代码时设置了CreateNoWindow属性,也会创建一个窗口(另一个进程是一个只有主窗口的WPF项目);
  • 当我尝试使用closemainwindow关闭进程时,它什么都不关闭。窗口只是在主过程'one。
  • 之下
  • 如果我尝试从代码中终止进程,它不会在我关闭主窗口的事件中执行指令,但是如果我从任务栏关闭它,它会执行该例程。这些行动不应该相同吗?

对这种奇怪行为有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:0)

课程'流程'用于创建和/或控制和监控特定过程。

  • 只有控制台应用程序才会服从CreateNoWindow = true,而 Windows窗体和WPF应用程序将忽略它。

  • 由于您已在系统上启动了另一个进程,即该进程 将继续自行,一旦停止,将不会终止 父进程。然而,有一些资源挥之不去(特别是 在父进程中阻止的线程和句柄相关) 父进程在其主窗口关闭时终止。

  • 杀死中断正常的进程执行并强制停止 因此,关闭处理程序是正常的 执行

修改

对于test创建WPF应用程序并将以下代码放入其中:

    public MainWindow() {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
        Closed += MainWindow_Closed;
    }

    private Process process;

    private void MainWindow_Closed(object sender, EventArgs e) {
        // Log("WpfApp3.log", $"{DateTime.Now} Closed");
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) {
        // Log("WpfApplication3.log", $"{DateTime.Now} Loaded");
        process = new Process {
            StartInfo = {
                UseShellExecute = false,
                // FileName = @"..\..\WpfApp2\bin\Debug\WpfApp2.exe",
                FileName = @"..\..\CnslApp1\bin\Debug\CnslApp1.exe",
                // FileName = @"..\..\WnFrmApp2\bin\Debug\WnFrmApp2.exe",
                CreateNoWindow = true
            }
        };
        process.Start();
        var result = process.CloseMainWindow();
        if (result) {
          ...
        }
    }

然后创建三个新项目;每个控制台/ Windows窗体/ WPF一个。并在“' FileName' StartInfo的参数。然后,您可以使用参数来查看每个参数的行为。

在我的情况下,process.CloseMainWindow()确实没有效果,直到被移入另一个方法,因为进程尚未启动。但是一旦进入按钮处理程序并执行它将终止所有三种类型(在本例中可以使用一种类型)。

当窗口被隐藏时,唯一的例外是控制台应用程序。