Services Event C#

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// An keypress event example. 
  
using System; 
 
// Derive a custom EventArgs class that holds the key. 
class KeyEventArgs : EventArgs { 
  public char ch; 

 
// Declare a delegate for an event.  
delegate void KeyHandler(object source, KeyEventArgs arg); 
 
// Declare a key-press event class. 
class KeyEvent { 
  public event KeyHandler KeyPress; 
 
  // This is called when a key is pressed. 
  public void OnKeyPress(char key) { 
    KeyEventArgs k = new KeyEventArgs(); 
   
    if(KeyPress != null) { 
      k.ch = key; 
      KeyPress(this, k); 
    } 
  } 

 
// A class that receives key-press notifications. 
class ProcessKey { 
  public void keyhandler(object source, KeyEventArgs arg) { 
    Console.WriteLine("Received keystroke: " + arg.ch); 
  } 

 
// Another class that receives key-press notifications. 
class CountKeys { 
  public int count = 0; 
 
  public void keyhandler(object source, KeyEventArgs arg) { 
    count++; 
  } 

 
// Demonstrate KeyEvent. 
public class KeyEventDemo { 
  public static void Main() {  
    KeyEvent kevt = new KeyEvent(); 
    ProcessKey pk = new ProcessKey(); 
    CountKeys ck = new CountKeys(); 
    char ch; 
 
    kevt.KeyPress += new KeyHandler(pk.keyhandler); 
    kevt.KeyPress += new KeyHandler(ck.keyhandler); 
 
    Console.WriteLine("Enter some characters. " + 
                      "Enter a period to stop."); 
    do { 
      ch = (char) Console.Read(); 
      kevt.OnKeyPress(ch); 
    } while(ch != '.'); 
    Console.WriteLine(ck.count + " keys pressed."); 
  } 
}