Win32 API
功用:
增加或删除运用顺序定义的HandlerRoutine从挪用历程的处置惩罚函数列表功用。
函数原型:
BOOL SetConsoleCtrlHandler( PHANDLER_ROUTINE HandlerRoutine, // 回调函数 BOOL Add // 示意增加照样删除 );
返回值:BOOL范例
参数
参数HandlerRoutine:一个运用顺序定义的指针HandlerRoutine 功用要增加或删除。 这个参数可所以NULL。
参数Add:假如此参数为TRUE,处置惩罚顺序增加,假如是假的,该处置惩罚顺序将被删除。
返回值:
假如函数失利,返回值为0.不然,返回一个非0值。 若想取得更多错误信息,挪用GetLastError函数 。
说白了,就是一个体系挪用。
第一个参数是函数指针,就是上面的谁人函数。第二个参数是标志,假如为TRUE那末就装置钩子,假如为FALSE那末删除钩子。
运用Windows API 阻拦Console的手动封闭事宜的音讯,来完成,下面我给出的是一个完全的事例:
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading; /************************************************************************/ /* CSharp控制台封闭事宜改写 * Powered by:testcs_dn * Blog:http://www.ki4.cn/ */ /************************************************************************/ namespace CSharp控制台封闭事宜改写 { /// <summary> /// 控制台封闭事宜改写 /// 这里展现了Windows API SetConsoleCtrlHandler函数的运用,同时展现了线程计时器的运用; /// Author:testcs_dn /// Date:2015-01-03 /// </summary> class Program { /// <summary> /// 计时器回调函数,在这里处置惩罚计时时候是不是抵达的推断以及要做的事变; /// </summary> /// <param name="obj"></param> public static void workOvertimeTimerCallback(object obj) { DateTime dt = DateTime.Now; if (dt.Hour == 16 && dt.Minute > 0) { Console.WriteLine("ok"); } } //计时器变量 public static System.Threading.Timer workOvertimeTimer = null; //定义处置惩罚顺序托付 delegate bool ConsoleCtrlDelegate(int dwCtrlType); const int CTRL_CLOSE_EVENT = 2; //导入SetCtrlHandlerHandler API [DllImport("kernel32.dll")] private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add); static void Main(string[] args) { ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine); if (SetConsoleCtrlHandler(newDelegate, true)) { //初始化计时器 workOvertimeTimer = new System.Threading.Timer(new TimerCallback(workOvertimeTimerCallback), null, 1000, 10000); //这里实行你本身的使命,我举例输出“...”,为了展现长时候的使命,我用了一个死循环; //防止输出太多,运用了Sleep; //注重:Sleep的时候不可太长,不然能够影响Console.ReadKey(),致使不能吸收用户输入; while (true) { Console.WriteLine("..."); Thread.Sleep(100); } } else { Console.WriteLine("抱歉,API注入失利,按任意键退出!"); Console.ReadKey(); } } /// <summary> /// 处置惩罚顺序例程,在这里编写对指定事宜的处置惩罚顺序代码 /// </summary> /// <param name="CtrlType"></param> /// <returns></returns> static bool HandlerRoutine(int CtrlType) { switch (CtrlType) { case CTRL_CLOSE_EVENT: //用户要封闭Console了 Console.WriteLine(); Console.WriteLine("使命还没有完成,确认要退出吗?(Y/N)"); ConsoleKeyInfo ki = Console.ReadKey(); return ki.Key == ConsoleKey.Y; default: return true; } } } }
以上就是C#注册控件处置惩罚顺序(SetConsoleCtrlHandler)函数示例的细致引见的细致内容,更多请关注ki4网别的相干文章!