Windows应用程序 - 处理taskkill

时间:2016-07-20 12:00:20

标签: c# windows process

我有一个C#应用程序Output Type设置为Windows Application,所以它基本上只是一个在后台运行的进程。我可以在任务管理器中看到该进程,我正在尝试从命令行优雅地终止它,并且还能够在我的代码中处理此终止。我跑了taskkill /im myprocess.exe,消息是

  

成功:向进程“MyProcess.exe”发送终止信号   与PID 61

我的问题是,在此之后我仍然可以在任务管理器中看到该进程。如果我taskkill /f它会关闭它,但我肯定不希望这样,因为我需要在我的进程退出之前运行代码。

如何在我的应用程序中处理这个“终止信号”,以便我可以执行必要的退出前操作然后退出?

1 个答案:

答案 0 :(得分:4)

如果您查找taskkill实际执行you will find的内容,它会向流程的消息循环发送WM_CLOSE消息。因此,您需要找到一种方法来处理此消息并退出应用程序。

以下小型测试应用程序显示了一种方法。如果使用 CTRL + F5 快捷方式从Visual Studio运行它(以便进程在调试器外部运行),您实际上可以使用taskkill /IM [processname]关闭它。

using System;
using System.Security.Permissions;
using System.Windows.Forms;

namespace TaskKillTestApp
{
    static class Program
    {
        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
        private class TestMessageFilter : IMessageFilter
        {
            public bool PreFilterMessage(ref Message m)
            {
                if (m.Msg == /*WM_CLOSE*/ 0x10)
                {
                    Application.Exit();
                    return true;
                }
                return false;
            }
        }

        [STAThread]
        static void Main()
        {
            Application.AddMessageFilter(new TestMessageFilter());
            Application.Run();
        }
    }
}