오늘은 포스팅 주제 풍년인 듯 하다.

위 두 개 속성의 MSDN 페이지가 한글인 척하고 부분 번역이라서 일단 번역을 첨부한다.

원문 링크 : KeyEventArgs.Handled, KeyEventArgs.SuppressKeyPress

 

Handled

(키 이벤트의) Handled 속성은 다른 Windows.Forms 소속의 컨트롤들과는 다르게 구현되어 있다. native Win32 컨트롤을 기반으로 하는 텍스트 박스 같은 컨트롤들에서는, (이 속성값이) 발생한 키 메시지를 native Win32 컨트롤을 상속받은 컨트롤(즉, C#에서 만든 TextBox 클래스 본인)에게 전달되지 않게 한다는 의미로 해석된다. 만약 텍스트 박스의 Handled 속성을 true로 설정하면 그 컨트롤은 key press 이벤트를 (C# TextBox 클래스로) 전달하진 않겠지만, (native Win32 컨트롤 자체에는 전달되기 때문에) 유저가 입력한 대로 문자들이 찍히기는 할 것이다.

만약 현재 컨트롤이 key press 메시지를 아예 못 받게 하고 싶다면 SuppressKeyPress 속성을 사용하라.

 

SuppressKeyPress

key down 메시지 핸들러 같은 곳에서 유저의 입력을 방해하기 위한 용도로 이 속성을 설정할 수 있다.

SuppressKeyPress 값이 true가 되면 Handled 속성 또한 true로 설정된다.

 

해당 속성의 주석까지 다 털어본 결과 결국 Handled 속성은 기본 이벤트 핸들러를 호출하지 않고 건너뛰겠다는 얘기 같았지만, 여전히 역할상으로 이 두 개가 무슨 차이인지 설명만 봐서는 감이 안 와서 테스트해 보고 다음과 같은 결론을 얻었다.

  • KeyDown/KeyUp 핸들러에서 Handled 속성을 true로 설정하면 KeyPress로 처리되는 문자를 제외한 키 입력 처리가 되지 않는다. 즉, 문자열 입력은 정상적으로 되지만 방향키나 Home/End 등이 제대로 동작하지 않는다. 엔터키의 경우는 문자열로 취급되기 때문에 KeyPress가 호출되어 전달은 되지만 시스템적인 처리(라인피드 등)는 되지 않는다.
  • KeyPress 핸들러에서 Handled 속성을 true로 설정하면 C# TextBox(Rich 포함)에서 문자 출력이 되지 않는다.
  • KeyDown/KeyUp 어디서든 SuppressKeyPress 값이 true가 되면 해당 메시지가 아예 처리되지 않는다. 따라서 KeyPress도 자연스럽게 발생하지 않는다. KeyPressEventArgs에는 SuppressKeyPress 속성이 없다.

이제 명확하게 사용할 수 있겠다!

Posted by OOJJRS
,