zoukankan      html  css  js  c++  java
  • C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出

    C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出,这里使用到了Windows API SetConsoleCtrlHandler函数

    注意:在VS中调试执行时,在处理程序例程中设置断点,不会中断;会提示:无可用源,如下图:

    完整示例代码:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Threading;
     
    /************************************************************************/
    /* CSharp_Win32控制台应用程序忽略 Ctrl + C
     * Powered by:testcs_dn
     */
    /************************************************************************/
    namespace CSharp_Win32控制台应用程序忽略CtrlC
    {
        //定义处理程序委托
        public delegate bool ConsoleCtrlDelegate(int ctrlType);
     
        class Program
        {
            //导入SetCtrlHandlerHandler API
            [DllImport("kernel32.dll")]
            private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
            //当用户关闭Console时,系统会发送次消息
            private const int CTRL_CLOSE_EVENT = 2;
            //Ctrl+C,系统会发送次消息
            private const int CTRL_C_EVENT = 0;
            //Ctrl+break,系统会发送次消息
            private const int CTRL_BREAK_EVENT = 1;
            //用户退出(注销),系统会发送次消息
            private const int CTRL_LOGOFF_EVENT = 5;
            //系统关闭,系统会发送次消息
            private const int CTRL_SHUTDOWN_EVENT = 6;
     
            static void Main(string[] args)
            {
                Program cls = new Program();
                //Console.ReadKey();
            }
            public Program()
            {
                ConsoleCtrlDelegate consoleDelegete = new ConsoleCtrlDelegate(HandlerRoutine);
     
                bool bRet = SetConsoleCtrlHandler(consoleDelegete, true);
                if (bRet == false) //安装事件处理失败
                {
                    Console.WriteLine("error");
                    while (true)
                    {
                        Console.WriteLine("...");
                        Thread.Sleep(1000);
                    }
                }
                else
                {
                    Console.WriteLine("ok");
                    while (true)
                    {
                        Console.WriteLine("...");
                        Thread.Sleep(1000);
                    }
                }
     
            }
     
            /// <summary>
            /// 处理程序例程,在这里编写对指定事件的处理程序代码
            /// 注意:在VS中调试执行时,在这里设置断点,但不会中断;会提示:无可用源;
            /// </summary>
            ///<param name="CtrlType">
            /// <returns></returns>
            private static bool HandlerRoutine(int ctrlType)
            {
                switch(ctrlType)
                {
                    case CTRL_C_EVENT:
                        Console.WriteLine("C");
                        return true; //这里返回true,表示阻止响应系统对该程序的操作
                        //break;
                    case CTRL_BREAK_EVENT:
                        Console.WriteLine("BREAK");
                        break;
                    case CTRL_CLOSE_EVENT:
                        Console.WriteLine("CLOSE");
                        break;
                    case CTRL_LOGOFF_EVENT:
                        Console.WriteLine("LOGOFF");
                        break;
                    case CTRL_SHUTDOWN_EVENT:
                        Console.WriteLine("SHUTDOWN");
                        break;
                }
                //return true;//表示阻止响应系统对该程序的操作
                return false;//忽略处理,让系统进行默认操作
            }
        }
    }
  • 相关阅读:
    Sigmoid函数
    Softmax分类器
    正则化惩罚项
    损失函数
    交叉验证
    超参数
    IMAGENET
    hdu 2767 Proving Equivalences 强连通
    hdu 4587 TWO NODES 关节点
    hdu 3635 Dragon Balls 并查集
  • 原文地址:https://www.cnblogs.com/gc2013/p/4211541.html
Copyright © 2011-2022 走看看