运行,杀死和保持进程运行的正确方法

时间:2014-05-22 14:32:33

标签: c# wpf winforms process

在我的应用程序中,使用另一个应用程序(在托盘中运行)打印收据我需要做三件事:

  • 在mainApplication启动时打开进程
  • 当mainApplication关闭或更改有关打印机的任何信息时关闭进程
  • 如果出现任何错误,请保持进程处于活动状态

第一点很容易,我只是简单地

Process.Start("_ReceiptPrinter.exe");

处理工作;)

但是现在,另外两个问题:

  • 结束过程。我试过这段代码:

    Process[] allProcs = Process.GetProcesses();
    foreach (Process proc in allProcs)
    {
        ProcessThreadCollection myThreads = proc.Threads;
        if (proc.ProcessName == "_ReceiptPrinter")
        {
            proc.Close();
        }
    }
    

不幸的是,我仍然可以在托盘中看到图标,并且流程仍在运行。

  • 让进程保持活力。我的主要应用程序是在WPF中,来自托盘的一个是在WinForms上编写的。也许有办法处理任何 WinForm应用程序退出事件(好吧,任何,但不是这个,只是简单地从另一个应用程序关闭它),并重新打开它?

2 个答案:

答案 0 :(得分:3)

proc.Close()要求它关闭但没有保证。使用:

proc.Kill();

答案 1 :(得分:0)

您仍然看到托盘图标的原因是图标由外部进程缓存(Windows资源管理器。)

process.Close()没有关闭应用程序的原因是因为应用程序没有处理窗口消息(因为这个调用模拟了WM_CLOSE请求,按照经典的Windows API。)

关闭应用程序的正确方法是process.Close,而不是process.Kill(),此外,作为应用程序/窗口关闭的一部分,您需要取消注册您已在系统中注册的任何托盘图标。这样,任何正常关闭的应用程序都可以正确清理托盘。

此外,您可以使用"关键终结器"这将保证在应用程序退出之前运行,但总灾难情况除外。