控制臺中屏蔽Ctrl+C快捷鍵對窗體的關閉功能
阿新 • • 發佈:2017-10-15
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 constint 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快捷鍵對窗體的關閉功能