【问题标题】:"On Exit" for a Console Application [duplicate]控制台应用程序的“退出时”[重复]
【发布时间】:2011-06-06 12:27:06
【问题描述】:

我正在寻找一种在手动关闭控制台应用程序(用户关闭窗口)时触发一段代码的方法。一直在尝试:

AppDomain.CurrentDomain.ProcessExit +=
    new EventHandler(CurrentDomain_ProcessExit);

但如果手动关闭,上述方法不起作用。

有什么方法可以为此使用 .Net 调用,还是我需要导入内核 dll 并这样做?

【问题讨论】:

  • 你所说的“手动关闭”是指用户点击控制台窗口右上角的“关闭窗口”十字吗?
  • 我怀疑你所追求的是命令行本身的“退出”。一旦控制台应用程序的 Main 方法完成,它就超出了你的控制和用户需要按回车键关闭命令行窗口。
  • @Martin。是的,这就是我的意思。将更新澄清。
  • @nawfal - 我在 sn-p 中包含的最佳答案是错误的。

标签: c# .net


【解决方案1】:

此代码用于捕获用户关闭控制台窗口:

using System;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        handler = new ConsoleEventDelegate(ConsoleEventCallback);
        SetConsoleCtrlHandler(handler, true);
        Console.ReadLine();
    }

    static bool ConsoleEventCallback(int eventType) {
        if (eventType == 2) {
            Console.WriteLine("Console window closing, death imminent");
        }
        return false;
    }
    static ConsoleEventDelegate handler;   // Keeps it from getting garbage collected
    // Pinvoke
    private delegate bool ConsoleEventDelegate(int eventType);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);

}

注意限制。您必须快速响应此通知,您有 5 秒钟的时间来完成任务。花费更长的时间,Windows 会毫不客气地杀死您的代码。而且您的方法在工作线程上被异步调用,程序的状态是完全不可预测的,因此很可能需要锁定。一定要确保中止不会造成麻烦。例如,将状态保存到文件时,请确保先保存到临时文件并使用 File.Replace()。

【讨论】:

  • 很高兴知道这一点。可能必须解决这个问题。感谢您的回复。提高你的答案 +1。
  • 效果很好!如果有人对其他可能的事件类型感兴趣:msdn.microsoft.com/en-us/library/ms683242%28v=vs.85%29.aspx
  • 先保存到临时文件是一个很好的技巧。它不仅可以防止应用程序突然关闭,还可以防止系统突然关闭。就这么简单。正是我想要的 +1
  • 在将委托分配给处理程序变量时,您也可以使用 lambda 表达式来代替..
  • 在 Windows 10 上使用 .NET 4.7.2,对我来说效果很好,您是否配置错误?还是我误解了你的评论?
【解决方案2】:

您需要挂钩到控制台退出事件,而不是您的进程。

http://geekswithblogs.net/mrnat/archive/2004/09/23/11594.aspx

Capture console exit C#

【讨论】:

  • geekswithblogs 的第一个链接无法达到 100%,就像您可以在博客的 cmets 中阅读的那样,第二个链接也没有解决 win 7 问题的答案
猜你喜欢
  • 2011-09-07
  • 2015-11-15
  • 2012-09-13
  • 2014-09-04
  • 2016-05-25
  • 1970-01-01
  • 2014-02-17
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多