2009년 11월 6일 금요일

6_1,2. 키보드

계획보다 진도가 늦어졌지만..-_ㅠ 그래도 계획내에 끝마치도록..최선을 다해야겠죠~ㅋ

 

 

Chapter 6_1. 키보드 기초

  키보드 입력은 메시지 형태로 프로그램의 윈도우 프로시저에 전달됩니다.

  윈도우즈가 다양한 키보드 이벤트를 나타내기 위해 사용하는 메시지에는 총 8 개가 있지만, 이중 적어도 절반은 무시해도 아무 문제가 없습니다.

 

키보드 무시하기

 윈도우즈 프로그램에서 키보드는 종종 주요한 사용자 입력 소스가 되지만, 그렇다고 해서 프로그램이 모든 키보드 메시지에 반응할 필요는 없다.

 많은 윈도우즈 프로그램은 키보드 가속기 (keyboard accelerator)를 이용하여 사용되는 메뉴 항목흘 호출!

[ 가속기는 흔히 Ctrl 키를 포함하며, 기능 키 or 글자키와 조합하여 사용한다.]

 키보드 인터페이스 → 윈도우즈가 처리

 윈도우즈 = 프로그램에 미시지를 보냄으로써 키누름의 결과에 대해 알려준다.

 

누가 포커스를 가지고 있는가?

특정 키보드 이벤트는 입력 포커스(input focus)를 가진 윈도우가 받는다. 입력 포커스 개념은 활성 윈도우(active window) 개념과 밀접하게 연관된다.

*  입력 포커스 = 활성 윈도우 or 활성 윈도우의 자손 윈도우가 갖는다!

[ 자손 윈도우(descendant window) 란?  활성 윈도우의 자식(child), 활성 윈도우의 자식의 자식 등 ]

*  활성 윈도우  =  항상 최상위 (top-level) 윈도우 !   부모 윈도우 핸들은 NULL.

   활성 윈도우가 자식 윈도우를 갖고 있다면, 활성 윈도우 자신 혹은 활성 윈도우의 자손 윈도우가 입력 포커스를 가진다.

 

*  윈도우 프로시저는 WM_SETFOCUS와 WM_KILLFOCUS  메시지를 붙잠음으로써, 자신의 윈도우가 입력 포커스를 가지고 있는지 확인할 수 있다.

WM_SETFOCUS       // 윈도우가 입력 포커스를 얻고 있음.

WM_KILLFOCUS       // 윈도우가 입력 포커스를 얻고 있지 않음.

 

 

큐와 동기화

  사용자가 키보드의 키를 누르고 떼면,

  윈도우즈와 키보드 디바이스 드라이버는 하드웨어 스캔 코드(scan code)를 형식화된 메시지로 변환!  

→   시스템 메시지 큐 (system message queue)에 저장  

→   윈도우즈 애플리케이션이 이전 사용자 입력 메시지를 처리하면,  애플리케이션 메시지 큐에 넣음.

[시스템 메시지 큐?  윈도우즈가 유지하는 단일 메시지 큐로, 특히 사용자의 키보드/마우스 입력을 임시로 저장 ]

[ 키누름(keystrock)?  키를 누르는(pass) 행위 + 떼는(release) 행위 ]

 

 

 

Chapter 6_2. 키누름 메시지

 

 

시스템 키누름과 비시스템 키누름

                                                  키를 누름                                키를 뗌                  

비시스템 키누름                       WM_KEYDOWN                       WM_KEYUP

(Nonsystem Keystroke)            WM_SYSKEYDOWN                 WM_SYSKEYUP      

 

*  WM_SYSKEYDOWN과 WM_SYSKEYUP 메시지는 흔히 Alt 키와 다른 키의 조합으로 발생!

  이들 키누름은 프로그램 메뉴 혹은 시스템 메뉴 항목을 호출한다.

 

*  WM_KEYDOWN과 WM_KEYUP 메시지는 Alt 키를 사용하지 않고 키를 누그러가 뗄 때 흔히 발생!

  윈도우즈는 이들에 대해 신경 쓰지 않는다.

 

*  키누름 메시지 네 게 중에서, wParam = 누르거나 떼고 있는 키를 나타내는 가상 키코드 (virtual key code)

                                             lParam =  키누름과 관계된 그밖의 데이터

 

가상 키 코드

가장 자주 사용되는 가상 키 코드는 WINUSER.H 헤더 파일에  VK_로 시작하는 이름으로 정의되어 있다.

ex )  VK_LBUTTON,  VK_RBUTTON,  VK_CANCEL,  VK_MBUTTON,  VK_TAB 등

 

lParam 정보

32 bit lParam은 다음과 같이 여섯 개의 필드로 구분된다.

 

 

* 반복 카운트 (Repeat Count)  

     키누름 메시지가 나타내는 키누름의 갯수.

     반복 카운트가 1보다 크다는 것은 프로그램이 처리할 수 있는 것보다 빠르게 키누름이 발생하고 있다는 뜻!

 

* OEM 스캔 코드 (Original Equipment Manufacturer Scan Code)

    키보드 하드웨어가 발생시키는 코드.

    윈도우즈 프로그램은 거의 항상 OEM 스캔 코드를 무시할 수 있다.

 

* 확장 키 플래그

    IBM 확장 키보드에 있는 추가적인 키에서 키누름이 발생 했을 때 1이 된다.

    일반적으로 윈도우즈 프로그램은 확장 키 플래그를 무시한다.

 

* 컨텍스트 코드 (Context Code)

   키를 누르는 동안 Alt 키가 눌려져 있으면 1이 된다.

 

* 이전 키 상태 (Previous Key State)

   키를 이전에 뗀 상태 = 0,  키를 이전에 누른 상태 = 1

 

 

 

 

댓글 없음:

댓글 쓰기