using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
using
System.Runtime.InteropServices;
using
System.Threading;
namespace
CSharp_Win32控制台应用程序忽略CtrlC
{
public
delegate
bool
ConsoleCtrlDelegate(
int
ctrlType);
class
Program
{
[DllImport(
"kernel32.dll"
)]
private
static
extern
bool
SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine,
bool
Add);
private
const
int
CTRL_CLOSE_EVENT = 2;
private
const
int
CTRL_C_EVENT = 0;
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();
}
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"></param>
/// <returns></returns>
private
static
bool
HandlerRoutine(
int
ctrlType)
{
switch
(ctrlType)
{
case
CTRL_C_EVENT:
Console.WriteLine(
"C"
);
return
true
;
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
false
;
}
}
}