1. 程式人生 > >控制臺中屏蔽Ctrl+C快捷鍵對窗體的關閉功能

控制臺中屏蔽Ctrl+C快捷鍵對窗體的關閉功能

error -s tin else blog gof 發送 led ext

導入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

控制臺中屏蔽Ctrl+C快捷鍵對窗體的關閉功能