HOWTO · C++
C++를 사용하여 Windows에서 키 누르기 감지
이 문서는 C++를 사용하여 Windows 애플리케이션에서 키 누르기를 처리하는 간단한 가이드 역할을 합니다.
이 페이지의 내용
이 간략한 가이드에서는 C++를 사용하여 Windows 애플리케이션에서 키 누르기를 처리하는 방법에 대해 설명합니다. 계속 진행하기 전에 C++를 사용하는 Windows 응용 프로그램에 대한 간략한 소개를 살펴보겠습니다.
C++를 사용하는 Windows 응용 프로그램의 유형
C++에서 개발할 수 있는 두 가지 유형의 애플리케이션이 있습니다.
-
콘솔 기반 애플리케이션
콘솔 응용 프로그램은 명령줄에서만 실행되고 텍스트만 표시할 수 있는 응용 프로그램입니다. 따라서 이를 명령줄 응용 프로그램이라고도 합니다.
-
윈도우 기반 애플리케이션
반면에 창 기반 응용 프로그램은 원래의 기본 Windows C API를 사용하여 개발된 응용 프로그램이며 콘솔 기반 응용 프로그램과 달리 창 응용 프로그램으로 표시됩니다. 이러한 응용 프로그램은 창 형식으로 소프트웨어를 만드는 데 사용되며 텍스트, 이미지 및 그 안의 모든 것을 표시할 수 있습니다.
Windows 응용 프로그램을 개발하는 방법에는 여러 가지가 있습니다. Win32 API를 직접 사용하고 Windows 이벤트를 수신하는 C 스타일 루프를 만들 수 있습니다. 마찬가지로 개체 지향 스타일인 MFC(Microsoft Foundation Classes)를 사용하여 Windows 응용 프로그램을 만들고 Win32 API를 래핑할 수도 있습니다.
개발자는 창에서 실행되는 Win32 프로그램을 만들 때 Windows 프로시저 함수 내에서 Windows 메시지를 특별히 처리해야 합니다. Win32 응용 프로그램은 32비트(x86) 또는 64비트(x64) 바이너리로 빌드할 수 있습니다.
또한 Windows 응용 프로그램을 만들 때 키보드 이벤트에 신경을 써야 합니다.
C++를 사용하는 Windows 응용 프로그램의 키보드 입력
키보드는 다음과 같은 다양한 용도로 사용됩니다.
- 문자 입력: 사용자가 문서 또는 편집 상자에 입력하는 텍스트입니다.
- 키보드 단축키: CTRL+O를 사용하여 파일을 여는 것은 응용 프로그램 기능을 호출하는 키 입력의 예입니다.
- 운영 체제의 명령: ALT+TAB를 사용하여 창을 전환하는 것은 시스템 기능을 호출하는 키 입력의 예입니다.
키보드 입력을 처리할 때 키 누르기의 모든 경우를 처리해야 합니다. 예를 들어 B 키를 누르면 다음 시나리오가 있을 수 있습니다.
Bb
또한 Ctrl 키를 누른 상태에서 B 키를 누르면 키보드 단축키 Ctrl+B가 됩니다. 텍스트를 굵게 만드는 명령입니다.
키 코드
운영 체제는 키를 누르면 키에 대한 스캔 코드를 생성합니다. 이러한 스캔 코드는 키보드마다 다릅니다.
이 코드는 모든 키보드 키에 대해 고유합니다. 예를 들어 key-left와 key-right는 서로 다른 스캔 코드를 가집니다. 이러한 코드는 영숫자이고 기억하기 어렵기 때문에 키보드 장치 드라이버는 이러한 스캔 코드를 장치 독립적인 가상 키 코드로 변환합니다.
라이브러리 파일 WinUser.h는 문자 A-Z 및 숫자 0-9를 제외한 모든 가상 키 코드에 대한 상수를 정의합니다. 해당 가상 코드는 ASCII 등가물에 매핑됩니다.
- 숫자 0-9: 0x30에서 0x39까지의 코드 범위
- 알파벳 A-Z: 0x41에서 0x5A까지의 코드 범위
다른 모든 키의 경우 해당 키의 스캔 코드에 매핑되는 상수가 정의되어 있습니다. 예를 들어 왼쪽 화살표 키의 경우 가상 코드는 VK_LEFT입니다. 위에서 설명한 것처럼 해당 ASCII 값을 가진 문자에 대해 가상 코드가 정의되지 않습니다.
예를 들어 VK_B와 같은 문자 B에 대한 가상 코드가 없습니다. 일반적으로 사용되는 가상 코드 중 일부를 보여주는 목록은 다음과 같습니다.
| 가상 코드 | 스캔 코드 | 설명 |
|---|---|---|
VK_LBUTTON |
0x01 | 마우스 왼쪽 버튼 |
VK_RBUTTON |
0x02 | 마우스 오른쪽 버튼 |
VK_CANCEL |
0x03 | 제어 중단 처리 |
VK_MBUTTON |
0x04 | 가운데 마우스 버튼(3버튼 마우스) |
VK_XBUTTON1 |
0x05 | X1 마우스 버튼 |
VK_XBUTTON2 |
0x06 | X2 마우스 버튼 |
VK_BACK |
0x08 | 백스페이스 키 |
VK_TAB |
0x09 | 탭 키 |
VK_SHIFT |
0x10 | SHIFT 키 |
VK_CONTROL |
0x11 | CTRL 키 |
VK_MENU |
0x12 | Alt 키 |
VK_PAUSE |
0x13 | 일시정지 키 |
VK_CAPITAL |
0x14 | 캡스락 키 |
VK_NUMPAD0에서 VK_NUMPAD9로 |
0x60 - 0x69 | 숫자 키패드 0-9 키 |
VK_F1에서 VK_F12로 |
0x70 - 0x7B | 기능 키 F1 ~ F12 |
VK_NUMLOCK |
0x90 | NUM LOCK 키 |
VK_SCROLL |
0x91 | 스크롤 잠금 키 |
VK_LSHIFT |
0xA0 | 왼쪽 SHIFT 키 |
VK_RSHIFT |
0xA1 | 오른쪽 SHIFT 키 |
VK_LCONTROL |
0xA2 | 왼쪽 CONTROL 키 |
VK_RCONTROL |
0xA3 | 오른쪽 CONTROL 키 |
VK_LMENU |
0xA4 | 왼쪽 MENU 키 |
VK_RMENU |
0xA5 | 오른쪽 MENU 키 |
이 링크에서 찾을 수 있는 다른 많은 코드가 있습니다.
C++를 사용하여 Windows에서 키 누르기 감지
키보드에서 키를 누를 때마다 이벤트가 발생합니다. 키를 누를 때마다 메시지가 생성되며 이러한 메시지는 이벤트 기반입니다.
GetKeyState() 함수를 사용하여 누른 키의 상태를 얻을 수 있습니다. 이 함수는 가상 키 코드를 인수로 사용하고 해당 키가 눌렸는지 여부를 알려주는 플래그를 반환합니다.
GetKeyState() 메서드는 가상 키보드의 상태를 반환하므로 흥미롭습니다. 이 가상 상태는 메시지가 큐에서 제거되고 메시지 큐 내용을 기반으로 하므로 변경됩니다.
‘GetKeyState’는 프로그램이 창 메시지를 처리할 때 각 메시지가 대기열에 있을 때 키보드의 스냅샷을 제공합니다. GetKeyState는 사용자가 마우스 버튼을 누를 때 키보드 상태를 보고합니다. 예를 들어 대기열의 마지막 메시지가 WM _BUTTONDOWN인 경우입니다.
통사론:
if (GetKeyState(VK_SHIFT) & 0x8000) {
// Shift down
}
비트 플래그 0x8000은 키가 현재 눌려 있는지 여부를 결정합니다.