代码之家  ›  专栏  ›  技术社区  ›  lazzy_ms L.D

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

  •  2
  • lazzy_ms L.D  · 技术社区  · 6 年前

    我已经在我的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"));
    }
    

    我在网上找到了一个解决方案,SendKeys,但我不明白。 附言:有些问题可能是重复的,但有些问题对我不起作用。

    提前谢谢你

    4 回复  |  直到 6 年前
        1
  •  2
  •   lazzy_ms L.D    6 年前

    感谢@mjwills对我的指导。

    后来,我发现 process.Start() 在本例中,启动了两个不同的进程。一个是 命令提示符 另一个是 node.exe 是的。

    process.Kill() 只杀了 命令提示符 是的。所以,我想我必须找到 node.exe 处理并杀死它。

    我有两个解决方案:

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

    foreach(var node in Process.GetProcessesByName("node"))
    {
       node.Kill();
    }
    

    2. 正如我在问题中提到的,使用 SendKeys.SendWait("^(C)"); 是的。

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

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

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {   
        Process proc = Process.GetProcessById(pid);
        IntPtr h = proc.MainWindowHandle;
        SetForegroundWindow(h);
        SendKeys.SendWait("^(C)");          
    }
    
        2
  •  1
  •   Backs    6 年前

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

        3
  •  -1
  •   Hossein Golshani    6 年前

    将此行添加到窗体的构造函数:

    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.
    
        4
  •  -2
  •   zacs    6 年前

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

    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 {}
    }