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

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

{

//定义处理程序委托

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;//忽略处理,让系统进行默认操作

}

}

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航