Heim >Backend-Entwicklung >C#.Net-Tutorial >Detaillierte Einführung in das Funktionsbeispiel eines in C# registrierten Steuerelementhandlers (SetConsoleCtrlHandler).

Detaillierte Einführung in das Funktionsbeispiel eines in C# registrierten Steuerelementhandlers (SetConsoleCtrlHandler).

黄舟
黄舟Original
2017-03-13 17:50:442625Durchsuche

Anwendungsdefinierte HandlerRoutine-Funktionen zur Handler-Funktionsliste des aufrufenden Prozesses hinzufügen oder daraus entfernen.

Win32 API
Funktion:
Anwendungsdefinierte HandlerRoutine-Funktionen zur Handler-Funktionsliste des aufrufenden Prozesses hinzufügen oder daraus entfernen.
Funktionsprototyp:

BOOL SetConsoleCtrlHandler(
PHANDLER_ROUTINE HandlerRoutine, // 回调函数
BOOL Add // 表示添加还是删除
);

Rückgabewert: BOOL-Typ
Parameter
Parameter HandlerRoutine: eine anwendungsdefinierte Zeiger-HandlerRoutine-Funktion zum Hinzufügen oder Löschen . Dieser Parameter kann NULL sein.
Parameter Add: Wenn dieser Parameter TRUE ist, wird der Handler hinzugefügt, wenn er False ist, wird der Handler entfernt.
Rückgabewert:
Wenn die Funktion fehlschlägt, ist der Rückgabewert 0. Andernfalls wird ein Wert ungleich Null zurückgegeben. Wenn Sie weitere Fehlerinformationen erhalten möchten, rufen Sie die Funktion GetLastError auf.
Um es ganz klar auszudrücken: Es handelt sich um einen Systemaufruf.
Der erste Parameter ist der Funktionszeiger, bei dem es sich um die obige Funktion handelt. Der zweite Parameter ist ein Flag. Wenn TRUE, dann wird der Hook installiert, wenn FALSE, dann wird der Hook gelöscht.

Verwenden Sie die Windows-API, um die Nachricht des manuellen Schließereignisses der Konsole abzufangen, um dies zu erreichen. Was ich unten gebe, ist ein vollständiges Beispiel:

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

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in das Funktionsbeispiel eines in C# registrierten Steuerelementhandlers (SetConsoleCtrlHandler).. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn