在应用程序关闭时停止在C#中启动的命令行过程

时间:2018-07-12 09:54:15

标签: c# windows command-line process

我已经在C#应用程序中通过以下按钮单击事件启动了一个过程,

System.Diagnostics.Process process = new System.Diagnostics.Process();
private void btnOpenPort_Click(object sender, RoutedEventArgs e)
{
    System.Diagnostics.ProcessStartInfo startInfo = new 
    System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "http-server";
    // startInfo.Arguments = "/C http-server -p 8765";
    this.process.StartInfo = startInfo;
    this.process.Start();                     
}

现在,我想在应用程序窗口关闭时停止此命令行过程。就像我在“命令提示符”中编写命令一样,我通常会按 Ctrl + C 来停止执行。

编辑:我有此事件,单击关闭按钮时会触发。

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    Int32 result = DllWrapper.HdsDestroy();
    MessageBox.Show("Destroy result = " + (result == 0 ? "Success" : "Fail"));
}

我在Internet上找到了一个解决方案,SendKeys,但我听不懂。 PS:这可能是某些问题的重复,但有些问题对我不起作用。

先谢谢您

4 个答案:

答案 0 :(得分:2)

感谢@mjwills指导我。

后来,我发现 FirefoxOptions options=new FirefoxOptions(); options.setProfile(profile); WebDriver dd=new FirefoxDriver(options); 在这种情况下启动了两个不同的过程。一个是 cmd.exe ,另一个是 node.exe

process.Start()仅杀死 cmd.exe 。因此,我发现必须找到 node.exe 进程并将其杀死。

我有两种解决方法:

1。。这可能会停止所有名为 node.exe 的进程,但现在对我有用。

process.Kill()

2。。正如我在问题中提到的,请使用foreach(var node in Process.GetProcessesByName("node")) { node.Kill(); }

SendKeys.SendWait("^(C)");

导入此dll文件以在前台获取命令行窗口。然后我像这样修改了“关闭”按钮事件。

[DllImport("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);

答案 1 :(得分:1)

致电process.Kill(); method,这将停止关联的进程。

答案 2 :(得分:-1)

将此行添加到Form的构造函数中:

Application.ApplicationExit += (s, ev) => process.Kill();

编辑

使用此代码:

if (process.MainWindowHandle != IntPtr.Zero)
    process.CloseMainWindow(); // this Closes process by sending a close message to its main window.
else
    process.Kill(); // this kills Hidden window
process.Close(); // Frees all resources that are associated with process.

答案 3 :(得分:-2)

处理应用程序退出事件并在此事件处理程序中关闭进程。

public static event EventHandler ApplicationExit

示例:

// Attache Handler to the ApplicationExit event.
Application.ApplicationExit += new EventHandler(this.OnApplicationExit);

处理程序:

private void OnApplicationExit(object sender, EventArgs e) {

    try {
        // Ignore any errors that might occur while closing the file handle.
        process.Kill();
    } 
    catch {}
}