본문 바로가기

Library/.NET Framework with C#

KeyDown, KeyUp, KeyPress

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 이벤트를 처리해야 한다는 것이다.