新增或刪除應用程式定義的HandlerRoutine從呼叫進程的處理函數清單功能。
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.php.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)函數範例的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!