C#註冊控制項處理程序(SetConsoleCtrlHandler)函數範例的詳細介紹
新增或刪除應用程式定義的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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

C#和C 的歷史與演變各有特色,未來前景也不同。 1.C 由BjarneStroustrup在1983年發明,旨在將面向對象編程引入C語言,其演變歷程包括多次標準化,如C 11引入auto關鍵字和lambda表達式,C 20引入概念和協程,未來將專注於性能和系統級編程。 2.C#由微軟在2000年發布,結合C 和Java的優點,其演變注重簡潔性和生產力,如C#2.0引入泛型,C#5.0引入異步編程,未來將專注於開發者的生產力和雲計算。
