// Code from
// A Programmer's Introduction to C# 2.0, Third Edition
// copyright 2000 Eric Gunnerson
using System;
using System.Threading;
using System.Runtime.InteropServices;
class ConsoleCtrl
{
public enum ConsoleEvent
{
CTRL_C = 0, // From wincom.h
CTRL_BREAK = 1,
CTRL_CLOSE = 2,
CTRL_LOGOFF = 5,
CTRL_SHUTDOWN = 6
}
public delegate void ControlEventHandler(ConsoleEvent consoleEvent);
public event ControlEventHandler ControlEvent;
// save delegate so the GC doesnt collect it.
ControlEventHandler eventHandler;
public ConsoleCtrl()
{
// save this to a private var so the GC doesn't collect it
eventHandler = new ControlEventHandler(Handler);
SetConsoleCtrlHandler(eventHandler, true);
}
private void Handler(ConsoleEvent consoleEvent)
{
if (ControlEvent != null)
ControlEvent(consoleEvent);
}
[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler(ControlEventHandler e, bool add);
}
class MainClass
{
public static void MyHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
{
Console.WriteLine("Event: {0}", consoleEvent);
}
public static void Main()
{
ConsoleCtrl cc = new ConsoleCtrl();
cc.ControlEvent += new ConsoleCtrl.ControlEventHandler(MyHandler);
Console.WriteLine("Enter 'E' to exit");
Thread.Sleep(15000); // sleep 15 seconds
}
}
Enter 'E' to exit
Event: CTRL_C
Terminate batch job (Y/N)?
Terminate batch job (Y/N)? n
29.9.Windows Callback |
| 29.9.1. | Hooking up to a Windows Callback |