C#控制台关闭时回调操作处理其他操作

C#控制台关闭时回调操作处理其他操作,这时候需要用到Windows api的,

功能:向系统添加或删除回调函数。

说明:利用它可以设置回调函数,当控制台窗口发生事件时,事件首先发送给回调函数,你可以在回调函数中对事件处理。 

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleCtrlHandler(delegate callback, bool add);//callback 委托,add 添加或者删除,true 添加,false 删除

代码如下:

using ServiceX;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;

namespace ServiceXConsole
{
    class Program
    {
        //static Logger<Program> logger = new Logger<Program>();

        #region kernel32
        //定义委托
        private delegate bool ConsoleEventDelegate(int eventType);
        //winApi---控制台关闭回调接口
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);

        //volatile static 变量防止优化
        volatile static ConsoleEventDelegate consoleCtrlDelegate = new ConsoleEventDelegate(HandlerRoutine);

        #endregion

        static void Main(string[] args)
        {
            try
            {
                bool isSuccess = SetConsoleCtrlHandler(consoleCtrlDelegate, true);
                Thread.CurrentThread.IsBackground = false;
                Thread.Sleep(Timeout.Infinite);
            }
            catch (Exception e)
            {
               // logger.Error("Main", e);
            }
        }

        /// <summary>
        /// Console控制台关闭时回调操作释放资源
        /// </summary>
        /// <param name="CtrlType"></param>
        /// <returns></returns>
        public static bool HandlerRoutine(int CtrlType)
        {
            switch (CtrlType)
            {
                case 0:
                    //相关代码
                    break;
                case 2:
                    //Console.WriteLine("2工具被强制关闭");//按控制台关闭按钮关闭 
                    List<Process> pList = Process.GetProcessesByName("adb").ToList();
                    try
                    {
                        string processFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "adb.exe");
                        pList.ForEach(proc =>
                        {
                            if (proc.ProcessName == "adb" && proc.MainModule.FileName == processFilePath)
                            {
                                proc.Kill();
                                proc.WaitForExit();
                            }
                        });
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    break;
            }
            return false;
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的回调函数是一种将函数作为参数传递给另一个函数的技术。通常情况下,回调函数是一个委托(Delegate),它允许我们在程序执行期间将函数指针传递到另一个函数中,以便在需要调用它。 在C#中,回调函数主要用于异步编程。当我们需要执行一个长间运行的操作,我们可以使用回调函数来通知我们操作是否已经完成。在这种情况下,我们可以定义一个委托类型的参数,在调用异步操作将其传递给异步操作方法,当异步操作完成,我们可以使用委托调用回调函数。 例如,下面是一个简单的C#回调函数示例: ``` using System; namespace CallbackFunctionExample { class Program { static void Main(string[] args) { // 定义一个委托类型的参数 Action<string> callback = DisplayMessage; // 调用异步操作方法,并将回调函数作为参数传递 LongRunningOperation(callback); Console.WriteLine("异步操作已启动,正在执行中..."); Console.ReadLine(); } static void LongRunningOperation(Action<string> callback) { // 模拟一个长间运行的操作 System.Threading.Thread.Sleep(5000); // 操作完成后调用回调函数 callback("操作已完成"); } static void DisplayMessage(string message) { Console.WriteLine($"回调函数收到消息:{message}"); } } } ``` 在上面的示例中,我们定义了一个名为`LongRunningOperation`的异步操作方法,并将一个`Action<string>`类型的回调函数参数传递给它。在异步操作方法中,我们模拟了一个长间运行的操作,并在操作完成后调用了回调函数。在`Main`函数中,我们将`DisplayMessage`函数作为回调函数传递给异步操作方法,并在控制台中打印了回调函数收到的消息。 请注意,C#中的回调函数不仅限于使用委托类型作为参数,我们还可以使用其他类型的参数作为回调函数,例如接口、Lambda表达式等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值