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); { //導入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 ; //忽略處理,讓系統進行默認操作 } } } |
新聞熱點
疑難解答