본문 바로가기
프로그래밍/C#, WPF, .Net

[C#, WPF] 키보드 입력 이벤트 처리하기

by GhostWeb 2020. 6. 28.
반응형

 

이번에는 키보드 입력을 받아 처리하는 방법에 대해서 알아보도록 할게요.

 

각 컨트롤러에서 키보드 입력(KeyDown)을 받을 수 있는데 테스트를 위해서 main window에서 어떻게 이용하는지 간략하게 설명할게요.

 

키보드 이벤트 등록

 

MainWindow.xaml에서 메인 창을 선택하고 속성 창에서 번개 모양의 <선택한 요소의 이벤트 처리기>를 클릭하면 해당 요소의 이벤트 처리를 등록할 수 있어요.

 

KeyDown이 키보드의 키가 눌렀을 때 발생하는 이벤트로 PreviewKeyDown, KeyDown 두 이벤트가 있는데 둘 다 키보드의 키가 눌렸을 경우 이벤트가 발생하지만 약간의 차이가 있어요.

 

 

- 이벤트 종류

Window_KeyDown

Window_PreviewKeyDown

 

Preview가 붙은 이벤트는 터널링 방식으로 상위 엘리먼트 -> 하위 엘리먼트로 전달되는 방식으로 만약에 다른 하위 엘리먼트에서 Preview로 이벤트를 등록했다면 MainWindow -> 해당 하위 엘리먼트 순으로 키 이벤트가 전달되는 방식이에요.

 

Preview가 붙지 않은 이벤트는 버블링 방식으로 Preview와 반대로 하위 -> 상위 엘리먼트로 이벤트를 전달한다고 생각하면 돼요.

 

- Ex

Preview(터널링) : MainWindow -> Grid -> Button

Non Preview(버블링) : Button -> Grid -> MainWindow

 

개발 하실 때 이벤트 필터링이 필요하다면 각 이벤트의 EventArgs 매개 변수의 Handled을 true로 설정하시면 다음 엘리먼트로 전달되지 않으니 이점 유의하세요.

 

테스트를 위해 MainWindow에 Window_KeyDown, Window_PreviewKeyDown를 등록하여 Console.WriteLine()을 이용하여 발생 순서를 찍으면 Preview 이벤트가 먼저 발생하는 것을 볼 수 있어요.

 

- 이벤트 발생 순서

Window_PreviewKeyDown

Window_KeyDown

 

이제 키보드의 키가 눌렸을 경우 해당 이벤트가 발생하는 것을 알았으니 어떤 키가 입력되었나 판별해보도록 할게요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
    Console.WriteLine("Window_PreviewKeyDown");
    Console.WriteLine(e.Key.ToString());
    Console.WriteLine("------------------------------------------");
 
    switch (e.Key)
    {
        case Key.A:
            Console.WriteLine("A");
            break;
        case Key.D1:
            Console.WriteLine("1");
            break;
    }
 
    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
    {
        Console.WriteLine("Ctrl");
    }
}
cs

 

e.Key 값이 현재 입력된 키의 값으로 이를 이용하여 입력된 키에 대한 처리를 하면 돼요.

Ctrl, Alt 등의 키와 함께 눌린 키를 판단할 때는 17번째 줄을 참고하세요.

 

 

그럼 이상으로 포스팅을 마치며 오늘도 즐거운 코딩 하세요.

 

반응형