using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace OnKeyDown

{

    class Program

    {

        static void Main(string[] args)

        {

            //实例化一个事件发送器

            KeyInputMonitor monitor = new KeyInputMonitor();

            //实例化一个事件接收器

            EventReceiver eventReceiver = new EventReceiver(monitor);

            //运行

            monitor.Run();

        }

    }

    internal class KeyEventArgs : EventArgs

    {

        private char keyChar;

        public KeyEventArgs(char keyChar) : base()

        {

            this.keyChar = keyChar;

        }

        public char KeyChar

        {

            get

            {

                return keyChar;

            }

        }

    }

    internal class KeyInputMonitor

    {

        //创建一个委托,返回类型为void,两个参数

        public delegate void KeyDown(object sender, KeyEventArgs e);

        //将创建的委托和特定事件关联,在这里特定的事件为OnKeyDown

        public event KeyDown OnKeyDown;

        public void Run()

        {

            bool finished = false;

            do

            {

                Console.WriteLine("Input a char");

                string response = Console.ReadLine();

                char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);

                switch(responseChar)

                {

                    case 'X':

                        finished = true;

                        break;

                    default:

                        //得到按键信息的参数

                        KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);

                        //触发事件

                        OnKeyDown(this, keyEventArgs);

                        break;

                }

            }while(!finished);

        }

    }

    internal class EventReceiver

    {

        public EventReceiver(KeyInputMonitor monitor)

        {

            //产生一个委托实例并添加到KeyInputMonitor产生的事件列表中

            monitor.OnKeyDown += new KeyInputMonitor.KeyDown(this.Echo);

        }

        private void Echo(object sender, KeyEventArgs e)

        {

            //真正的事件处理函数

            Console.WriteLine("Capture key: {0}", e.KeyChar);

        }

    }

}