·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> C#Win32控制台应用程序忽略Ctrl+C,阻止程序退出

C#Win32控制台应用程序忽略Ctrl+C,阻止程序退出

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

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  * 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);                 }             }           }           /// <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;//忽略处理,让系统进行默认操作         }     } }