·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 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 ; //忽略处理,让系统进行默认操作
}
}
}
|