標籤:kernel32 type 響應 設定斷點 oid tps 表單 main 退出
匯入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 else15 {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快速鍵對表單的關閉功能