程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# Win32控制台應用程序忽略 Ctrl + C,阻止程序退出

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

編輯:C#入門知識

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


C# Win32控制台應用程序忽略 Ctrl + C,阻止程序退出,這裡使用到了Windows API SetConsoleCtrlHandler函數

注意:在VS中調試執行時,在處理程序例程中設置斷點,不會中斷;會提示:無可用源,如下圖:

\

完整示例代碼:

 

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);
                }
            }

        }

        /// 
        /// 處理程序例程,在這裡編寫對指定事件的處理程序代碼
        /// 注意:在VS中調試執行時,在這裡設置斷點,但不會中斷;會提示:無可用源;
        /// 
        ///
        /// 
        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;//忽略處理,讓系統進行默認操作
        }
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved