• 控制台——屏蔽Ctrl+C快捷键对窗体的关闭功能


    导入SetCtrlHandlerHandler API
     1 //定义处理程序委托
     2 public delegate bool ConsoleCtrlDelegate(int ctrlType);
     3 //导入SetCtrlHandlerHandler API
     4 [DllImport("kernel32.dll")]
     5 private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
     6 //当用户关闭Console时,系统会发送次消息
     7 private const int CTRL_CLOSE_EVENT = 2;
     8 //Ctrl+C,系统会发送次消息
     9 private const int CTRL_C_EVENT = 0;
    10 //Ctrl+break,系统会发送次消息
    11 private const int CTRL_BREAK_EVENT = 1;
    12 //用户退出(注销),系统会发送次消息
    13 private const int CTRL_LOGOFF_EVENT = 5;
    14 //系统关闭,系统会发送次消息
    15 private const int CTRL_SHUTDOWN_EVENT = 6;
    这是对事件处理的方法,后面SetCtrlHandlerHandler会进行调用
     1 //处理程序例程,在这里编写对指定事件的处理程序代码注意:在VS中调试执行时,在这里设置断点,但不会中断;会提示:无可用源
     2 private static bool HandlerRoutine(int ctrlType)
     3 {
     4     Console.WriteLine(ctrlType);
     5     switch (ctrlType)
     6     {
     7         case CTRL_C_EVENT:
     8             Console.WriteLine("C");
     9             return true; //这里返回true,表示阻止响应系统对该程序的操作  
    10                          //break;
    11         case CTRL_BREAK_EVENT:
    12             Console.WriteLine("BREAK");
    13             return true;
    14         case CTRL_CLOSE_EVENT:
    15             Console.WriteLine("CLOSE");
    16             return true;
    17         case CTRL_LOGOFF_EVENT:
    18             Console.WriteLine("LOGOFF");
    19             return true;
    20         case CTRL_SHUTDOWN_EVENT:
    21             Console.WriteLine("SHUTDOWN");
    22             return true;
    23     }
    24     //return true;//表示阻止响应系统对该程序的操作
    25     return false;//忽略处理,让系统进行默认操作
    26 }

    核心代码是位于类的构造函数中

     1 public Program()
     2 {
     3     ConsoleCtrlDelegate consoleDelegete = new ConsoleCtrlDelegate(HandlerRoutine);
     4     bool bRet = SetConsoleCtrlHandler(consoleDelegete, true);
     5     if (bRet == false) //安装事件处理失败
     6     {
     7         Console.WriteLine("error");
     8         while (true)
     9         {
    10             Console.WriteLine("...");
    11             Thread.Sleep(1000);
    12         }
    13     }
    14     else
    15     {
    16         Console.WriteLine("ok");
    17         while (true)
    18         {
    19             Console.WriteLine("...");
    20             Thread.Sleep(1000);
    21         }
    22     }
    23 }

    控制台主函数入口处调用方法

    1 static void Main(string[] args)
    2 {
    3     Program cls = new Program();
    4     //Console.ReadKey();
    5 }

    参考:SetConsoleCtrlHandler 处理控制台消息SetConsoleCtrlHandler

     

  • 相关阅读:
    oracle批量更新之使用游标进行分批次更新的5种方式及速度比对
    oracle 两个网络不通的远程数据库如何将一个库中的表数据导入到另一个库中?
    惠星球史上最全攻略,手把手带你飞
    oracle 批量删除表数据的4种方式
    zabbix client安装配置执行
    Neural Networks for Machine Learning by Geoffrey Hinton (4)
    代码坏味道之过长的參数列
    Codeforces Round #313 (Div. 1) Gerald's Hexagon
    java界面编程(3) ------ 控制布局
    数据结构实验之队列一:排队买饭
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/7669061.html
Copyright © 2020-2023  润新知