LINUX DOTNET      Linux DotNET 中文社区

Linux .NET编程与应用技术之专业网站:www.linuxdot.net !     返回首页    
   
[楼主] C# windows控制台程序捕获Ctrl+C按键事件

///////////////////////////////////////
//由linux.j66.net整理,源代码来源于网络
////////////////////////////////////////
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace Testing
{
    /// <summary>
    /// Class to catch console control events (ie CTRL-C) in C#. 
    /// Calls SetConsoleCtrlHandler() in Win32 API
    /// </summary>
    public class ConsoleCtrl : IDisposable
    {
        /// <summary>
        /// The event that occurred. 
        /// </summary>
        public enum ConsoleEvent
        {
            CtrlC = 0, CtrlBreak = 1, CtrlClose = 2, CtrlLogoff = 5, CtrlShutdown = 6
        }
        /// <summary>
        /// Handler to be called when a console event occurs.
        /// </summary>
        public delegate void ControlEventHandler(ConsoleEvent consoleEvent);
        
        /// <summary>
        /// Event fired when a console event occurs
        /// </summary>
        public event ControlEventHandler ControlEvent; ControlEventHandler eventHandler;
        public ConsoleCtrl()
        {
            // save this to a private var so the GC doesn't collect it...
            eventHandler = new ControlEventHandler(Handler);
            SetConsoleCtrlHandler(eventHandler, true);
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        void Dispose(bool disposing)
        {
            if (eventHandler != null)
            {
                SetConsoleCtrlHandler(eventHandler, false);
                eventHandler = null;
            }
        }
        private void Handler(ConsoleEvent consoleEvent)
        {
            if (ControlEvent != null)
                ControlEvent(consoleEvent);
        }
        [DllImport("kernel32.dll")]
        static extern bool SetConsoleCtrlHandler(ControlEventHandler e, bool add);
    }
    class Test
    {
        public static void inputHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
        {
            if (consoleEvent == ConsoleCtrl.ConsoleEvent.CtrlC)
            {
                Console.WriteLine("Stopping due to user input");
                System.Threading.Thread.Sleep(1000);
                System.Environment.Exit(-1);
            }
        }
        [STAThread]
        static void Main(string[] args)
        {
            ConsoleCtrl cc = new ConsoleCtrl();
            cc.ControlEvent += new ConsoleCtrl.ControlEventHandler(inputHandler);
            for (; ; )
            {
                Console.WriteLine("Press any key...");
                Console.ReadLine();
            }
        }
    }
}

作者:mononet   发布时间:09年11月13日   可选操作:删除 回复

 
   
   

留言回复:
标题: * 标题必填
作者:   * 请填上你的名字  
操作键:   * 填入几个字母表示是您写的,便于进一步操作
发言内容:
 
发贴者须知:
1、您无需注册即可发贴,但是,贴子内容必须在法律法规和社会公德所允许的范围内;
2、本站专注IT技术,谢绝包括政治、社会、情感等任何与IT技术无关的贴子在本站发表;
3、本站保留对任何贴子进行删除、禁用、更改、举报、追究等所有权利;
 
今天是: 周六  周一  周二  周三  周四  周五  周七