« Scale, extend, stay running and don't fo... | Main | More ASP.NET Globalization/Localization/... »

Ever want to catch Ctrl-C from a .NET Console Application and perform some crucial cleanup?  Well, you can...

using System;
using
System.Runtime.InteropServices;
using
System.Text;
using
System.Threading;

namespace Testing
{
/// <summary>
///
Class to catch console control events (ie CTRL-C) in C#.
///
Calls SetConsoleCtrlHandler() in Win32 API
/// </summary>
public class ConsoleCtrl: IDisposable
{
/// <summary>
///
The event that occurred.
/// </summary>
public enum ConsoleEvent
{
CtrlC = 0,CtrlBreak = 1,CtrlClose = 2,CtrlLogoff = 5,CtrlShutdown =
6
}

/// <summary>
///
Handler to be called when a console event occurs.
/// </summary>
public delegate void ControlEventHandler(ConsoleEvent consoleEvent);

/// <summary>
///
Event fired when a console event occurs
/// </summary>
public event ControlEventHandler ControlEvent;

ControlEventHandler eventHandler;

public ConsoleCtrl()
{
// save this to a private var so the GC doesn't collect it...
eventHandler = new ControlEventHandler(Handler);
SetConsoleCtrlHandler
(eventHandler, true);
}

~ConsoleCtrl()
{
Dispose
(false);}

public void Dispose()
{
Dispose
(true);
GC.SuppressFinalize
(this);
}

void Dispose(bool disposing)
{
 if
(eventHandler != null)
 {
  SetConsoleCtrlHandler
(eventHandler, false);
  eventHandler = null
;
 }
}

private void Handler(ConsoleEvent consoleEvent)
{
if
(ControlEvent != null)
 
ControlEvent
(consoleEvent);
}

[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler
(ControlEventHandler e, bool add);
}

}

using System;
using
System.Reflection;
using
System.Diagnostics;

namespace
.Testing
{
class Test
{
public
static void inputHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
{
if
(consoleEvent == ConsoleCtrl.ConsoleEvent.CtrlC)
{
Console.WriteLine
("Stopping due to user input");
// Cleanup code here.
System.Environment.Exit(-1);
}
}

[STAThread]
static void Main
(string[] args)
{

ConsoleCtrl cc = new ConsoleCtrl();
cc.ControlEvent += new
ConsoleCtrl.ControlEventHandler(inputHandler);
for
( ;; )
{
Console.WriteLine
("Press any key...");
Console.ReadLine
();
}
}
}
}



Thursday, March 10, 2005 4:02:33 AM (Pacific Standard Time, UTC-08:00)
the codes work well, thank you!
junli
Comments are closed.

Contact

Sponsors

Hosting By

Hot Topics

Tags

Calendar

<March 2010>
SunMonTueWedThuFriSat
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

Archives

March, 2010 (10)
February, 2010 (17)
January, 2010 (13)
December, 2009 (13)
November, 2009 (7)
October, 2009 (19)
September, 2009 (11)
August, 2009 (12)
July, 2009 (21)
June, 2009 (26)
May, 2009 (16)
April, 2009 (13)
March, 2009 (17)
February, 2009 (17)
January, 2009 (18)
December, 2008 (32)
November, 2008 (17)
October, 2008 (22)
September, 2008 (16)
August, 2008 (14)
July, 2008 (25)
June, 2008 (19)
May, 2008 (17)
April, 2008 (17)
March, 2008 (26)
February, 2008 (21)
January, 2008 (28)
December, 2007 (19)
November, 2007 (17)
October, 2007 (31)
September, 2007 (39)
August, 2007 (37)
July, 2007 (43)
June, 2007 (37)
May, 2007 (32)
April, 2007 (38)
March, 2007 (29)
February, 2007 (46)
January, 2007 (31)
December, 2006 (27)
November, 2006 (31)
October, 2006 (32)
September, 2006 (39)
August, 2006 (34)
July, 2006 (40)
June, 2006 (18)
May, 2006 (31)
April, 2006 (34)
March, 2006 (30)
February, 2006 (38)
January, 2006 (44)
December, 2005 (19)
November, 2005 (34)
October, 2005 (24)
September, 2005 (37)
August, 2005 (20)
July, 2005 (24)
June, 2005 (33)
May, 2005 (16)
April, 2005 (22)
March, 2005 (34)
February, 2005 (15)
January, 2005 (37)
December, 2004 (28)
November, 2004 (30)
October, 2004 (34)
September, 2004 (22)
August, 2004 (34)
July, 2004 (18)
June, 2004 (64)
May, 2004 (49)
April, 2004 (21)
March, 2004 (29)
February, 2004 (29)
January, 2004 (36)
December, 2003 (25)
November, 2003 (24)
October, 2003 (59)
September, 2003 (42)
August, 2003 (24)
July, 2003 (44)
June, 2003 (29)
May, 2003 (21)
April, 2003 (30)
March, 2003 (27)
February, 2003 (47)
January, 2003 (50)
December, 2002 (31)
November, 2002 (38)
October, 2002 (44)
September, 2002 (15)
May, 2002 (2)
April, 2002 (4)

Google Ads