[C#] WinForm 컨트롤에서 메시지 처리 팁

2009. 11. 11. 17:34Coders

작업하던 도중... 기록해 둬야 할 것 같아서 포스팅 합니다.

1. WinForm 상에서 Tab키 가로채기(Tab 키로 뭔가 하고 싶을 때)
윈폼에서는 몇몇 키 입력이 KeyPress 나 KeyDown 등의 이벤트 핸들러에서 잡지 못합니다.그 몇몇키중 하나가 Tab키 인데, 다음과 같이 ProcessCmdKey 메소드를 override 하는 방법으로 처리할수 있습니다.
  1. private const int WM_KEYDOWN = 0x100;
  2. private const int WM_SYSKEYDOWN = 0x104;
  3.  
  4. protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  5. {
  6.     if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
  7.     {
  8.         switch (keyData)
  9.         {
  10.         case Keys.Tab:
  11.             //원하는 코드를 여기에 넣는다.
  12.             break;
  13.         default:
  14.             break;
  15.         }
  16.     }
  17.  
  18.     return base.ProcessCmdKey(ref msg, keyData);
  19. }

2. 타이틀바 더블클릭 메시지 가로채기 (예제는 커지지 않도록 하는 방법)
윈폼을 사용하면서, 타이틀바(Titlebar 또는 Captionbar)를 더블클릭했을 때 최대화(Maximize)되는데요, 이를 방지하고 싶었으나 프로퍼티상에서 찾을 수가 없어서 다음과 같이 WndProc 메소드를 override 하는 방법으로 해결했습니다. 다른 메시지 가로채기할 때에도 유용할 것 같군요.
  1. private const int WM_NCLBUTTONDBLCLK = 0xA3;
  2.  
  3. protected override void WndProc(ref Message m)
  4. {
  5.     switch (m.Msg)
  6.     {
  7.     case WM_NCLBUTTONDBLCLK:
  8.         if (this.WindowState == System.Windows.Forms.FormWindowState.Maximized)
  9.             this.WindowState = System.Windows.Forms.FormWindowState.Normal;
  10.         return;
  11.     default:
  12.         break;
  13.     }
  14.  
  15.     base.WndProc(ref m);
  16. }

3. 메시지와는 관련 없지만, 타이틀바에서 close(x)버튼 비활성화 하는 방법
출처 : http://vinothnat.blogspot.com/ (유용한 정보가 많네요.)
타이틀바에서 기본적으로 ControlBox 속성을 true 로 주면, 최대화/최소화/닫기 버튼이 나타납니다. ㅁ_x 이렇게요. 나타나게 한 뒤, 최대/최소화 버튼은 각각 MaximizeBox, MinimizeBox 속성을 false 로 해 줌으로서 안보이게 할 수 있지만, x 버튼은 사라지게 할 수 없습니다. 아직 사라지게 하는 방법은 찾지 못했지만(WndProc로 가능하긴 할 듯), 일단 비활성화(disable)하는 방법입니다.
  1. protected override CreateParams CreateParams
  2. {
  3.     get
  4.     {
  5.         CreateParams param = base.CreateParams;
  6.         param.ClassStyle = param.ClassStyle | 0x200;
  7.         return param;
  8.     }
  9. }