Programming Language/Windows API

키보드 메세지 처리

D4tai1 2018. 8. 26.

1. 키보드를 입력 시 

 - 윈도우 프로시저인 WinProc( )에 키보드 메세지, 가상키 값, 부가정보가 전달

 - 참고 : WM 은 Window Message의 약자.

 

 전달변수

 전달내용 

값 

 iMSG

 키보드 메세지

 WM_KEYDOWN

 WM_CHAR

 WM_KEYUP

 wParam

 가상키 값

 a, b, c ...

 1, 2, 3 ...

 !, @, #, $ ...

 VK_BACK(Backspace)

 VK_RETURN(Enter)

 ...

 

 lParam

 부가정보

 키 반복횟수

 확장 키 코드

 이전 키 상태

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
	PAINTSTRUCT ps;
	HDC hdc;

	case WM_CHAR:
	{
		TCHAR tmp[40];

		hdc = GetDC(hWnd);

		_stprintf_s(tmp, _T("keyboard input -> %s"), _T("show"));
		TextOut(hdc, 100, 200, tmp, _tcslen(tmp));
		
		ReleaseDC(hWnd, hdc);
	}	
	break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 

 

 

1) WM_KEYDOWN

 - 키보드의 키를 눌렀을 때 발생되는 이벤트

 

2) WM_CHAR

 - 키보드의 문자 키를 눌렀을 때 발생되는 이벤트

 

3) WM_KEYUP

 - 키보드의 키를 눌렀다가 떼었을 때 발생되는 이벤트

 

ex) 만약 a를 눌렀다면

 [1] 먼저 눌려졌기 때문에 WM_KEYDOWN 메세지가 발생

 [2] WM_CHAR 메세지가 발생

 [3] WM_KEYUP 메세지가 발생

 

+) 가상키의 종류

 

 

2. 사용한 함수

 

1) HDC hdc = GetDC(hWnd);

 - GetDC(hWnd); 함수로 출력영역에 대한 핸들값을 반환 받는다.

 - case WM_PAINT : 에서는

HDC hdc = BeginPaint(hWnd, &ps); 를 사용하여 출력영역에 대한 핸들값을 반환받았다.

그러나 WM_PAINT가 아닌 다른 메세지에서는 GetDC( ) 함수를 사용해야 한다.

두 함수의 기능은 같지만

다른윈도우로 가려지거나, 최소화 후 다시 창을 띄울 시

WM_PAINT 메세지를 처리하는 case문은 계속 볼 수 있다.

그러나 GetDC( ) 함수를 통해 화면에 출력하는 case문의 내용은 모두 사라진다.

 

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
		HDC hdc;
		TCHAR tmp[80];
		static TCHAR str[100];

	case WM_CHAR:
		hdc = GetDC(hWnd);
		_stprintf_s(tmp, _T("짜잔!!!                                        "));
		TextOut(hdc, 2, 2, tmp, _tcslen(tmp));

		ReleaseDC(hWnd, hdc);
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다.
			
			_stprintf_s(tmp, _T("아무키나 눌러보세요."));
			TextOut(hdc, 2, 2, tmp, _tcslen(tmp));

            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

[실행화면]

   ->  

 

'Programming Language > Windows API' 카테고리의 다른 글

keyboard[2]  (0) 2018.08.27
keyboard[1]  (0) 2018.08.27
TextOut(), DrawText()  (0) 2018.08.26
기본구조 상세설명  (0) 2018.08.25
출력  (0) 2018.08.25

댓글