Mega Code Archive

 
Categories / C# / Development Class
 

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); }