截获控制台程序关闭事件(SetConsoleCtrlHandler)

最近控制台程序中需要捕获控制台关闭事件,在用户关闭的时候进行某些操作,找了一大圈发现了一个方法,通过调用WIN32 API SetConsoleCtrlHandler方法来实现,具体代码如下:

 1 using System;
 2 using System.Windows.Forms;
 3 using System.Diagnostics;
 4 using System.Runtime.InteropServices;
 5
 6 namespace ConsoleColsed
 7 {
 8   public delegate bool ConsoleCtrlDelegate(int ctrlType);
 9   class Program
10   {
11     [DllImport("kernel32.dll")]
12     private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
13     //当用户关闭Console时,系统会发送次消息
14     private const int CTRL_CLOSE_EVENT = 2;
15     //Ctrl+C,系统会发送次消息
16     private const int CTRL_C_EVENT = 0;
17     //Ctrl+break,系统会发送次消息
18     private const int CTRL_BREAK_EVENT = 1;
19     //用户退出(注销),系统会发送次消息
20     private const int CTRL_LOGOFF_EVENT = 5;
21     //系统关闭,系统会发送次消息
22     private const int CTRL_SHUTDOWN_EVENT = 6;
23
24     static void Main(string[] args)
25     {
26        Program cls = new Program();
27
28     }
29     public Program()
30     {
31       ConsoleCtrlDelegate consoleDelegete = new  ConsoleCtrlDelegate(HandlerRoutine);
32
33       bool bRet = SetConsoleCtrlHandler(consoleDelegete, true);
34       if (bRet == false) //安装事件处理失败
35       {
36          Debug.WriteLine("error");
37       }
38       else
39       {
40          Console.WriteLine("ok");
41         Console.Read();
42       }
43     }
44
45     private static bool HandlerRoutine(int ctrlType)
46     {
47       switch(ctrlType)
48       {
49         case CTRL_C_EVENT:// Ctrl+C 事件
50           Console.WriteLine("-- CTRL_C_EVENT --");
51         break;
52         case CTRL_BREAK_EVENT:
53           Console.WriteLine("-- CTRL_BREAK_EVENT --");
54         break;
55         case CTRL_CLOSE_EVENT://用户点 X 关闭事件
56           Console.WriteLine("-- CTRL_CLOSE_EVENT --");
57         break;
58         case CTRL_LOGOFF_EVENT:
59         break;
60         case CTRL_SHUTDOWN_EVENT://系统关闭事件
61         break;
62       }
63     //return true;//表示阻止响应系统对该程序的操作
64     return false;//忽略处理,让系统进行默认操作
65     }
66   }
67 }   
时间: 2024-12-10 01:48:20

截获控制台程序关闭事件(SetConsoleCtrlHandler)的相关文章

[No000090]C#捕获控制台(console)关闭事件及响应cmd快捷键

捕获控制台(console)关闭事件: 1.Ctrl+C信号: 2.Ctrl+Break信号: 3.用户系统关闭Console时: 4.用户退出系统时: 5.系统将要关闭时: using System; using System.Runtime.InteropServices; using System.Threading; using System.Diagnostics; namespace ConsoleApplication2 { public delegate bool Console

C# 控制台程序 托盘图标 事件响应

static void Main(string[] args) { NotifyIconHelper ni = new NotifyIconHelper(); NotifyIconHelper.ShowNotifyIcon(); while (true) { Application.DoEvents(); } } ---------------------------- namespace ConsoleHideShow{ /// <summary> /// 系统图标操作 /// </s

C++ Win32控制台应用程序捕捉关闭事件

C++ Win32控制台应用程序捕捉关闭事件 #include #include bool ctrlhandler( DWORD fdwctrltype ) { switch( fdwctrltype ) { // handle the ctrl-c signal. case CTRL_C_EVENT: printf( "ctrl-c event\n\n" ); return( true ); // ctrl-close: confirm that the user wants to

C#注册控件处理程序(SetConsoleCtrlHandler)函数示例 控制台关闭事件改写

添加或删除应用程序定义的HandlerRoutine从调用进程的处理函数列表功能. Win32 API功能:添加或删除应用程序定义的HandlerRoutine从调用进程的处理函数列表功能.函数原型:BOOL SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, // 回调函数BOOL Add // 表示添加还是删除):返回值:BOOL类型参数参数HandlerRoutine:一个应用程序定义的指针HandlerRoutine 功能要添加或

C#控制台程序中处理2个关闭事件的代码实例

应用场景 我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用户直接关闭.如果我们不希望用户通过Ctrl+C终止我们的程序,就需要对Ctrl+C或关闭事件作处理. 处理方法 在.net平台下Console类有个CancelKeyPress事件可以处理Ctrl+C,不过对于直接关闭控制台应用,这种处理就无能为力了. 不过Windows API中有个SetConsoleCtrlHandler函数可以处理这两种关闭事件. C#处理代码如下: 代码如下: static class Pr

控制台程序如何在调试时手工关闭

控制台程序程序跑完后会自动关闭,有时我们想看看整个的输出时,需要取消其自动关闭窗口的行为.可以如下调整IDE的配置 菜单:调试->选项 原文地址:https://www.cnblogs.com/kevin-Y/p/10341239.html

JS 页面离开事件 页面关闭事件,实现登录成功返回上个页面

壹 ? 引 登录成功后跳转到上一个页面是很常见的需求,比如在天猫添加购物车时网站会效验用户登录情况,若未登录则跳转登录,登录成功返回到先前的商品页. 这个功能实现并不困难,但因为我的奇思妙想让我先后了解了window.history对象以及窗口关闭/离开事件onbeforeunload,那么让这个需求做个引子,让我们开始一次有趣的探索之旅. 贰 ? 有趣的onbeforeunload 不管是从什么页面进入的登录页,总是得先有个离开页面的过程,那我在离开前一个页面时先记住页面,登录成功调回来不就好

是什么在.NET程序关闭时阻碍进程的退出?

在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在另一些情况下却会产生影响软件功能的Bug.本文列举可能影响.NET程序进程退出的因素,并用几个小例子说明这些因素如何导致Form Application和Windows Service的Bug. 一.进程不能退出对于某些Windows Form程序的影响 在传统C/S结构的系统中,客户端会通过Soc

C# 发送邮件整理,包括控制台程序、WPF、WebForm 及 ASP.NET MVC

发送邮件使用SMTP服务器,有两种方案,一种是使用IIS的SMTP功能:另一种是直接使用邮件供应商的SMTP,比如Gmail.Sina.QQ等,使用这些SMTP服务器必须得注册帐号,一般可以直接用邮箱及密码,但是有些邮箱必须开启POP3/SMTP服务才可以,比如QQ邮箱默认是关闭的,可以在“设置”->“账户”里面找到.我今天整理的都是用的第二种. 早期的.NET版本用的是 System.Web.Mail 类提供的功能来发邮件:2.0版本推出了 System.Net.Mail 类来代替 Syste