【问题标题】:Windows Application - handle taskkillWindows 应用程序 - 处理 taskkill
【发布时间】:2016-07-20 12:00:19
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# windows process


    【解决方案1】:

    如果您查看 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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-18
      • 2017-08-21
      • 2019-08-03
      • 2016-09-08
      • 2011-09-23
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多