Maison > développement back-end > Tutoriel C#.Net > Introduction détaillée de l'exemple de fonction de gestionnaire de contrôle enregistré C# (SetConsoleCtrlHandler)

Introduction détaillée de l'exemple de fonction de gestionnaire de contrôle enregistré C# (SetConsoleCtrlHandler)

黄舟
Libérer: 2017-03-13 17:50:44
original
2634 Les gens l'ont consulté

Ajoutez ou supprimez des fonctions HandlerRoutine définies par l'application de la liste des fonctions de gestionnaire du processus appelant.

Win32 API
Fonction :
Ajoutez ou supprimez des fonctions HandlerRoutine définies par l'application de la liste des fonctions de gestionnaire du processus appelant.
Prototype de fonction :

BOOL SetConsoleCtrlHandler(
PHANDLER_ROUTINE HandlerRoutine, // 回调函数
BOOL Add // 表示添加还是删除
);
Copier après la connexion

Valeur de retour : type BOOL
Paramètres
Parameter HandlerRoutine : une fonction HandlerRoutine de pointeur définie par l'application à ajouter ou à supprimer . Ce paramètre peut être NULL.
Parameter Add : Si ce paramètre est TRUE, le gestionnaire est ajouté, s'il est False, le gestionnaire sera supprimé.
Valeur de retour :
Si la fonction échoue, la valeur de retour est 0. Sinon, une valeur non nulle est renvoyée. Si vous souhaitez obtenir plus d’informations sur les erreurs, appelez la fonction GetLastError.
Pour parler franchement, il s'agit d'un appel système.
Le premier paramètre est pointeur de fonction, qui est la fonction ci-dessus. Le deuxième paramètre est un indicateur, si VRAI alors installez le hook, si FALSE alors supprimez le hook.

Utilisez l'API Windows pour intercepter le message de l'événement de fermeture manuelle de la console pour y parvenir. Ce que je donne ci-dessous est un exemple complet :
.

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;
            }
        }
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal