参照一些资料做一个响应Console关闭的功能。
public delegate bool ConsoleCtrlDelegate(int ctrlType);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool add);ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine);
bool re = SetConsoleCtrlHandler(newDelegate, true);
if (re)
    Console.WriteLine("OK");
else
    Console.WriteLine("ERROR");private bool HandlerRoutine(int CtrlType)
{
    Console.WriteLine("aaa");
}
但是每次关闭Console的时候总是没有执行HandlerRoutine中的内容就报错了。
怀疑是不是因为在程序中启动了很多子线程导致的?
请高手帮忙指教

解决方案 »

  1.   

    [DllImport("kernel32.dll")]
    17        private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
    18        //一個Ctrl    +    C的信號被接收,該信號或來自鍵盤,或來自GenerateConsoleCtrlEvent    函數   
    19        private const int CTRL_C_EVENT = 0;
    20        //一個    Ctrl    +    Break    信號被接收,該信號或來自鍵盤,或來自GenerateConsoleCtrlEvent    函數   
    21        private const int CTRL_BREAK_EVENT = 1;
    22        //當用戶系統關閉Console時,系統會發送此信號到此   
    23        private const int CTRL_CLOSE_EVENT = 2;
    24        //當用戶退出系統時系統會發送這個信號給所有的Console程序。該信號不能顯示是哪個用戶退出。   
    25        private const int CTRL_LOGOFF_EVENT = 5;
    26        //當系統將要關閉時會發送此信號到所有Console程序   
    27        private const int CTRL_SHUTDOWN_EVENT = 6;
    28        /**////    <summary>   
    29        ///    应用程序的主入口点。   
    30        ///    </summary>   
    31        [STAThread]
    32        static void Main(string[] args)
    33        {
    34            //   
    35            //    TODO:    在此处添加代码以启动应用程序   
    36            //   
    37            Class1 cl = new Class1();
    38        }
    39
    40        public Class1()
    41        {
    42            ConsoleCtrlDelegate newDategate = new ConsoleCtrlDelegate(HandlerRoutine);
    43            bool re = SetConsoleCtrlHandler(newDategate, true);
    44            if (re)
    45            {
    46                Console.WriteLine("Set    SetConsoleCtrlHandler    success!!");
    47            }
    48            else
    49            {
    50                Debug.WriteLine("Set    SetConsoleCtrlHandler    Error!!");
    51                AsReportFile.WriteFile("","test.txt","who close?");
    52            }
    53            Console.ReadLine();
    54        }
    55
    56        bool HandlerRoutine(int CtrlType)
    57        {
    58            switch (CtrlType)
    59            {
    60                case CTRL_CLOSE_EVENT:
    61                    for (int i = 0; i < 100; i++)
    62                    {
    63                        Console.WriteLine("i    is:{0}", i);
    64                        Thread.Sleep(1000);
    65                    }
    66                    break;
    67            }
    68            return false;
    69        }
      

  2.   

    刚发现我在VS下Debug或者Run的时候没有问题。
    但是编译成.exe后就出现问题了。高手请指点一下
      

  3.   

    可以注意的
    1、委托要做成类成员,而不是局部变量(防止被垃圾回收)。
    2、下面代码是经过测试(包括独立exe)的,你可以参考一下。
    3、C++中的BOOL其实是int类型,下面代码直接用了int。
    using System;
    using System.Runtime.InteropServices;
    // should add a reference to System.Windows.Formsclass Program
    {
        static ConsoleCtrlDelegate handler;               //<---    static void Main(string[] args)
        {
            handler = ConsoleCtrHandler;
            SetConsoleCtrlHandler(handler, true);        while (true)
            {
                Console.ReadLine();
            }
        }
        static int ConsoleCtrHandler(ConsoleEvent e)
        {
            System.Windows.Forms.MessageBox.Show( e.ToString() );     
            return 1;
        }    enum ConsoleEvent
        {
            Ctrl_C,
            Ctrl_Break,
            Close,
            Logoff,
            Shutdown
        }    delegate int ConsoleCtrlDelegate(ConsoleEvent ctrlType);    [DllImport("kernel32.dll", CallingConvention=CallingConvention.StdCall)]
        static extern int SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool add);
    }