다음을 통해 공유


키보드 입력 개요

애플리케이션은 키보드와 마우스의 사용자 입력을 허용해야 합니다. 애플리케이션은 창에 게시된 메시지 형식으로 키보드 입력을 받습니다.

키보드 입력 모델

시스템은 현재 키보드에 적합한 키보드 디바이스 드라이버를 설치하여 애플리케이션에 대한 디바이스 독립적 키보드 지원을 제공합니다. 시스템은 현재 사용자 또는 애플리케이션에서 선택한 언어별 키보드 레이아웃을 사용하여 언어 독립적 키보드 지원을 제공합니다. 키보드 디바이스 드라이버는 키보드에서 스캔 코드를 수신합니다. 이 코드는 키보드 레이아웃으로 전송되어 메시지로 변환되고 애플리케이션의 적절한 창에 게시됩니다.

키보드의 각 키에 할당된 고유한 값은 키보드의 키를 식별하는 장치 종속적인 스캔 코드입니다. 키보드는 사용자가 키를 형식화할 때 두 개의 스캔 코드를 생성합니다. 하나는 사용자가 키를 누를 때, 다른 하나는 사용자가 키를 놓을 때입니다.

키보드 디바이스 드라이버는 스캔 코드를 해석하고, 시스템에서 키의 용도를 식별하기 위해 정의한 디바이스 독립적 값인 가상 키 코드로 번역(매핑)합니다. 검색 코드를 변환한 후 키보드 레이아웃은 검사 코드, 가상 키 코드 및 키 입력에 대한 기타 정보를 포함하는 메시지를 만든 다음 시스템 메시지 큐에 메시지를 배치합니다. 시스템은 시스템 메시지 큐에서 메시지를 제거하고 해당 스레드의 메시지 큐에 게시합니다. 결국 스레드의 메시지 루프는 메시지를 제거하고 처리를 위한 적절한 창 프로시저에 전달합니다. 다음 그림에서는 키보드 입력 모델을 보여 줍니다.

키보드 입력 처리 모델

키보드 포커스 및 활성화

시스템은 키보드 포커스를 사용하여 창을 만든 포그라운드 스레드의 메시지 큐에 키보드 메시지를 게시합니다. 키보드 포커스 창의 임시 속성입니다. 시스템은 키보드 포커스를 사용자의 방향으로 한 창에서 다른 창으로 이동하여 디스플레이의 모든 창 간에 키보드를 공유합니다. 키보드 포커스가 있는 창은 포커스가 다른 창으로 변경될 때까지 모든 키보드 메시지를 수신합니다(이를 만든 스레드의 메시지 큐에서).

스레드는 GetFocus 함수를 호출하여 현재 키보드 포커스가 있는 창(있는 경우)을 확인할 수 있습니다. 스레드는 SetFocus 함수를 호출하여 키보드 포커스를 창 중 하나에 제공할 수 있습니다. 키보드 포커스가 한 창에서 다른 창으로 변경되면 시스템은 포커스가 손실된 창으로 WM_KILLFOCUS 메시지를 보낸 다음 포커스를 얻은 창에 WM_SETFOCUS 메시지를 보냅니다.

키보드 포커스의 개념은 현재 창의 개념과 관련이 있습니다. 활성 창 사용자가 현재 작업 중인 최상위 창입니다. 키보드 포커스가 있는 창은 활성 창이거나 활성 창의 자식 창입니다. 사용자가 활성 창을 식별할 수 있도록 시스템에서 Z 순서의 맨 위에 배치하고 제목 표시줄(있는 경우)과 테두리를 강조 표시합니다.

사용자는 최상위 창을 클릭하거나, Alt+TAB 또는 Alt+ESC 키 조합을 사용하여 선택하거나, 작업 목록에서 선택하여 최상위 창을 활성화할 수 있습니다. 스레드는 SetActiveWindow 함수를 사용하여 최상위 창을 활성화할 수 있습니다. GetActiveWindow 함수를 사용하여 만든 최상위 창이 활성 상태인지 여부를 확인할 수 있습니다.

한 창이 비활성화되고 다른 창이 활성화되면 시스템에서 WM_ACTIVATE 메시지를 보냅니다. 창이 비활성화되는 경우 wParam 매개 변수의 하위 비트는 0이고, 활성화되는 경우에는 0이 아닙니다. 기본 창 프로시저가 WM_ACTIVATE 메시지를 받으면 키보드 포커스가 활성 창으로 설정됩니다.

키보드 및 마우스 입력 이벤트가 애플리케이션에 도달하지 못하도록 차단하려면 BlockInput사용합니다. BlockInput 함수는 비동기 키보드 입력 상태 테이블을 방해하지 않습니다. 즉, 입력이 차단되는 동안 SendInput 함수를 호출하면 비동기 키보드 입력 상태 테이블이 변경됩니다.

키 입력 메시지

키를 누르면 키보드 포커스가 있는 창에 연결된 스레드 메시지 큐에 WM_KEYDOWN 또는 WM_SYSKEYDOWN 메시지가 배치됩니다. 키를 해제하면 WM_KEYUP 또는 WM_SYSKEYUP 메시지가 큐에 배치됩니다.

키 업 및 키 다운 메시지는 일반적으로 쌍으로 발생하지만 사용자가 키보드의 자동 반복 기능을 시작할 수 있을 만큼 긴 키를 누른 경우 시스템은 여러 WM_KEYDOWN 또는 WM_SYSKEYDOWN 메시지를 연속으로 생성합니다. 그런 다음 사용자가 키를 해제할 때 단일 WM_KEYUP 또는 WM_SYSKEYUP 메시지를 생성합니다.

이 섹션에서는 다음 항목을 다룹니다.

시스템 및 비시스템 키 입력

시스템은 시스템 키 입력과 비시스템 키 입력을 구분합니다. 시스템 키 입력은 시스템 키 입력 메시지, WM_SYSKEYDOWNWM_SYSKEYUP생성합니다. 비시스템 키 입력은 비시스템 키 입력 메시지, WM_KEYDOWNWM_KEYUP생성합니다.

창 프로시저에서 시스템 키 입력 메시지를 처리해야 하는 경우 메시지를 처리한 후 프로시저가 DefWindowProc 함수에 전달해야 합니다. 그렇지 않으면 창에 키보드 포커스가 있을 때마다 ALT 키와 관련된 모든 시스템 작업이 비활성화됩니다. 즉, 사용자는 창의 메뉴나 시스템 메뉴에 액세스하거나 Alt+ESC 또는 Alt+TAB 키 조합을 사용하여 다른 창을 활성화할 수 없습니다.

시스템 키 입력 메시지는 주로 애플리케이션이 아닌 시스템에서 사용하기 위한 것입니다. 시스템은 이를 사용하여 메뉴에 기본 제공 키보드 인터페이스를 제공하고 사용자가 활성 창을 제어할 수 있도록 합니다. 시스템 키 입력 메시지는 사용자가 ALT 키와 함께 키를 입력하거나 사용자가 입력하고 창에 키보드 포커스가 없는 경우(예: 활성 애플리케이션이 최소화된 경우) 생성됩니다. 이 경우 메시지는 현재 창에 연결된 메시지 큐에 게시됩니다.

비시스템 키 입력 메시지는 애플리케이션 창에서 사용됩니다. DefWindowProc 함수는 아무 작업도 수행하지 않습니다. 창 프로시저는 필요하지 않은 비시스템 키 입력 메시지를 삭제할 수 있습니다.

Virtual-Key 코드 설명

키 입력 메시지의 wParam 매개 변수에는 누름 또는 해제된 키의 가상 키 코드 포함됩니다. 창 프로시저는 가상 키 코드의 값에 따라 키 입력 메시지를 처리하거나 무시합니다.

일반적인 창 프로시저는 수신한 키 입력 메시지 중 작은 하위 집합만 처리하고 나머지는 무시합니다. 예를 들어 창 프로시저는 WM_KEYDOWN 키 입력 메시지와 커서 이동 키, 시프트 키(컨트롤 키라고도 함) 및 함수 키에 대한 가상 키 코드가 포함된 메시지만 처리할 수 있습니다. 일반적인 창 프로시저는 문자 키에서 키 입력 메시지를 처리하지 않습니다. 대신 TranslateMessage 함수를 사용하여 메시지를 문자 메시지로 변환합니다. TranslateMessage 및 문자 메시지에 대한 자세한 내용은 문자 메시지를 참조하십시오.

키 입력 메시지 플래그

키 입력 메시지의 lParam 매개 변수에는 메시지를 생성한 키 입력에 대한 추가 정보가 포함되어 있습니다. 이 정보에는 반복 횟수, 검사 코드, 확장 키 플래그, 컨텍스트 코드, 이전 키 상태 플래그전환 상태 플래그포함됩니다. 다음 그림에서는 이러한 플래그의 위치와 lParam 매개 변수의 값을 보여 줍니다.

키 입력 메시지의 lparam 매개 변수에서 플래그 및 값의 위치를

애플리케이션은 다음 값을 사용하여 lParam상위 단어에서 키 입력 플래그를 가져올 수 있습니다.

묘사
KF_EXTENDED
0x0100
확장 키 플래그조작합니다.
KF_DLGMODE
0x0800
대화 상자가 활성 상태인지 여부를 나타내는 대화 모드 플래그를 조작합니다.
KF_MENUMODE
0x1000
메뉴가 활성 상태인지 여부를 나타내는 메뉴 모드 플래그를 조작합니다.
KF_ALTDOWN
0x2000
컨텍스트 코드 플래그조작합니다.
KF_REPEAT
0x4000
이전 키 상태 플래그 이(가) 조작합니다.
KF_UP
0x8000
전환 상태 플래그조작합니다.

예제 코드:

case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
    WORD vkCode = LOWORD(wParam);                                 // virtual-key code
    
    WORD keyFlags = HIWORD(lParam);

    WORD scanCode = LOBYTE(keyFlags);                             // scan code
    BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
    
    if (isExtendedKey)
        scanCode = MAKEWORD(scanCode, 0xE0);

    BOOL wasKeyDown = (keyFlags & KF_REPEAT) == KF_REPEAT;        // previous key-state flag, 1 on autorepeat
    WORD repeatCount = LOWORD(lParam);                            // repeat count, > 0 if several keydown messages was combined into one message

    BOOL isKeyReleased = (keyFlags & KF_UP) == KF_UP;             // transition-state flag, 1 on keyup

    // if we want to distinguish these keys:
    switch (vkCode)
    {
    case VK_SHIFT:   // converts to VK_LSHIFT or VK_RSHIFT
    case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
    case VK_MENU:    // converts to VK_LMENU or VK_RMENU
        vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
        break;
    }

    // ...
}
break;

반복 횟수

반복 횟수를 확인하여 키 입력 메시지가 둘 이상의 키 입력을 나타내는지 여부를 확인할 수 있습니다. 시스템에서는 키보드가 WM_KEYDOWN 또는 WM_SYSKEYDOWN 메시지를 애플리케이션에서 처리할 수 있는 것보다 빠르게 생성할 때 수를 증분합니다. 이는 사용자가 키보드의 자동 반복 기능을 시작할 수 있을 만큼 긴 키를 누를 때 자주 발생합니다. 시스템 메시지 큐를 생성된 키 눌림 메시지로 채우는 대신, 시스템은 메시지를 단일 키 눌림 메시지로 결합하고 반복 횟수를 증가시킵니다. 키를 해제하면 자동 반복 기능을 시작할 수 없으므로 WM_KEYUPWM_SYSKEYUP 메시지에 대한 반복 횟수는 항상 1로 설정됩니다.

코드 검사

각 키의 키 위치가 있는 Type 4 키보드의 다이어그램입니다.

스캔 코드는 사용자가 키를 누를 때 시스템에서 생성하는 값입니다. 활성 키보드 레이아웃에 관계없이 눌린 키를 식별하는 값으로, 키가 나타내는 문자와는 다릅니다. 애플리케이션은 일반적으로 검사 코드를 무시합니다. 대신 가상 키 코드를 사용하여 키 입력 메시지를 해석합니다.

최신 키보드는 HID(휴먼 인터페이스 디바이스) 사양을 사용하여 컴퓨터와 통신합니다. 키보드 드라이버 키보드에서 보낸 보고된 HID 사용량 값을 변환하여 코드를 스캔하고 애플리케이션에 전달합니다.

메모

가상 키 코드는 일반적으로 데스크톱 애플리케이션에 더 유용하지만 현재 키보드 레이아웃관계없이 어떤 키를 누르는지 알아야 하는 특정 경우에 검색 코드가 필요할 수 있습니다. 예를 들어, 게임의 WASD 키 설정(W는 위로, A는 왼쪽, S는 아래로, D는 오른쪽)으로 미국 QWERTY 또는 프랑스 AZERTY 키보드 레이아웃에 걸쳐 일관된 키 배치를 보장합니다.

다음 표에서는 현재 Windows에서 인식되는 검사 코드 집합을 나열합니다. HID 사용량 페이지/HID 사용량 ID/HID 사용 이름 값은 HID 사용량 테이블 문서를 참조합니다. 키 위치 값은 이전 키보드 이미지를 참조합니다.

스캔 1 메이크 코드는 WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP 그리고 WM_INPUT 메시지로 전달됩니다.

HID 사용 페이지 이름 HID 사용 이름 HID 사용 페이지 HID 사용 ID 스캔 1 생성하기 키 위치
일반 데스크톱 시스템 전원 다운 0x0001 0x0081 0xE05E
일반 데스크톱 시스템 절전 모드 0x0001 0x0082 0xE05F
일반 데스크톱 시스템 깨우기 0x0001 0x0083 0xE063
키보드/키패드 에러롤오버 0x0007 0x0001 0x00FF
키보드/키패드 키보드 A 0x0007 0x0004 0x001E 31
키보드/키패드 키보드 B 0x0007 0x0005 0x0030 50
키보드/키패드 키보드 C 0x0007 0x0006 0x002E 48
키보드/키패드 키보드 D 0x0007 0x0007 0x0020 33
키보드/키패드 키보드 E 0x0007 0x0008 0x0012 19
키보드/키패드 키보드 F 0x0007 0x0009 0x0021 34
키보드/키패드 키보드 G 0x0007 0x000A 0x0022 35
키보드/키패드 키보드 H 0x0007 0x000B 0x0023 36
키보드/키패드 키보드 I 0x0007 0x000C 0x0017 24
키보드/키패드 키보드 J 0x0007 0x000D 0x0024 37
키보드/키패드 키보드 K 0x0007 0x000E 0x0025 38
키보드/키패드 키보드 L 0x0007 0x000F 0x0026 39
키보드/키패드 키보드 M 0x0007 0x0010 0x0032 52
키보드/키패드 키보드 N 0x0007 0x0011 0x0031 51
키보드/키패드 키보드 O 0x0007 0x0012 0x0018 25
키보드/키패드 키보드 P 0x0007 0x0013 0x0019 26
키보드/키패드 키보드 Q 0x0007 0x0014 0x0010 17
키보드/키패드 키보드 R 0x0007 0x0015 0x0013 20
키보드/키패드 키보드 S 0x0007 0x0016 0x001F 32
키보드/키패드 키보드 T 0x0007 0x0017 0x0014 21
키보드/키패드 키보드 U 0x0007 0x0018 0x0016 23
키보드/키패드 키보드 V 0x0007 0x0019 0x002F 49
키보드/키패드 키보드 W 0x0007 0x001A 0x0011 18
키보드/키패드 키보드 X 0x0007 0x001B 0x002D 47
키보드/키패드 키보드 Y 0x0007 0x001C 0x0015 22
키보드/키패드 키보드 Z 0x0007 0x001D 0x002C 46
키보드/키패드 키보드 1 및 뱅 0x0007 0x001E 0x0002 2
키보드/키패드 키보드 2 및 At 0x0007 0x001F 0x0003 3
키보드/키패드 키보드 3 및 해시 0x0007 0x0020 0x0004 4
키보드/키패드 키보드 4 및 달러 0x0007 0x0021 0x0005 5
키보드/키패드 키보드 5 및 백분율 0x0007 0x0022 0x0006 6
키보드/키패드 키보드 6 및 Caret 0x0007 0x0023 0x0007 7
키보드/키패드 키보드 7 및 앰퍼샌드 0x0007 0x0024 0x0008 8
키보드/키패드 키보드 8 및 별표 0x0007 0x0025 0x0009 9
키보드/키패드 키보드 9 및 왼쪽 대괄호 0x0007 0x0026 0x000A 10
키보드/키패드 키보드 0 및 오른쪽 대괄호 0x0007 0x0027 0x000B 11
키보드/키패드 키보드 리턴 엔터 0x0007 0x0028 0x001C 43
키보드/키패드 키보드 이스케이프 0x0007 0x0029 0x0001 110
키보드/키패드 키보드 삭제 0x0007 0x002A 0x000E 15
키보드/키패드 키보드 탭 0x0007 0x002B 0x000F 16
키보드/키패드 키보드 스페이스바 0x0007 0x002C 0x0039 61
키보드/키패드 키보드 대쉬 및 밑줄 0x0007 0x002D 0x000C 12
키보드/키패드 키보드 등가 및 더하기 0x0007 0x002E 0x000D 13
키보드/키패드 키보드 왼쪽 중괄호 0x0007 0x002F 0x001A 27
키보드/키패드 키보드 오른쪽 중괄호 0x0007 0x0030 0x001B 28
키보드/키패드 키보드 파이프 및 슬래시 0x0007 0x0031 0x002B 29
키보드/키패드 미국 이외의 키보드 0x0007 0x0032 0x002B 42
키보드/키패드 키보드 세미콜론 및 콜론 0x0007 0x0033 0x0027 40
키보드/키패드 키보드 아포스트로피 및 큰따옴표 0x0007 0x0034 0x0028 41
키보드/키패드 키보드 그레이브 악센트 및 물결표 0x0007 0x0035 0x0029 1
키보드/키패드 키보드 쉼표 0x0007 0x0036 0x0033 53
키보드/키패드 키보드 기간 0x0007 0x0037 0x0034 54
키보드/키패드 키보드 물음표 0x0007 0x0038 0x0035 55
키보드/키패드 키보드 대문자 잠금 0x0007 0x0039 0x003A 30
키보드/키패드 키보드 F1 0x0007 0x003A 0x003B 112
키보드/키패드 키보드 F2 0x0007 0x003B 0x003C 113
키보드/키패드 키보드 F3 0x0007 0x003C 0x003D 114
키보드/키패드 키보드 F4 0x0007 0x003D 0x003E 115
키보드/키패드 키보드 F5 0x0007 0x003E 0x003F 116
키보드/키패드 키보드 F6 0x0007 0x003F 0x0040 117
키보드/키패드 키보드 F7 0x0007 0x0040 0x0041 118
키보드/키패드 키보드 F8 0x0007 0x0041 0x0042 119
키보드/키패드 키보드 F9 0x0007 0x0042 0x0043 120
키보드/키패드 키보드 F10 0x0007 0x0043 0x0044 121
키보드/키패드 키보드 F11 0x0007 0x0044 0x0057 122
키보드/키패드 키보드 F12 0x0007 0x0045 0x0058 123
키보드/키패드 키보드 화면 캡처 0x0007 0x0046 0xE037
0x0054 *참고 1
124
키보드/키패드 키보드 스크롤 잠금 0x0007 0x0047 0x0046 125
키보드/키패드 키보드 일시 중지 0x0007 0x0048 0xE11D45
0xE046 *참고 2
0x0045 *참고 3
126
키보드/키패드 키보드 삽입 0x0007 0x0049 0xE052 75
키보드/키패드 키보드 홈 0x0007 0x004A 0xE047 80
키보드/키패드 키보드 페이지 위로 0x0007 0x004B 0xE049 85
키보드/키패드 앞으로 키보드 삭제 0x0007 0x004C 0xE053 76
키보드/키패드 키보드 끝 0x0007 0x004D 0xE04F 81
키보드/키패드 키보드 페이지다운 0x0007 0x004E 0xE051 86
키보드/키패드 키보드 오른쪽 화살표 0x0007 0x004F 0xE04D 89
키보드/키패드 키보드 왼쪽 화살표 0x0007 0x0050 0xE04B 79
키보드/키패드 키보드 아래쪽 화살표 0x0007 0x0051 0xE050 84
키보드/키패드 키보드 위쪽 화살표 키 0x0007 0x0052 0xE048 83
키보드/키패드 키패드 Num 잠금 및 지우기 0x0007 0x0053 0x0045
0xE045 *참고 3
90
키보드/키패드 키패드 슬래시 0x0007 0x0054 0xE035 95
키보드/키패드 키패드 별표 0x0007 0x0055 0x0037 100
키보드/키패드 키패드 대시 0x0007 0x0056 0x004A 105
키보드/키패드 키패드 플러스 0x0007 0x0057 0x004E 106
키보드/키패드 키패드 ENTER 0x0007 0x0058 0xE01C 108
키보드/키패드 키패드 1 및 끝 0x0007 0x0059 0x004F 93
키보드/키패드 키패드 2 및 아래쪽 화살표 0x0007 0x005A 0x0050 98
키보드/키패드 키패드 3 및 PageDn 0x0007 0x005B 0x0051 103
키보드/키패드 키패드 4 및 왼쪽 화살표 0x0007 0x005C 0x004B 92
키보드/키패드 키패드 5 0x0007 0x005D 0x004C 97
키보드/키패드 키패드 6 및 오른쪽 화살표 0x0007 0x005E 0x004D 102
키보드/키패드 키패드 7 및 홈 0x0007 0x005F 0x0047 91
키보드/키패드 키패드 8 및 위쪽 화살표 0x0007 0x0060 0x0048 96
키보드/키패드 키패드 9 및 PageUp 0x0007 0x0061 0x0049 101
키보드/키패드 키패드 0 및 삽입 0x0007 0x0062 0x0052 99
키보드/키패드 키패드 기간 0x0007 0x0063 0x0053 104
키보드/키패드 키보드 미국 이외의 슬래시 막대 0x0007 0x0064 0x0056 45
키보드/키패드 키보드 애플리케이션 0x0007 0x0065 0xE05D 129
키보드/키패드 키보드 전원 0x0007 0x0066 0xE05E
키보드/키패드 키패드 등가 0x0007 0x0067 0x0059
키보드/키패드 키보드 F13 0x0007 0x0068 0x0064
키보드/키패드 키보드 F14 0x0007 0x0069 0x0065
키보드/키패드 키보드 F15 0x0007 0x006A 0x0066
키보드/키패드 키보드 F16 0x0007 0x006B 0x0067
키보드/키패드 키보드 F17 0x0007 0x006C 0x0068
키보드/키패드 키보드 F18 0x0007 0x006D 0x0069
키보드/키패드 키보드 F19 0x0007 0x006E 0x006A
키보드/키패드 키보드 F20 0x0007 0x006F 0x006B
키보드/키패드 키보드 F21 0x0007 0x0070 0x006C
키보드/키패드 키보드 F22 0x0007 0x0071 0x006D
키보드/키패드 키보드 F23 0x0007 0x0072 0x006E
키보드/키패드 키보드 F24 0x0007 0x0073 0x0076
키보드/키패드 키패드 쉼표 0x0007 0x0085 0x007E 107 *참고 4
키보드/키패드 키보드 International1 0x0007 0x0087 0x0073 56 *참고 4, 5
키보드/키패드 키보드 International2 0x0007 0x0088 0x0070 133 *참고 5
키보드/키패드 키보드 국제3 0x0007 0x0089 0x007D 14 *참고 5
키보드/키패드 키보드 International4 0x0007 0x008A 0x0079 132 *참고 5
키보드/키패드 키보드 International5 0x0007 0x008B 0x007B 131 *참고 5
키보드/키패드 키보드 International6 0x0007 0x008C 0x005C
키보드/키패드 키보드 LANG1 0x0007 0x0090 0x0072 *참고 6
0x00F2 *참고 3, 6
키보드/키패드 키보드 LANG2 0x0007 0x0091 0x0071 *참고 6
0x00F1 *참고 3, 6
키보드/키패드 키보드 LANG3 0x0007 0x0092 0x0078
키보드/키패드 키보드 LANG4 0x0007 0x0093 0x0077
키보드/키패드 키보드 LANG5 0x0007 0x0094 0x0076
키보드/키패드 키보드 왼쪽 컨트롤 0x0007 0x00E0 0x001D 58
키보드/키패드 키보드 왼쪽 시프트 0x0007 0x00E1 0x002A 44
키보드/키패드 키보드 LeftAlt 0x0007 0x00E2 0x0038 60
키보드/키패드 키보드 왼쪽 GUI 0x0007 0x00E3 0xE05B 127
키보드/키패드 키보드 RightControl 0x0007 0x00E4 0xE01D 64
키보드/키패드 키보드 오른쪽 쉬프트 0x0007 0x00E5 0x0036 57
키보드/키패드 키보드 RightAlt 0x0007 0x00E6 0xE038 62
키보드/키패드 키보드 오른쪽 GUI 0x0007 0x00E7 0xE05C 128
소비자 다음 트랙으로 건너뛰기 0x000C 0x00B5 0xE019
소비자 이전 트랙 검사 0x000C 0x00B6 0xE010
소비자 멈춰 0x000C 0x00B7 0xE024
소비자 재생/일시 중지 0x000C 0x00CD 0xE022
소비자 음소거 0x000C 0x00E2 0xE020
소비자 볼륨 증가 0x000C 0x00E9 0xE030
소비자 볼륨 감소 0x000C 0x00EA 0xE02E
소비자 AL 소비자 제어 구성 0x000C 0x0183 0xE06D
소비자 AL 이메일 리더 0x000C 0x018A 0xE06C
소비자 AL 계산기 0x000C 0x0192 0xE021
소비자 AL 로컬 컴퓨터 브라우저 0x000C 0x0194 0xE06B
소비자 AC 검색 0x000C 0x0221 0xE065
소비자 AC 홈 0x000C 0x0223 0xE032
소비자 AC 뒤로 0x000C 0x0224 0xE06A
소비자 AC Forward 0x000C 0x0225 0xE069
소비자 AC 중지 0x000C 0x0226 0xE068
소비자 에어컨 새로 고침 0x000C 0x0227 0xE067
소비자 AC 책갈피 0x000C 0x022A 0xE066

노트:

  1. SysRq 키 스캔 코드는 Alt+프린트 스크린 키 입력에 내보내집니다.
  2. Break 키 스캔 코드는 Ctrl+Pause 키 입력에서 생성됩니다.
  3. 기존 키보드 메시지에 나와 있듯이
  4. 키는 브라질 키보드에 있습니다.
  5. 키는 일본어 키보드에 있습니다.
  6. 검사 코드는 키 릴리스 이벤트에서만 내보내집니다.

Extended-Key 플래그

확장 키 플래그는 키 입력 메시지가 고급 101/102 키 키보드의 추가 키 중 하나에서 시작되었는지 여부를 나타냅니다. 확장 키는 키보드의 오른쪽에 있는 ALT 키와 CTRL 키, 숫자 키패드 왼쪽에 있는 클러스터의 "INS", "DEL", "HOME", "END", "PAGE UP", "PAGE DOWN" 및 화살표 키, NUM LOCK 키, BREAK(Ctrl+PAUSE) 키, PRINT SCRN 키, 숫자 키패드의 나누기(/) 키 및 ENTER 키로 구성됩니다. 오른쪽 SHIFT 키는 확장 키로 간주되지 않으며 대신 별도의 검사 코드가 있습니다.

지정한 경우 검사 코드는 2바이트의 시퀀스로 구성됩니다. 여기서 첫 번째 바이트의 값은 0xE0.

컨텍스트 코드

컨텍스트 코드는 키 입력 메시지가 생성되었을 때 ALT 키가 다운되었는지 여부를 나타냅니다. ALT 키가 다운된 경우 코드는 1이고, 위쪽에 있으면 0입니다.

이전 Key-State 플래그

이전 키 상태 플래그는 키 입력 메시지를 생성한 키가 이전에 위쪽 또는 아래쪽인지 여부를 나타냅니다. 키가 이전에 다운된 경우 1이고 키가 이전에 위로 올라갔으면 0입니다. 이 플래그를 사용하여 키보드의 자동 반복 기능에서 생성된 키 입력 메시지를 식별할 수 있습니다. 이 플래그는 자동 반복 기능에서 생성된 WM_KEYDOWNWM_SYSKEYDOWN 키 입력 메시지에 대해 1로 설정됩니다. WM_KEYUPWM_SYSKEYUP 메시지의 경우 항상 1로 설정됩니다.

Transition-State 깃발

전환 상태 플래그는 키를 누르거나 키를 해제하여 키 입력 메시지를 생성했는지 여부를 나타냅니다. 이 플래그는 WM_KEYDOWNWM_SYSKEYDOWN 메시지에 대해 항상 0으로 설정됩니다. WM_KEYUPWM_SYSKEYUP 메시지에 대해 항상 1로 설정됩니다.

문자 메시지

키 입력 메시지는 키 입력에 대한 많은 정보를 제공하지만 문자 키 입력에 대한 문자 코드는 제공하지 않습니다. 문자 코드를 검색하려면 애플리케이션이 스레드 메시지 루프에 TranslateMessage 함수를 포함해야 합니다. TranslateMessage 키보드 레이아웃에 WM_KEYDOWN 또는 WM_SYSKEYDOWN 메시지를 전달합니다. 레이아웃은 메시지의 가상 키 코드를 검사하고 문자 키에 해당하는 경우 SHIFT 및 CAPS LOCK 키의 상태를 고려하여 해당하는 문자 코드를 제공합니다. 그런 다음 문자 코드를 포함하는 문자 메시지를 생성하고 메시지 큐의 맨 위에 메시지를 배치합니다. 메시지 루프의 다음 반복은 큐에서 문자 메시지를 제거하고 적절한 창 프로시저로 메시지를 디스패치합니다.

이 섹션에서는 다음 항목을 다룹니다.

비시스템 문자 메시지

창 프로시저는 WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHARWM_UNICHAR문자 메시지를 받을 수 있습니다. TranslateMessage 함수는 WM_KEYDOWN 메시지를 처리할 때 WM_CHAR 또는 WM_DEADCHAR 메시지를 생성합니다. 마찬가지로 WM_SYSKEYDOWN 메시지를 처리할 때 WM_SYSCHAR 또는 WM_SYSDEADCHAR 메시지를 생성합니다.

키보드 입력을 처리하는 애플리케이션은 일반적으로 WM_CHARWM_UNICHAR 메시지를 제외한 모든 메시지를 무시하고 다른 메시지를 DefWindowProc 함수에 전달합니다. WM_CHAR UTF-16(16비트 유니코드 변환 형식) 또는 ANSI 문자 집합을 사용하는 반면 WM_UNICHAR 항상 UTF-32(32비트 유니코드 변환 형식)를 사용합니다. 시스템은 WM_SYSCHARWM_SYSDEADCHAR 메시지를 사용하여 메뉴 니모닉을 구현합니다.

모든 문자 메시지의 wParam 매개 변수에는 누른 문자 키의 문자 코드가 포함됩니다. 문자 코드의 값은 메시지를 수신하는 창의 창 클래스에 따라 달라집니다. RegisterClass 함수의 유니코드 버전을 사용하여 창 클래스를 등록한 경우 시스템은 해당 클래스의 모든 창에 유니코드 문자를 제공합니다. 그렇지 않으면 시스템에서 ANSI 문자 코드를 제공합니다. 자세한 내용은 윈도우 클래스 등록Windows 앱에서 UTF-8 코드 페이지 사용을 참조하세요.

문자 메시지의 lParam 매개 변수의 내용은 문자 메시지를 생성하기 위해 번역된 키 다운 메시지의 lParam 매개 변수의 내용과 동일합니다. 자세한 내용은 키 입력 메시지 플래그참조하세요.

Dead-Character 메시지

영어가 아닌 일부 키보드에는 단독으로 문자를 생성할 것으로 예상되지 않는 문자 키가 포함되어 있습니다. 대신 그것은 후속 키 입력에 의해 생성된 문자에 발음 구별 기호를 추가하는 데 사용됩니다. 이러한 키들은 죽은 키라고 불립니다. 독일어 키보드의 circumflex 키는 데드 키의 예입니다. 외경이 있는 "o"로 구성된 문자를 입력하려면 독일 사용자가 circumflex 키와 "o" 키를 입력합니다. 키보드 포커스가 있는 창에는 다음과 같은 메시지 시퀀스가 표시됩니다.

  1. WM_KEYDOWN
  2. WM_DEADCHAR
  3. WM_KEYUP
  4. WM_KEYDOWN
  5. WM_CHAR
  6. WM_KEYUP

TranslateMessage 함수는 비 작동 키에서 WM_KEYDOWN 메시지를 처리할 때 WM_DEADCHAR 메시지를 생성합니다. WM_DEADCHAR 메시지의 wParam 매개변수에는 데드 키와 관련된 발음 부호의 문자 코드가 포함되어 있지만, 애플리케이션은 일반적으로 메시지를 무시합니다. 대신 후속 키 입력에서 생성된 WM_CHAR 메시지를 처리합니다. WM_CHAR 메시지의 wParam 매개 변수에는 발음 구별 문자 코드를 포함하고 있습니다. 후속 키 입력으로 발음 부호와 결합할 수 없는 기호가 생성되면, 시스템은 WM_CHAR 메시지 두 개를 생성합니다. 첫 번째 wParam 매개 변수에는 발음 부호의 문자 코드가 포함됩니다. 두 번째 wParam 매개 변수에는 후속 문자 키의 문자 코드가 포함됩니다.

TranslateMessage 함수는 시스템 데드 키(ALT 키와 함께 누른 데드 키)에서 WM_SYSKEYDOWN 메시지를 처리할 때 WM_SYSDEADCHAR 메시지를 생성합니다. 애플리케이션은 일반적으로 WM_SYSDEADCHAR 메시지를 무시합니다.

키 상태

키보드 메시지를 처리하는 동안 애플리케이션은 현재 메시지를 생성한 키 외에 다른 키의 상태를 확인해야 할 수 있습니다. 예를 들어 사용자가 SHIFT+END를 눌러 텍스트 블록을 선택할 수 있도록 하는 단어 처리 애플리케이션은 END 키에서 키 입력 메시지를 받을 때마다 SHIFT 키의 상태를 확인해야 합니다. 애플리케이션은 GetKeyState 함수를 사용하여 현재 메시지가 생성될 때 가상 키의 상태를 확인할 수 있습니다. GetAsyncKeyState 함수를 사용하여 가상 키의 현재 상태를 검색할 수 있습니다.

키보드 레이아웃은 이름 목록을 유지 관리합니다. 단일 문자를 생성하는 키의 이름은 키에서 생성된 문자와 동일합니다. TAB 및 Enter와 같은 문자가 아닌 키의 이름은 문자열로 저장됩니다. 애플리케이션은 GetKeyNameText 함수를 호출하여 디바이스 드라이버에서 키의 이름을 검색할 수 있습니다.

키 입력 및 문자 번역

시스템에는 다양한 키 입력 메시지에서 제공하는 스캔 코드, 문자 코드 및 가상 키 코드를 번역하는 몇 가지 특수 용도 함수가 포함되어 있습니다. 이러한 함수에는 MapVirtualKey, ToAscii, ToUnicodeVkKeyScan포함됩니다.

또한 Microsoft Rich Edit 3.0은 사용자가 핫 키를 사용하여 16진수 문자와 유니코드 문자 간에 변환할 수 있는 HexToUnicode IME지원합니다. 즉, Microsoft Rich Edit 3.0이 애플리케이션에 통합되면 애플리케이션은 HexToUnicode IME의 기능을 상속합니다.

Hot-Key 지원

핫 키WM_HOTKEY 메시지를 생성하는 키 조합으로, 시스템에서 스레드 메시지 큐의 맨 위에 배치하여 큐의 기존 메시지를 무시합니다. 애플리케이션은 핫 키를 사용하여 사용자로부터 우선 순위가 높은 키보드 입력을 얻습니다. 예를 들어 Ctrl+C 키 조합으로 구성된 핫 키를 정의하면 애플리케이션에서 사용자가 긴 작업을 취소할 수 있습니다.

핫 키를 정의하기 위해 애플리케이션은 RegisterHotKey 함수를 호출하여 WM_HOTKEY 메시지를 생성하는 키의 조합, 메시지를 받을 창에 대한 핸들 및 핫 키의 식별자를 지정합니다. 사용자가 핫 키를 누르면 WM_HOTKEY 메시지가 창을 만든 스레드의 메시지 큐에 배치됩니다. 메시지의 wParam 매개 변수에는 핫 키의 식별자가 포함됩니다. 애플리케이션은 스레드에 대해 여러 핫 키를 정의할 수 있지만 스레드의 각 핫 키에는 고유 식별자가 있어야 합니다. 애플리케이션이 종료되기 전에 UnregisterHotKey 함수를 사용하여 핫 키를 삭제해야 합니다.

애플리케이션은 핫 키 컨트롤을 사용하여 사용자가 핫 키를 쉽게 선택할 수 있도록 할 수 있습니다. 핫 키 컨트롤은 일반적으로 창을 활성화하는 핫 키를 정의하는 데 사용되며, RegisterHotKeyUnregisterHotKey 함수를 사용하지 않습니다. 대신 핫 키 컨트롤을 사용하는 애플리케이션은 일반적으로 WM_SETHOTKEY 메시지를 전송하여 핫 키를 설정합니다. 사용자가 핫 키를 누를 때마다 시스템은 SC_HOTKEY 지정하는 WM_SYSCOMMAND 메시지를 보냅니다. 핫 키 컨트롤에 대한 자세한 내용은 핫 키 컨트롤"핫 키 컨트롤 사용"을 참조하세요.

검색 및 기타 함수를 위한 키보드 키

Windows는 브라우저 함수, 미디어 함수, 애플리케이션 시작 및 전원 관리를 위한 특수 키를 사용하여 키보드를 지원합니다. WM_APPCOMMAND 추가 키보드 키를 지원합니다. 또한 ShellProc 함수는 추가 키보드 키를 지원하도록 수정됩니다.

구성 요소 애플리케이션의 자식 창이 이러한 추가 키보드 키에 대한 명령을 직접 구현할 수 없을 것입니다. 따라서 이러한 키 중 하나를 누르면 DefWindowProc 창에 WM_APPCOMMAND 메시지를 보냅니다. DefWindowProcWM_APPCOMMAND 메시지를 부모 창에도 버블할 것입니다. 이는 오른쪽 마우스 단추를 사용하여 상황에 맞는 메뉴를 호출하는 방식과 유사합니다. 즉, DefWindowProc 오른쪽 단추 클릭 시 WM_CONTEXTMENU 메시지를 보내고 부모에 거품을 내립니다. 또한 DefWindowProc 최상위 창에 대한 WM_APPCOMMAND 메시지를 수신하는 경우 코드 HSHELL_APPCOMMAND있는 셸 후크를 호출합니다.

Windows는 5개의 단추가 있는 마우스인 Microsoft IntelliMouse 탐색기도 지원합니다. 두 개의 추가 단추는 앞으로 및 뒤로 브라우저 탐색을 지원합니다. 자세한 내용은 XBUTTONs를 참조하세요.

입력 시뮬레이션

중단 없는 일련의 사용자 입력 이벤트를 시뮬레이션하려면 SendInput 함수를 사용합니다. 이 함수는 세 개의 매개 변수를 허용합니다. 첫 번째 매개 변수인 cInputs시뮬레이션될 입력 이벤트 수를 나타냅니다. 두 번째 매개 변수인 rgInputs각각 입력 이벤트 유형과 해당 이벤트에 대한 추가 정보를 설명하는 INPUT 구조의 배열입니다. cbSize 마지막 매개 변수는 INPUT 구조체의 크기를 바이트 단위로 허용합니다.

SendInput 함수는 일련의 시뮬레이션된 입력 이벤트를 디바이스의 입력 스트림에 삽입하여 작동합니다. 이 효과는 keybd_event 또는 mouse_event 함수를 반복적으로 호출하는 것과 유사합니다. 단, 시스템에서 시뮬레이션된 이벤트와 다른 입력 이벤트가 섞이지 않도록 합니다. 호출이 완료되면 반환 값은 성공적으로 재생된 입력 이벤트 수를 나타냅니다. 이 값이 0이면 입력이 차단되었습니다.

SendInput 함수는 키보드의 현재 상태를 다시 설정하지 않습니다. 따라서 사용자가 이 함수를 호출할 때 키를 누른 경우 이 함수가 생성하는 이벤트를 방해할 수 있습니다. 간섭이 발생할 수 있는 경우 GetAsyncKeyState 함수를 사용하여 키보드의 상태를 확인하고 필요에 따라 수정합니다.

언어, 로캘 및 키보드 레이아웃

언어 영어, 프랑스어 및 일본어와 같은 자연어입니다. 하위 언어 영국과 미국에서 사용되는 영어 하위 언어와 같은 특정 지리적 지역에서 사용되는 자연어의 변형입니다. 애플리케이션은 언어 식별자라는 값을 사용하여 언어 및 하위 언어를 고유하게 식별합니다.

애플리케이션은 일반적으로 로캘 사용하여 입력 및 출력이 처리되는 언어를 설정합니다. 예를 들어 키보드의 로캘을 설정하면 키보드에서 생성된 문자 값에 영향을 줍니다. 표시 또는 프린터에 대한 로캘을 설정하면 표시되거나 인쇄된 문자 모양에 영향을 줍니다. 애플리케이션은 키보드 레이아웃을 로드하고 사용하여 키보드의 로캘을 설정합니다. 지정된 로캘을 지원하는 글꼴을 선택하여 표시 또는 프린터에 대한 로캘을 설정합니다.

키보드 레이아웃은 키보드에서 키의 물리적 위치를 지정할 뿐만 아니라 해당 키를 눌러 생성된 문자 값을 결정합니다. 각 레이아웃은 현재 입력 언어를 식별하고 키와 키 조합에 의해 생성되는 문자 값을 결정합니다.

모든 키보드 레이아웃에는 레이아웃 및 언어를 식별하는 해당 핸들이 있습니다. 핸들의 낮은 워드는 언어 식별자입니다. 상위 단어는 물리적 레이아웃을 지정하는 디바이스 핸들이거나 기본 물리적 레이아웃을 나타내는 0입니다. 사용자는 모든 입력 언어를 실제 레이아웃과 연결할 수 있습니다. 예를 들어 프랑스어로 자주 사용하는 영어를 구사하는 사용자는 키보드의 실제 레이아웃을 변경하지 않고 키보드의 입력 언어를 프랑스어로 설정할 수 있습니다. 즉, 익숙한 영어 레이아웃을 사용하여 프랑스어로 텍스트를 입력할 수 있습니다.

애플리케이션은 일반적으로 입력 언어를 직접 조작할 것으로 예상되지 않습니다. 대신 사용자는 언어와 레이아웃 조합을 설정한 다음, 그 중에서 전환합니다. 사용자가 다른 언어로 표시된 텍스트를 클릭하면 애플리케이션은 ActivateKeyboardLayout 함수를 호출하여 해당 언어에 대한 사용자의 기본 레이아웃을 활성화합니다. 사용자가 현재 목록에 없는 언어로 텍스트를 편집하는 경우 애플리케이션은 언어를 사용하여 LoadKeyboardLayout 함수를 호출하여 해당 언어를 기반으로 레이아웃을 가져올 수 있습니다.

ActivateKeyboardLayout 함수는 현재 작업에 대한 입력 언어를 설정합니다. hkl 매개 변수는 키보드 레이아웃에 대한 핸들 또는 0 확장 언어 식별자일 수 있습니다. 키보드 레이아웃 핸들은 LoadKeyboardLayout 또는 GetKeyboardLayoutList 함수에서 가져올 수 있습니다. HKL_NEXTHKL_PREV 값을 사용하여 다음 또는 이전 키보드를 선택할 수도 있습니다.

GetKeyboardLayoutName 함수는 호출 스레드에 대한 활성 키보드 레이아웃의 이름을 검색합니다. 애플리케이션이 LoadKeyboardLayout 함수를 사용하여 활성 레이아웃을 만드는 경우 GetKeyboardLayoutName 레이아웃을 만드는 데 사용되는 동일한 문자열을 검색합니다. 그렇지 않으면 문자열은 활성 레이아웃의 로캘에 해당하는 기본 언어 식별자입니다. 즉, 함수가 동일한 기본 언어를 사용하는 여러 레이아웃을 구분할 필요는 없으므로 입력 언어에 대한 특정 정보를 반환할 수 없습니다. 그러나 GetKeyboardLayout 함수를 사용하여 입력 언어를 확인할 수 있습니다.

LoadKeyboardLayout 함수는 키보드 레이아웃을 로드하고 레이아웃을 사용자가 사용할 수 있도록 합니다. 애플리케이션은 KLF_ACTIVATE 값을 사용하여 현재 스레드에 대해 레이아웃을 즉시 활성화할 수 있습니다. 애플리케이션은 KLF_REORDER 값을 사용하여 KLF_ACTIVATE 값을 지정하지 않고 레이아웃의 순서를 변경할 수 있습니다. 애플리케이션은 키보드 레이아웃을 로드할 때 항상 KLF_SUBSTITUTE_OK 값을 사용하여 사용자의 기본 설정(있는 경우)을 선택해야 합니다.

다국어 지원을 위해 LoadKeyboardLayout 함수는 KLF_REPLACELANGKLF_NOTELLSHELL 플래그를 제공합니다. KLF_REPLACELANG 플래그는 언어를 변경하지 않고 기존 키보드 레이아웃을 바꾸도록 함수에 지시합니다. 동일한 언어 식별자를 사용하지만 KLF_REPLACELANG 지정하지 않고 기존 레이아웃을 바꾸려고 시도하는 것은 오류입니다. KLF_NOTELLSHELL 플래그는 키보드 레이아웃이 추가되거나 교체될 때 함수가 셸에 알리지 못하게 합니다. 연속된 일련의 호출에서 여러 레이아웃을 추가하는 애플리케이션에 유용합니다. 이 플래그는 마지막 호출을 제외한 모든 항목에서 사용해야 합니다.

UnloadKeyboardLayout 함수는 시스템 기본 입력 언어를 언로드할 수 없으므로 제한됩니다. 이렇게 하면 사용자는 항상 셸 및 파일 시스템에서 사용하는 것과 동일한 문자 집합을 사용하여 입력 텍스트에 사용할 수 있는 레이아웃이 하나 있습니다.