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

Muhammad Husnain 2024년2월16일
  1. C++를 사용하는 Windows 응용 프로그램의 유형
  2. C++를 사용하는 Windows 응용 프로그램의 키보드 입력
  3. 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은 키가 현재 눌려 있는지 여부를 결정합니다.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn