본문 바로가기

개발새발 개발자/C#

[C# GUI 프로그래밍] 키보드 입력 처리

키보드에 대한 이벤트는 어디서 입력되어야 할까? 키보드는 특정 GUI에서 입력받는 게 아니라 폼 저체에서 입력을 받게 된다. 따라서 키보드 값을 입력받는 메소드는 폼에 속해야 한다.


키보드 이벤트를 만들려면 폼 영역을 더블 클릭 한 다음 오른쪽에 있는 속성 창 번개 모양 버튼을 누르면 된다.

KeyDown: 키를 누를 때 이벤트 발생

KeyPress: 키를 계속 누르고 있을 때 발생

KeyUp: 키를 뗄 때 발생


체감 상으로는 KeyDown과 KeyPress는 거의 비슷하다. KeyUp은 누르고 있다가 떼는 순간 일어나며, 잘 사용하지 않기 때문에 KeyDown과 KeyPress에 대해 알아보자.


- KeyDown 설정하기

1. KeyDown을 더블 클릭 해서 메소드를 생성한다.

2. 번개 아이콘 왼족 메뉴를 누르면 KeyPreview가 나타난다. 입력된 키를 출력할지 결정하는 속성이다. 출력하고 싶다면 true로 한다.


- KeyEventArgs e

키를 누르는 순간 e라는 객체를 통해서 무슨 키인지 값이 전달된다.


- e.KeyCode

이 안에 들어있는 값을 보고 어떤 키가 눌렸는지 알 수 있다.


- Keys.멤버

각 키에 대한 값


위의 표 외에도 다양한 값이 있으므로 아래에 써있는 주소에서 확인해보자.

https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.forms.keys?redirectedfrom=MSDN&view=netframework-4.7.2


- e.KeyChar

KeyDown과 달리 KeyChar 값을 통해 글자가 뭐가 들었는지 확인한다.


- (char)Keys.멤버

반드시 캐릭터형으로 캐스팅 해줘야 한다. 입력 가능 멤버를 보면 실제 들어오는 값이 문자 한개짜리 char형 변수이기 때문이다.


소스코드

namespace Week13Programming_Ex2

{

// propfull이라고 치고 탭을 두 번 누르면 기본적인 private 변수와 속성 코드가 자동 생성된다.


class MoocFighter    // 비행기를 위한 별도 클래스 생성 { private int x; private int y;

       // 외부로부터 x와 y를 입력받아 MoocFighter의 x y값으로 바꿔주는 생성자

       // 컨트롤 상에서 아무데나 배치해놓았을 비행기를 이 생성자로 제자리에 위치시킨다. public MoocFighter(int xPos, int yPos)     { x = xPos; y = yPos; }


       // getter와 setter public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } } }

최종 화면 GUI는 이렇게 구성하면 된다.


namespace Week13Programming_Ex2 { public partial class Form1 : Form { MoocFighter mf; public Form1() { InitializeComponent(); mf = new MoocFighter(0,0); }

       // 폼에서 key down 이벤트 발생

private void Form1_KeyDown(object sender, KeyEventArgs e)     {


           // key down이니까 keycode로 가져온다. switch (e.KeyCode) { case Keys.Up: mf.Y -= 1;


                   // 움직일 때마다 표시해주는 좌표 값 labelLocation.Text = "X좌표: " + mf.X + " Y좌표: " + mf.Y; break; case Keys.Down: mf.Y += 1; labelLocation.Text = "X좌표: " + mf.X + " Y좌표: " + mf.Y; break; case Keys.Right: mf.X += 1; labelLocation.Text = "X좌표: " + mf.X + " Y좌표: " + mf.Y; break; case Keys.Left: mf.X -= 1; labelLocation.Text = "X좌표: " + mf.X + " Y좌표: " + mf.Y; break; } } private void pictureBox1_Click(object sender, EventArgs e) { } } }