有时,公司内部自己开发的控制台(console)应用程序在服务器上运行会因为遇到某些异常自动关闭了,这就需要用某机制来捕获控制台(console)关闭事件,把这样写日志,便于维护和调试。

源码如下:

程序代码
Code
 1using System;
 2using System.Runtime.InteropServices;
 3using System.Threading;
 4using System.Diagnostics;
 5
 6namespace xmlpusher
 7{
 8    public delegate bool ConsoleCtrlDelegate(int dwCtrlType);
 9    /**////    <summary>   
10    ///    Class1    的摘要说明。   
11    ///    </summary>   
12    class Class1
13    {
14        //The    SetConsoleCtrlHandler    function    adds    or    removes    an    application-defined    HandlerRoutine    function     
15        //from    the    list    of    handler    functions    for    the    calling    process.   
16        [DllImport("kernel32.dll")]
17        private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
18        //一個Ctrl    +    C的信號被接收,該信號或來自鍵盤,或來自GenerateConsoleCtrlEvent    函數   
19        private const int CTRL_C_EVENT = 0;
20        //一個    Ctrl    +    Break    信號被接收,該信號或來自鍵盤,或來自GenerateConsoleCtrlEvent    函數   
21        private const int CTRL_BREAK_EVENT = 1;
22        //當用戶系統關閉Console時,系統會發送此信號到此   
23        private const int CTRL_CLOSE_EVENT = 2;
24        //當用戶退出系統時系統會發送這個信號給所有的Console程序。該信號不能顯示是哪個用戶退出。   
25        private const int CTRL_LOGOFF_EVENT = 5;
26        //當系統將要關閉時會發送此信號到所有Console程序   
27        private const int CTRL_SHUTDOWN_EVENT = 6;
28        /**////    <summary>   
29        ///    应用程序的主入口点。   
30        ///    </summary>   
31        [STAThread]
32        static void Main(string[] args)
33        {
34            //   
35            //    TODO:    在此处添加代码以启动应用程序   
36            //   
37            Class1 cl = new Class1();
38        }
39
40        public Class1()
41        {
42            ConsoleCtrlDelegate newDategate = new ConsoleCtrlDelegate(HandlerRoutine);
43            bool re = SetConsoleCtrlHandler(newDategate, true);
44            if (re)
45            {
46                Console.WriteLine("Set    SetConsoleCtrlHandler    success!!");
47            }
48            else
49            {
50                Debug.WriteLine("Set    SetConsoleCtrlHandler    Error!!");
51                AsReportFile.WriteFile("","test.txt","who close?");
52            }
53            Console.ReadLine();
54        }
55
56        bool HandlerRoutine(int CtrlType)
57        {
58            switch (CtrlType)
59            {
60                case CTRL_CLOSE_EVENT:
61                    for (int i = 0; i < 100; i++)
62                    {
63                        Console.WriteLine("i    is:{0}", i);
64                        Thread.Sleep(1000);
65                    }
66                    break;
67            }
68            return false;
69        }
70    }
71}
72
73

http://www.techmango.com/blog/article.asp?id=381

转载于:https://www.cnblogs.com/plain-heart/archive/2008/04/17/1158874.html

C#捕获控制台(console)关闭事件相关推荐

  1. JS - 捕获打印窗口关闭事件

    实际上浏览器没有标准化的打印窗口关闭事件,但是根据js单线程这一特性,我们可以在打开打印窗口时同时执行一个异步函数,这样异步函数将被阻塞直到窗口关闭,通用于任何窗口. window.print(); ...

  2. mfc打开控制台异常关闭_vc控制台程序关闭事件时的正确处理方式

    百度可以找到很多关于这个问题解决的方法 关键控制台API函数:SetConsoleCtrlHandler 在支持C++ 11以上的编译器中,你可以这么做. SetConsoleCtrlHandler( ...

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

    From: http://www.cnblogs.com/lvxiangjack/p/5363627.html 我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用户直接关闭.如果我 ...

  4. JavaScript捕获窗口关闭事件

    JavaScript捕获窗口关闭事件 关键字: window.close事件 javascript捕获窗口关闭事件有两种方法 1.用javascript重新定义 window.onbeforeunlo ...

  5. react取消捕获_React中阻止事件冒泡的问题详析

    前言 最近在研究react.redux等,网上找了很久都没有完整的答案,索性自己整理下,这篇文章就来给大家介绍了关于React阻止事件冒泡的相关内容,下面话不多说了,来一起看看详细的介绍吧 在正式开始 ...

  6. Eclipse控制台Console使用说明

    1.说明 本文详细介绍Eclipse控制台Console使用说明, 调试时通过控制台查看日志, 有时候日志太多会找不到上面的日志, 有时候几个控制台会不受控制的弹出, 那么请参考本文, 通过调整Ecl ...

  7. VUE监听页面刷新和关闭事件

    背景:公司有一个数据看板,,需求是要统计看板有多少人看过,,每个人停留的曝光时间 使用技术:目前使用的技术是 后端Springboot 权限用的是SpringSecurity,前端页面是 Vue+El ...

  8. 微信公众号网页中页面的关闭事件

    window.addEventListener('pageshow', function () {console.log('页面加载了') });window.addEventListener('pa ...

  9. JS做谷歌浏览器关闭事件监听

    问题:自动化录制插件开发,每次录制结束,如果直接点击关闭而不通过自动化窗口提供的按钮实现,则下一次窗口打开的时候出现错乱,步骤显示.tabid显示等问题.经过排查,窗口新开是在父级框架,同时正常点击录 ...

最新文章

  1. php可以做ios程序吗,php写的可以在本机发送iOS push程序
  2. 学会python编程容易吗-学习武汉Python编程培训容易吗?别人都是怎么学习的?
  3. arthas使用示例:trace追踪方法调用路径及统计方法耗时
  4. 硬盘结构及硬盘错误的解决方法(一)
  5. 【洛谷 - P3410】拍照(最大权闭合图,网络流最小割)
  6. 解决pip安装模块报错Cannot fetch index base URL http://pypi.python.org/simple/
  7. [转]EntityFramework走马观花之CRUD(中)
  8. 自然语言处理实践Task4
  9. 即将毕业的大学生,还在盲目跟风学Python吗?某位科大教授有话说
  10. elsevier模板_英文论文双栏模板
  11. 这些反病毒斗争经验,我全放这了!
  12. Leetcode五大常用算法
  13. 【毕业设计】STM32智能药箱系统 - 单片机 嵌入式 物联网
  14. GoLang使用sync.Once
  15. home为什么是地点副词_home为什么可以做副词
  16. 【性能测试基础】性能专有名词解析及性能瓶颈分析技巧
  17. MATLAB积分(一)
  18. 路由器开启IPv6的方法
  19. python画混淆矩阵 confusion matrix
  20. java bcd asc_BCD码和ASCII码的区别

热门文章

  1. 看图说话:11种用户,你如何应对?
  2. Kano模型在用户调研中的应用——CRM工具调研实例
  3. linux+npm+v+报错_linux下安装npm
  4. 系统学习机器学习之特征工程(二)--离散型特征编码方式:LabelEncoder、one-hot与哑变量*
  5. 剑指offer最新版_剑指offer第二版速查表
  6. 已知坐标求方位角_震惊,up主居然能默写球坐标拉普拉斯算子!
  7. “21天好习惯”第一期-14
  8. 循环链表(线性表的链式存储)---C语言版
  9. 2020研究生数学建模获奖名单_赞!浙商大研究生在全国研究生数学建模竞赛中喜获41个奖项...
  10. 协议栈Protocol stack入门