Hooking up to a Windows Callback
/* A Programmer's Introduction to C# (Second Edition) by Eric Gunnerson Publisher: Apress L.P. ISBN: 1-893115-62-3 */ // 31 - Interop\Calling Native DLL Functions\Hooking up to a Windows Callback // copyright 2000 Eric Gunnerson using System; using System.Threading; using System.Runtime.InteropServices; public class HookinguptoaWindowsCallback { 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 } } public 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 doesn't 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); }
1. | Demonstrates using the Microsoft.SystemEvents class to intercept an event generated by the system |