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

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

 * Blog:http://blog.csdn.net/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;//忽略处理,让系统进行默认操作

        }

    }

}

时间: 2024-12-26 14:14:29

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

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

安装VC2008 Express及使用之编写Win32控制台应用程序(初学者适用)

安装VC2008 1.双击所下载的安装包,选择setup.exe并双击 2 2.出来安装界面,点下一步 3.接受安装协议,点下一步 4.点击安装 5.等着安装完成及点退出完成安装 使用VC2008开发简单C/C++程序的过程 1.点击"开始"菜单,选择"所有程序"中的"Microsoft Visual C++ 2008 Express Edition" 2.文件-->新建-->项目:选择Win32项目类型,选Win32控制台应用程序,

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

背景 Visual Studio C++ 创建新项目蹦出来如下选项: Win32控制台应用程序,Win32项目,MFC有什么区别? 正文: Win32控制台,没有界面,命令行执行生成的文件则直接在后台运行,运行效果如下:生成的".exe"文件相当于Linux系统下用gcc编译出来一个".out"文件,直接运行操作即可,只有命令符,没有界面. Win32项目这个就有界面了,但是界面里面的控件,基本上要自己去实现. MFC项目这个也有界面,可是界面里面的控件就不需要自己

在Win32控制台程序中使用CString

进入Project->Settings->General 下,在下拉框中选"Use MFC in a Static Library"(使用MFC做为静态链接库): 然后添加头文件#include <afxwin.h>,并且要放在其它头文件前. 否则,会有#error : WINDOWS.H already included. MFC apps must not #include <windows.h>的错误提示. 在Win32控制台程序中使用CStr

win32控制台应用程序中使用CString类型的方法

环境:win7 64位  + vs2010 一直在找,MFC不懂真没办法,顺便记住.... 新建win32控制台应用程序中不能使用cstring类型,此时包含头文件#include <afxwin.h>,并在项目属性->配置属性->常规 "项目默认值"->"MFC的使用"中选择"在静态库中使用MFC"或者"在共享DLL中使用MFC"即可

Visual Studio 2015专业版创建Win32控制台应用程序,C,C++源文件

问题: 原配的Visual Studio 2015专业版不像之前的版本,在新建项目里面是找不到Win32模板的,那么怎么才能新建Win32项目和Win32控制台应用程序呢?先看如下图所示: 解决: 1.添加的办法是点击上图所示的新建项目界面的Visual C++下面的Windows,再点击右边的"安装通用Windows平台工具",弹出如下对话框,点击"安装": 2.如果当前Visual Studio 2015正打开,会提示将其关闭以减少资源的利用,点击继续: 3.如

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

    win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Application和Win32 Console Application 都是工作在32位Windows环境的程序.其中Win32 Application 就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的.不规则形状的…… 它们都是所谓的GUI(Graphics User Interfac

win7+vs2010+Qt addin新建win32控制台程序编译出错问题

最近遇到一个问题,每次新建win32控制台 应用程序,编译的时候都会莫名其妙地出现一个问题:LINK : fatal error LNK1123: failure during conversion to COFF: file invalid. 具体也不知道啥意思:但是解决方法是: 1.因为虽然是win32程序,但是引用的库都是64位的,所以要把程序改为x64的 2.修改工程属性,由yes改为no,如下图所示: 版权声明:本文为博主原创文章,未经博主允许不得转载.

《Visual c++2013入门经典(第7版)》上机练习:为 Win32 控制台应用程序创建项目

看到<那些年我们追过的Wrox精品红皮计算机图书>有奖活动 下载了<Visual c++2013入门经典(第7版)>的试读PDF,开始学习. 这本书的读者对象本书针对任何想要学习如何使用 Visual C++编写在 Microsoft Windows 操作系统下运行的 C++应用程序的读者.阅读本书不需要预先具备任何特定编程语言的知识.如果属于下列 3 种情形之一,你就适合学习本教程:● 属于编程新手,十分渴望投入编程世界,并最终掌握 C++.要取得成功,你至少需要对计算机的工作原