C# 控制台程序关闭按钮事件如何重写?

C# 控制台程序关闭按钮事件如何重写?,第1张

c#中控制台程序是没有像WinForm的Closing或Closed事件

如果你想捕获关闭动作可以从两方面进行

一是捕获键盘的 ctrl+c 组合键

二是用win32 api捕获,可以参考下面的链接内容

http://www.cnblogs.com/birdshover/archive/2008/03/17/1110138.html

这个,利用Windows API 拦截Console的手动关闭事件的消息,来实现,下面我给出的是一个完整的事例:

using System

using System.Collections.Generic

using System.Text

namespace ExtendedConsoleApp

{

using System.Runtime.InteropServices

/// <summary>

/// Author: DeltaCat

/// Purpose: 自定义控制台关闭事件

/// Date: 2013-4-5

/// </summary>

class Program

{

delegate bool ConsoleCtrlDelegate(int dwCtrlType)

const int CTRL_CLOSE_EVENT = 2

[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))

{

#region 任务代码区

//这里执行你自己的任务,我举例输出几个数字,为了展示长时间的任务,我用了Sleep

Console.WriteLine("1")

System.Threading.Thread.Sleep(5000)

Console.WriteLine("2")

System.Threading.Thread.Sleep(2000)

Console.WriteLine("Over, 2秒后退出")

System.Threading.Thread.Sleep(2000)

#endregion

}

else

{

Console.WriteLine("抱歉,API注入失败,按任意键退出!")

Console.ReadKey()

}

}

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

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7779691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存