C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出,这里使用到了Windows API SetConsoleCtrlHandler函数

注意:在VS中调试执行时,在处理程序例程中设置断点,不会中断;会提示:无可用源,如下图:

完整示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
 
/************************************************************************/
/* CSharp_Win32控制台应用程序忽略 Ctrl + C
 * Powered by:testcs_dn
 */
/************************************************************************/
namespace CSharp_Win32控制台应用程序忽略CtrlC
{
    //定义处理程序委托
    public delegate bool ConsoleCtrlDelegate(int ctrlType);
 
    class Program
    {
        //导入SetCtrlHandlerHandler API
        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
        //当用户关闭Console时,系统会发送次消息
        private const int CTRL_CLOSE_EVENT = 2;
        //Ctrl+C,系统会发送次消息
        private const int CTRL_C_EVENT = 0;
        //Ctrl+break,系统会发送次消息
        private const int CTRL_BREAK_EVENT = 1;
        //用户退出(注销),系统会发送次消息
        private const int CTRL_LOGOFF_EVENT = 5;
        //系统关闭,系统会发送次消息
        private const int CTRL_SHUTDOWN_EVENT = 6;
 
        static void Main(string[] args)
        {
            Program cls = new Program();
            //Console.ReadKey();
        }
        public Program()
        {
            ConsoleCtrlDelegate consoleDelegete = new ConsoleCtrlDelegate(HandlerRoutine);
 
            bool bRet = SetConsoleCtrlHandler(consoleDelegete, true);
            if (bRet == false) //安装事件处理失败
            {
                Console.WriteLine("error");
                while (true)
                {
                    Console.WriteLine("...");
                    Thread.Sleep(1000);
                }
            }
            else
            {
                Console.WriteLine("ok");
                while (true)
                {
                    Console.WriteLine("...");
                    Thread.Sleep(1000);
                }
            }
 
        }
 
        /// <summary>
        /// 处理程序例程,在这里编写对指定事件的处理程序代码
        /// 注意:在VS中调试执行时,在这里设置断点,但不会中断;会提示:无可用源;
        /// </summary>
        ///<param name="CtrlType">
        /// <returns></returns>
        private static bool HandlerRoutine(int ctrlType)
        {
            switch(ctrlType)
            {
                case CTRL_C_EVENT:
                    Console.WriteLine("C");
                    return true; //这里返回true,表示阻止响应系统对该程序的操作
                    //break;
                case CTRL_BREAK_EVENT:
                    Console.WriteLine("BREAK");
                    break;
                case CTRL_CLOSE_EVENT:
                    Console.WriteLine("CLOSE");
                    break;
                case CTRL_LOGOFF_EVENT:
                    Console.WriteLine("LOGOFF");
                    break;
                case CTRL_SHUTDOWN_EVENT:
                    Console.WriteLine("SHUTDOWN");
                    break;
            }
            //return true;//表示阻止响应系统对该程序的操作
            return false;//忽略处理,让系统进行默认操作
        }
    }
}

C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出的更多相关文章

  1. Win32控制台、Win32项目、MFC项目、CLR控制台、CLR空项目、空项目区别

    转载:https://blog.csdn.net/zfmss/article/details/79244696 1.Win32控制台 初始代码模版以main为程序入口,默认情况下,只链接C++运行时库 ...

  2. 【转】WIN32 控制台程序

    http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...

  3. vc2010 win32 控制台应用程序中文乱码

    vc2010 win32 控制台应用程序中文乱码 在 vc2010 上用 win32 控制台程序写些测试代码调用 windows api ,处理错误信息时,发现用 wprintf 输出的错误信息出现了 ...

  4. Visual Studio C++ Win32控制台应用程序,Win32项目,MFC的区别

    背景 Visual Studio C++ 创建新项目蹦出来如下选项: Win32控制台应用程序,Win32项目,MFC有什么区别? 正文: Win32控制台,没有界面,命令行执行生成的文件则直接在后台 ...

  5. win32应用程序和win32控制台应用程序的区别

          win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...

  6. Win32控制台程序和Win32应用程序

    刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...

  7. vs2008 新建win32控制台程序提示:脚本错误

    解决方案: 1.根据错误信息中的url,找到对应文件夹下的htm文件 2.使用notepad++打开default.htm文件,找到错误提示的434行,注释掉433和434行 然后保存文件,重新新建w ...

  8. VS2017:win32项目与win32控制台应用程序的转换方法

    原文:https://www.cnblogs.com/asuser/articles/12297251.html 刚开始使用VS2017新建项目工程时,有时把应用类型的工程建成控制台类型的工程,在编译 ...

  9. win32控制台实现按任意键退出的功能

    win7之后的五win32 控制台出现了程序运行完之后就立即结束的问题,程序员根本无法看输出的结果.未来让控制台运行完之后能够等待程序员的操作.可以使用: system("PAUSE&quo ...

随机推荐

  1. BZOJ4242 : 水壶

    对于任意两个建筑物,以它们之间的最短路为边权求出最小生成树. 则询问(x,y)的答案为最小生成树上x到y路径上边权的最大值. BFS求出离每个点最近的建筑物以及到它的距离,可以发现只有交界处的边才有用 ...

  2. Linux下Shell函数返回值实现种类

    shell在执行的时候是顺序执行的,也不存在什么多线程什么的. 一下是实现种类: 1.全局 g_result="" function testFunc() { g_result=' ...

  3. 使用GSON和泛型解析约定格式的JSON串(转)

    时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...

  4. 【教程】新手如何制作简单MAD和AMV,学不会那都是时辰

    [教程]新手如何制作简单MAD和AMV,学不会那都是时 http://tieba.baidu.com/p/2303522172 [菜鸟教你做MAD]Vegas制作MAD入门教程 http://tieb ...

  5. MySQL 5.6主从Slave_IO_Running:Connecting/error connecting to master *- retry

    刚配置的MySQL主从,在从机上看到 点击(此处)折叠或打开 mysql> SHOW slave STATUS \\G *************************** 1. row ** ...

  6. Delphi XE2 compiler performance

    原文: http://blog.barrkel.com/2011/10/delphi-xe2-compiler-performance.html Delphi XE2 compiler perform ...

  7. javascript中的回调函数(callback)

    代码如下: app.use(function(req, res, next) {     var err = new Error('Not Found');     err.status = 404; ...

  8. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(7) TimeZone

    本章介绍TimeZone. TimeZone 简介 TimeZone 表示时区偏移量,也可以计算夏令时.在操作 Date, Calendar等表示日期/时间的对象时,经常会用到TimeZone:因为不 ...

  9. arcgis导oracle多步操作产生错误。请检查每一步的状态值。" 如何解决?

    你知你用的什么数据引擎,ADO? 我以前碰过类似的,我有两个方案:   1.升ado到2.7以上      2.不要用microsoft oledb provider for oracle,而要用or ...

  10. 破产姐妹第六季/全集2 Broke Girls迅雷下载

    英文全名2 Broke Girls,第6季(2016)CBS. 本季看点:<破产姐妹>第五季季终集达到了收视人数699万收视率1.7.在第五季终集,两姐妹发现Han(马修·摩伊 饰)的生活 ...