원시 입력 개요
기존 키보드와 마우스 외에도 많은 사용자 입력 디바이스가 있습니다. 예를 들어 사용자 입력은 조이스틱, 터치 스크린, 마이크 또는 사용자 입력의 유연성이 뛰어난 기타 장치를 통해 이루어질 수 있습니다. 이러한 디바이스를 HID(휴먼 인터페이스 디바이스)라고 합니다. 원시 입력 API는 애플리케이션이 키보드와 마우스를 포함한 모든 HID의 원시 입력을 수락할 수 있는 안정적이고 강력한 방법을 제공합니다.
이 섹션에서는 다음 항목을 다룹니다.
원시 입력 모델
이전에는 일반적으로 키보드와 마우스를 사용해 데이터를 입력했습니다. 시스템은 이러한 디바이스에서 들어오는 데이터를 원시 정보의 디바이스별 세부 정보를 제거하는 방식으로 해석했습니다. 예를 들어 키보드는 디바이스별 스캔 코드를 생성하지만 시스템은 애플리케이션에 가상 키 코드를 제공합니다. 원시 입력의 세부 정보를 숨기는 것 외에도 창 관리자는 모든 새 HID를 지원하지 않았습니다. 지원되지 않는 HID에서 입력을 얻으려면 애플리케이션에서 디바이스를 열고, 공유 모드를 관리하거나, 디바이스를 주기적으로 읽거나, I/O 완료 포트를 설정하는 등 많은 작업을 수행해야 했습니다. 원시 입력 모델 및 관련 API는 키보드와 마우스를 포함한 모든 입력 디바이스에서 원시 입력에 간단하게 액세스할 수 있도록 개발되었습니다.
원시 입력 모델은 키보드와 마우스를 위한 원래 Windows 입력 모델과 다릅니다. 원래 입력 모델에서 애플리케이션은 WM_CHAR, WM_MOUSEMOVE 및 WM_APPCOMMAND 같은 창에 전송되거나 게시되는 메시지 형식으로 디바이스 독립적 입력을 수신합니다. 반면 원시 입력의 경우 애플리케이션은 데이터를 가져올 디바이스를 등록해야 합니다. 또한 애플리케이션은 WM_INPUT 메시지를 통해 원시 입력을 가져옵니다.
원시 입력 모델에는 다음과 같은 여러 가지 이점이 있습니다.
- 애플리케이션은 입력 디바이스를 검색하거나 열 필요가 없습니다.
- 애플리케이션은 디바이스에서 직접 데이터를 가져오고 필요에 따라 데이터를 처리합니다.
- 애플리케이션은 동일한 유형의 디바이스가 보낸 입력을 수신하는 경우에도 입력 출처를 구분할 수 있습니다. 예를 들어 두 개의 마우스 디바이스가 있습니다.
- 애플리케이션은 디바이스 컬렉션 또는 특정 디바이스 유형에서 온 데이터를 특정하여 데이터 트래픽을 관리합니다.
- HID 디바이스는 새 메시지 유형 또는 업데이트된 OS가 WM_APPCOMMAND에서 새 명령을 사용할 때까지 기다리지 않고 출시되는 즉시 사용할 수 있습니다.
WM_APPCOMMAND가 일부 HID 디바이스에 대해 제공합니다. 그러나 WM_APPCOMMAND는 더 높은 수준의 디바이스 독립적 입력 이벤트이지만 WM_INPUT은 디바이스와 관련된 원시 하위 수준 데이터를 보냅니다.
원시 입력 등록
기본적으로 원시 입력을 수신하는 애플리케이션은 없습니다. 디바이스에서 원시 입력을 수신하려면 애플리케이션이 디바이스를 등록해야 합니다.
디바이스를 등록하기 위해 애플리케이션은 먼저 원하는 디바이스에 대한 최상위 컬렉션(TLC)을 지정하는 RAWINPUTDEVICE 구조체의 배열을 만듭니다. TLC는 사용 페이지(디바이스의 클래스) 및 사용 ID(클래스 내의 디바이스)로 정의됩니다. 예를 들어 키보드 TLC를 얻으려면 UsagePage = 0x01 및 UsageID = 0x06을 설정합니다. 애플리케이션은 RegisterRawInputDevices를 호출하여 디바이스를 등록합니다.
애플리케이션은 현재 시스템에 연결되지 않은 디바이스를 등록할 수 있습니다. 이 디바이스가 연결되면 Windows 관리자가 원시 입력을 애플리케이션에 자동으로 전송합니다. 시스템에서 원시 입력 디바이스의 목록을 가져오기 위해 애플리케이션은 GetRawInputDeviceList를 호출합니다. 애플리케이션은 이 호출의 hDevice를 사용하여 GetRawInputDeviceInfo를 호출하여 디바이스 정보를 가져옵니다.
RAWINPUTDEVICE의 dwFlags 멤버를 통해 애플리케이션은 수신 대기할 디바이스와 무시할 디바이스를 선택할 수 있습니다. 예를 들어 애플리케이션은 응답기를 제외한 모든 전화 통신 디바이스의 입력을 요청할 수 있습니다. 샘플 코드는 원시 입력 등록을 참조하세요.
마우스와 키보드도 HID이므로 이러한 디바이스가 보낸 데이터는 HID 메시지 WM_INPUT 및 기존 메시지를 통해 들어올 수 있습니다. 애플리케이션은 RAWINPUTDEVICE에서 적절한 플래그를 선택하여 두 방법 중 하나를 선택할 수 있습니다.
애플리케이션의 등록 상태를 가져오려면 언제든지 GetRegisteredRawInputDevices를 호출합니다.
원시 입력 읽기
애플리케이션은 TLC(최상위 컬렉션)가 등록의 TLC와 일치하는 모든 HID에서 원시 입력을 받습니다. 애플리케이션이 원시 입력을 받으면 해당 메시지 큐는 WM_INPUT 메시지를 가져오고 큐 상태 플래그 QS_RAWINPUT이 설정됩니다(QS_INPUT에 이 플래그도 포함됨). 애플리케이션은 포그라운드에 있을 때와 백그라운드에 있을 때 데이터를 수신할 수 있습니다.
원시 데이터를 읽는 방법에는 버퍼링되지 않은(또는 표준) 메서드와 버퍼링된 메서드의 두 가지가 있습니다. 버퍼링되지 않은 메서드는 원시 데이터를 한 번에 하나의 RAWINPUT 구조체로 가져오며 많은 HID에 적합합니다. 여기서 애플리케이션은 GetMessage를 호출하여 WM_INPUT 메시지를 가져옵니다. 그런 다음 애플리케이션은 WM_INPUT에 포함된 RAWINPUT 핸들을 사용하여 GetRawInputData를 호출합니다. 예를 들어 원시 입력의 표준 읽기 작업을 참조하세요.
반면 버퍼링된 메서드는 한 번에 RAWINPUT 구조체의 배열을 가져옵니다. 대량의 원시 입력을 생성할 수 있는 디바이스에 대해 제공됩니다. 이 메서드에서 애플리케이션은 GetRawInputBuffer를 호출하여 RAWINPUT 구조체의 배열을 가져옵니다. NEXTRAWINPUTBLOCK 매크로는 RAWINPUT 구조체의 배열을 트래버스하기 위해 사용됩니다. 예제는 원시 입력의 버퍼링된 읽기 수행을 참조하세요.
원시 입력을 해석하려면 HID에 대한 자세한 정보가 필요합니다. 애플리케이션은 디바이스 핸들을 사용하여 GetRawInputDeviceInfo를 호출하여 디바이스 정보를 가져옵니다. 이 핸들은 WM_INPUT 또는 RAWINPUTHEADER의 hDevice 멤버에서 올 수 있습니다.