HOWTO · C++

C++를 사용하여 Windows에서 키 누르기 감지

이 문서는 C++를 사용하여 Windows 애플리케이션에서 키 누르기를 처리하는 간단한 가이드 역할을 합니다.

이 페이지의 내용

이 간략한 가이드에서는 C++를 사용하여 Windows 애플리케이션에서 키 누르기를 처리하는 방법에 대해 설명합니다. 계속 진행하기 전에 C++를 사용하는 Windows 응용 프로그램에 대한 간략한 소개를 살펴보겠습니다.

C++를 사용하는 Windows 응용 프로그램의 유형

C++에서 개발할 수 있는 두 가지 유형의 애플리케이션이 있습니다.

  1. 콘솔 기반 애플리케이션

    콘솔 응용 프로그램은 명령줄에서만 실행되고 텍스트만 표시할 수 있는 응용 프로그램입니다. 따라서 이를 명령줄 응용 프로그램이라고도 합니다.

  2. 윈도우 기반 애플리케이션

    반면에 창 기반 응용 프로그램은 원래의 기본 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 응용 프로그램의 키보드 입력

키보드는 다음과 같은 다양한 용도로 사용됩니다.

  1. 문자 입력: 사용자가 문서 또는 편집 상자에 입력하는 텍스트입니다.
  2. 키보드 단축키: CTRL+O를 사용하여 파일을 여는 것은 응용 프로그램 기능을 호출하는 키 입력의 예입니다.
  3. 운영 체제의 명령: ALT+TAB를 사용하여 창을 전환하는 것은 시스템 기능을 호출하는 키 입력의 예입니다.

키보드 입력을 처리할 때 키 누르기의 모든 경우를 처리해야 합니다. 예를 들어 B 키를 누르면 다음 시나리오가 있을 수 있습니다.

  • B
  • b

또한 Ctrl 키를 누른 상태에서 B 키를 누르면 키보드 단축키 Ctrl+B가 됩니다. 텍스트를 굵게 만드는 명령입니다.

키 코드

운영 체제는 키를 누르면 키에 대한 스캔 코드를 생성합니다. 이러한 스캔 코드는 키보드마다 다릅니다.

이 코드는 모든 키보드 키에 대해 고유합니다. 예를 들어 key-leftkey-right는 서로 다른 스캔 코드를 가집니다. 이러한 코드는 영숫자이고 기억하기 어렵기 때문에 키보드 장치 드라이버는 이러한 스캔 코드를 장치 독립적인 가상 키 코드로 변환합니다.

라이브러리 파일 WinUser.h는 문자 A-Z 및 숫자 0-9를 제외한 모든 가상 키 코드에 대한 상수를 정의합니다. 해당 가상 코드는 ASCII 등가물에 매핑됩니다.

  1. 숫자 0-9: 0x30에서 0x39까지의 코드 범위
  2. 알파벳 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은 키가 현재 눌려 있는지 여부를 결정합니다.