zoukankan      html  css  js  c++  java
  • 控制台——屏蔽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

     

  • 相关阅读:
    JSP实现数据传递(web基础学习笔记三)
    Spring Boot 参数校验
    Spring AOP实践
    Spring AOP介绍
    2018年春节
    InnoDB索引
    Kafka基本知识回顾及复制
    Kakfa消息投递语义
    Kafka Consumer
    Kafka Producer Consumer
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/7669061.html
Copyright © 2011-2022 走看看