【问题标题】:Does windows /f teminate processes on shutdown?windows / f 是否会在关机时终止进程?
【发布时间】:2016-07-23 11:18:46
【问题描述】:

我正在使用以下代码在我的进程中处理taskkill

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
private class TestMessageFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == /*WM_CLOSE*/ 0x10)
        {
            MessageBox.Show("I'm shutting down");
            var mailService = new MailService();
            mailService.SendEmail("Test from application exit");
            //Application.Exit();
            return true;
        }
        return false;
    }
}

然后

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

MessageBox 弹出并在我执行taskkill /im MyProcess.exe 时发送电子邮件。但是,这不会在 Windows 关闭时发生。

Windows 是在关机时强行终止进程还是我错过了什么?

【问题讨论】:

    标签: c# windows process


    【解决方案1】:

    您在 IMessageFilter 中完全可以看到 WM_CLOSE 是非常偶然的,并且是 taskkill.exe 的实现细节。您通常只会看到 已发布 消息,通常会发送 WM_CLOSE。我认为您看到 taskkill.exe 首先试图很好地询问,仅在应用程序响应不够快时才使用大锤。任务管理器过去也这样做,但在以后的 Windows 版本中不再这样做。

    不,它当然不能在 Windows 关闭时工作。它发送一条 WM_QUERYENDSESSION 消息到一个窗口以宣布关闭。

    有很多充分的理由将其作为一项服务。但只要你想这样做,那么你需要一个窗口来查看该消息。订阅其 FormClosing 事件,e.CloseReason 属性会告诉您它关闭的原因。你会看到CloseReason.WindowsShutDown。您只需要保持窗口不可见以使其与您所拥有的相同,覆盖 SetVisibleCore() 方法,如this post 所示。

    【讨论】:

      【解决方案2】:

      操作系统使用的一般模式是请求正在运行的进程正常终止,如果它们没有在超时内终止,则终止它们。某些应用程序会在关闭时弹出保存更改提示,但它们实际上可能不会出现在用户面前 - Windows 可以显示“正在关闭”屏幕并说某些进程仍在运行 - 您是否要杀死它们并关闭?

      我相信,如果您使用的是 Windows 窗体,则可以通过 Closing/Closed 事件获得与此处相同的结果*,因此您可以通过将一些文本保存到文件来查看其中任何一个是否触发(并确保刷新它),并查看您是否以相同的方式在 PreFilterMessage 中获得任何其他消息代码。

      *您可能会得到 Closing 或 Closed 或两者,因此请检查两者。例如您可以在没有事先关闭的情况下获得关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-30
        • 2014-06-18
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 2020-10-21
        相关资源
        最近更新 更多