博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出
阅读量:6079 次
发布时间:2019-06-20

本文共 2985 字,大约阅读时间需要 9 分钟。

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

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

完整示例代码:

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 * Blog:http://blog.csdn.net/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);                }            }        }        ///         /// 处理程序例程,在这里编写对指定事件的处理程序代码        /// 注意:在VS中调试执行时,在这里设置断点,但不会中断;会提示:无可用源;        ///         ///         /// 
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;//忽略处理,让系统进行默认操作 } }}

你可能感兴趣的文章
51nod 1533 && CF538F
查看>>
【主席树】bzoj3524 [Poi2014]Couriers
查看>>
2012年最受欢迎的PHP框架
查看>>
用yum下载rpm包(不安装)到制定目录
查看>>
关于大学生社交网站使用动机与行为的调查问卷
查看>>
Long与long的区别
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
java分享第七天-01(Hashmap和Hashtable的区别&Property)
查看>>
Golang学习笔记2——类型与变量
查看>>
ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
查看>>
Redis------Set集合类型
查看>>
Webservice中的SOAP和REST方式比较
查看>>
内置函数与匿名函数
查看>>
VBA注释临时
查看>>
JSON关联属性转换异常
查看>>
去掉html样式
查看>>
Python爬虫之Scrapy框架介绍
查看>>
【示例】手把手教你构建一个简单的JavaWeb应用(会员注册唯一性检查,不带数据库)...
查看>>
javascript时间函数
查看>>
[HDFS_add_3] HDFS 机架感知
查看>>