Csharp/CSharp Tutorial/Windows/Windows Callback

Материал из .Net Framework эксперт
Версия от 15:20, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Hooking up to a Windows Callback

<source lang="csharp">// 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 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);

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

}</source>

Enter "E" to exit
Event: CTRL_C
Terminate batch job (Y/N)?
Terminate batch job (Y/N)? n