C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出

摘要:
C#Win32控制台应用程序忽略Ctrl+C并阻止程序退出。此处使用WindowsAPISetConsoleCtrlHandler函数。注意:在VS中调试执行时,在处理程序例程中设置断点,它们不会被中断;系统将提示您没有可用的源代码,如下图所示:完整的示例代码:?1234567891011121314151617181920212223242526272829303132333435363738394041424344

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

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

C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出第1张

完整示例代码:

 

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
{
    //定义处理程序委托
    publicdelegate bool ConsoleCtrlDelegate(intctrlType);
 
    classProgram
    {
        //导入SetCtrlHandlerHandler API
        [DllImport("kernel32.dll")]
        privatestaticextern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
        //当用户关闭Console时,系统会发送次消息
        privateconstintCTRL_CLOSE_EVENT = 2;
        //Ctrl+C,系统会发送次消息
        privateconstintCTRL_C_EVENT = 0;
        //Ctrl+break,系统会发送次消息
        privateconstintCTRL_BREAK_EVENT = 1;
        //用户退出(注销),系统会发送次消息
        privateconstintCTRL_LOGOFF_EVENT = 5;
        //系统关闭,系统会发送次消息
        privateconstintCTRL_SHUTDOWN_EVENT = 6;
 
        staticvoidMain(string[] args)
        {
            Program cls = newProgram();
            //Console.ReadKey();
        }
        publicProgram()
        {
            ConsoleCtrlDelegate consoleDelegete = newConsoleCtrlDelegate(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>
        privatestaticbool HandlerRoutine(intctrlType)
        {
            switch(ctrlType)
            {
                caseCTRL_C_EVENT:
                    Console.WriteLine("C");
                    returntrue; //这里返回true,表示阻止响应系统对该程序的操作
                    //break;
                caseCTRL_BREAK_EVENT:
                    Console.WriteLine("BREAK");
                    break;
                caseCTRL_CLOSE_EVENT:
                    Console.WriteLine("CLOSE");
                    break;
                caseCTRL_LOGOFF_EVENT:
                    Console.WriteLine("LOGOFF");
                    break;
                caseCTRL_SHUTDOWN_EVENT:
                    Console.WriteLine("SHUTDOWN");
                    break;
            }
            //return true;//表示阻止响应系统对该程序的操作
            returnfalse;//忽略处理,让系统进行默认操作
        }
    }
}

免责声明:文章转载自《C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇两种常用文件分享方式linux系统如何使用tess4j(java)进行ocr图片文字识别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何修改cmd控制台默认编码为utf-8

如何修改cmd控制台默认编码为utf-8 1.打开cmd窗口后,在窗口顶部右击选择属性,选中选项后会看到默认编码为gbk 2.然后我们在默认窗口路径内,输入chcp命令后回车 936就表示gbk编码 3.然后在窗口中输入chcp 65001,然后回车,即可看到窗口默认编码为utf-8编码了 (65001代表utf-8编码) 4.上面的方法每次都要重新...

VMware ESXi 与ESX 产品之比较

现在的ESXi有3个版本,ESXi Free才是那个免费的版本,当然,免费的版本有很多限制和局限,对于小企业或许是个好的起步,但是对于想要构建高可用性的生产环境虚拟平台来说,就显得很不合适。ESXi的另外2个版本是Embedded和Installable。Embedded版本是和硬件厂商合作,安装在Flash中的ESXi版本,通常Flash都是集成在主板上...

virsh 连接虚拟机 (vnc 或 控制台)

第一种方式 1.如果虚拟机登录方式为VNC,在ubuntu机器上安装vncviewer 在虚拟机的配置xml中 <graphics type="vnc" autoport="yes" keymap="en-us" listen="0.0.0.0"/> 安装vncviewer $apt-get install vncviewer 查看该虚拟机的端...

Dubbo管理控制台安装

参考官网地址:管理控制台安装 | Apache Dubbo 方式一 源码安装 1、安装: 需要先安装git,在ubuntu系统中使用apt安装git 和 maven: apt install gitapt install maven 需要安装node.js,并设置npm的国内镜像。 npm config set registry https://regi...

Quartz+log4net实现控制台程序定时运行,并且记录日志

c# 控制台程序定时运行,并记录日志。 组件Quartz +log4net Quartz定时运行程序,log4net记录日志。 首先建立控制台程序“QuartzTest” 安装Quartz、log4net这两个组件。如下图流程 安装Quartz 安装log4net 安装完毕后引用里多了如下 然后在项目中添加log4net.config 并将log...

如何构建一个入侵检测系统(IDS)

  通常来说,一个企业或机构准备进军此领域时,往往选择从基于网络的IDS入手,因为网上有很多这方面的开放源代码和资料,实现起来比较容易,并且,基于网络的IDS适应能力强。有了简单网络IDS的开发经验,再向基于主机的IDS、分布式IDS、智能IDS等方面迈进的难度就小了很多。在此,笔者将以基于网络的IDS为例,介绍典型的IDS开发思路。   根据CIDF规范...