GameInput 장치
시스템에 연결된 모든 물리적 입력 장치는 IGameInputDevice 인터페이스로 표시됩니다. 읽기와 마찬가지로 장치 인스턴스는 참조 수가 계산되는 싱글톤입니다. 즉 인터페이스 포인터가 같은지 비교할 수 있습니다. 일반적인 애플리케이션의 입력 코드는 대부분 이러한 방식으로만 장치 인스턴스를 사용합니다. 다른 API를 호출할 때 장치 식별자(예: 읽기를 검색할 때의 필터)로 사용하는 것입니다.
IGameInputDevice 인터페이스 메서드는 일반적으로 응용 프로그램에서 특정 장치와 어떤 식으로든 직접 상호 작용해야 하는 경우에만 호출됩니다. 가장 일반적인 이유는 촉각 또는 힘 피드백 명령을 장치에 보내는 것입니다. 그러나 이 인터페이스는 장치 속성도 노출시키고 보다 고급 코드가 필요할 수 있는 하위 수준 장치 I/O에 액세스할 수 있도록 합니다.
장치 속성
장치에 대한 특정 세부 정보를 알아야 하는 응용 프로그램은 장치의 GameInputDeviceInfo 구조에 액세스할 수 있습니다. 이 구조에는 장치에 대한 풍부한 정보가 포함되어 있지만 이를 사용할 때 이해해야 하는 몇 가지가 있습니다.
디바이스 정보가 클 수 있으며 경우에 따라 10KB 이상일 수 있습니다. 효율성 때문에 GameInput API는 장치 데이터의 사본을 만들지 않고 일시적으로 GameInput 내에 저장된 데이터에 대한 직접 액세스 권한을 애플리케이션에 부여합니다. 이 접근 방식은 버퍼 할당과 많은 양의 메모리 전송을 피함으로써 성능이 높은 코드를 만듭니다. 애플리케이션이 종종 데이터의 일부에만 관심이 있기 때문입니다. 또한 이 기능을 사용하면 다양한 크기의 출력과 전체 복사로 인한 복잡함을 추가하지 않아도 GameInputDeviceInfo 구조 안에 다양한 지원 정보 배열을 찾을 수 있는 장치 정보 데이터 블록 내의 다른 지역에 대한 중첩된 포인터를 포함할 수도 있습니다.
장치 ID
장치 정보에서 사용할 수 있는 중요한 정보 중 하나는 장치의 애플리케이션-로컬 장치 ID입니다. 이는 시스템의 애플리케이션 재시작 사이나 시스템 재부팅 사이에서도 고유하게 장치를 식별하는 특별한 32바이트 값입니다. 이 ID는 무선 장치나 유선 USB 장치 연결의 연결 끊김이나 다시 연결에서도 안정적입니다. 다시 같은 USB 포트에 연결하기만 하면 됩니다.
앱-로컬 장치 ID는 애플리케이션 수명을 초과한 특정 장치를 식별하는 데 가장 일반적으로 사용됩니다. 예를 들어 입력 매핑 UI가 있는 게임은 장치 ID를 사용하여 앱이 시작될 때마다 사용자의 입력 구성이 동일한 장치에 적용되도록 합니다. 이는 그렇지 않으면 동일하게 보일 수 있는 여러 장치(예: 비행 시뮬레이터를 위한 계기판)에 걸쳐 복잡한 매핑을 지원하는 애플리케이션에 특히 중요합니다.
장치 열거형
대부분의 애플리케이션은 필요하지 않겠지만 GameInput은 연결된 장치의 명시적인 열거형을 지원합니다. 이는 IGameInput 인터페이스의 RegisterDeviceCallback 메서드를 통해 수행할 수 있습니다.
HRESULT RegisterDeviceCallback(
_In_opt_ IGameInputDevice * device,
_In_ GameInputKind inputKind,
_In_ GameInputDeviceStatus statusFilter,
_In_ GameInputEnumerationKind enumerationKind,
_In_opt_ void * context,
_In_ GameInputDeviceCallback callbackFunc,
_Out_opt_ _Result_zeroonfailure_ GameInputCallbackToken * callbackToken);
이 메서드는 먼저 모든 연결된 장치에 대한 일련의 초기 콜백을 트리거한 다음 새 장치가 연결되거나 연결이 끊길 때마다 후속 콜백을 트리거하여 장치 열거형과 장치 연결/연결 해제 알림을 모두 처리합니다. 응용 프로그램에서는 GameInputEnumerationKind 매개 변수를 사용하여 모든 초기 콜백이 전송될 때까지 함수를 차단할 것인지, 아니면 바로 반환하고, 콜백이 비동기적으로 전송될지 여부를 제어할 수 있습니다.
열거형에 어떤 장치를 포함할지, 어떤 장치 상태 변경이 콜백을 트리거할지 제어하기 위해 여러 필터를 사용할 수 있습니다. 자세한 내용은 RegisterDeviceCallback을 참조하세요. 콜백이 작동하는 방식에 대한 일반적인 정보는 GameInput 콜백을 참조하세요.