KeyEvnetHandler의 인자인 KeyEventArgs와, 키가 눌려졌을 때 발생하는 이벤트인 KeyPressEventHandler의 인자인 KeyPressEventArgs는, 중복되는 것 같다. 하지만, 실제로는 그렇지 않다. 당장, 폼 하나를 생성하고 KeyDown, KeyPress 이벤트를 재정의해서 확인해보라.
KeyDown, KeyUp 이벤트에서의 KeyEventArgs의 KeyCode, KeyData, KeyValue는 언뜻 생각하면 현재 눌려진 키의 키값을 생성한다고 생각되겠지만, 사실 그렇지 않다. 키보드에서 어떤 키가 눌려졌다면, 그 값의 Virtual Key 값을 의미하는 것이다. 즉, 키보드에서 Caps Lock이 켜져 있든 그렇지 않든, d를 눌렀다면 KeyCode, KeyData, KeyValue는 모두 Virtual Key 값 D를 가진다.
그렇지만, KeyPress 이벤트에서 생성되는 값은 다르다. 즉, KeyPressEventArgs의 인자인 keyChar는, 익숙한, 원했던 값인, 소문자, 대문자, 등의 'CHAR' 값을 생성해서 돌려준다. 또 이것은 유니코드이므로 C/C++의 char형과 다르게 16비트 값이다.
즉, 정리하자면, KeyDown, Up 이벤트는 순수하게 어떤 키보드가 눌려졌는지에 대한 정보를 제공하는 이벤트이며, 실제로 어떤 문자가 출력되는지 알기위해서는, KeyPress 이벤트를 처리해야 한다는 것이다.
KeyDown, KeyUp 이벤트에서의 KeyEventArgs의 KeyCode, KeyData, KeyValue는 언뜻 생각하면 현재 눌려진 키의 키값을 생성한다고 생각되겠지만, 사실 그렇지 않다. 키보드에서 어떤 키가 눌려졌다면, 그 값의 Virtual Key 값을 의미하는 것이다. 즉, 키보드에서 Caps Lock이 켜져 있든 그렇지 않든, d를 눌렀다면 KeyCode, KeyData, KeyValue는 모두 Virtual Key 값 D를 가진다.
그렇지만, KeyPress 이벤트에서 생성되는 값은 다르다. 즉, KeyPressEventArgs의 인자인 keyChar는, 익숙한, 원했던 값인, 소문자, 대문자, 등의 'CHAR' 값을 생성해서 돌려준다. 또 이것은 유니코드이므로 C/C++의 char형과 다르게 16비트 값이다.
즉, 정리하자면, KeyDown, Up 이벤트는 순수하게 어떤 키보드가 눌려졌는지에 대한 정보를 제공하는 이벤트이며, 실제로 어떤 문자가 출력되는지 알기위해서는, KeyPress 이벤트를 처리해야 한다는 것이다.