DirectInput DirectInput 의 사용법 DirectInput 장치 장치의 취득   [목차열람] [주소복사] [슬롯비우기]
장치의 취득
 
Microsoft DirectX 9.0

장치의 취득


Microsoft® DirectInput® 장치의 취득이란, 장치에의 액세스를 애플리케이션에게 주는 것이다. 장치가 취득되고 있는 한, DirectInput 는, 애플리케이션이 장치의 데이터를 사용할 수 있도록(듯이) 한다. 장치가 취득되지 않은 경우, 장치의 특성에 대한 조작은 할 수 있지만, 데이터는 취득할 수 없다.

취득은 영속 하는 것은 아니다. 애플리케이션은, 장치를 몇회에서도 취득·릴리즈 할 수 있다.

협조 레벨에 따라서는, 애플리케이션이 백그라운드로 처리하면 자동적으로 장치가 릴리즈 되는 일이 있다. 마우스의 경우, 사용자가 메뉴를 클릭 하면 자동적으로 릴리즈 된다. 클릭한 시점에서 Microsoft Windows® 가 장치의 제어를 계승하기 때문이다.

장치 프로퍼티를 변경하기 전에는, 그 장치를 릴리즈 해야 한다. 유일한 예외로서 force feedback 장치는, 취득 상태에 있어도 게인을 변경할 수 있다.

취득의 메카니즘이 필요한 이유는, 다음의 2 개이다.

최초의 이유는, DirectInput 는, 장치로부터의 데이터의 흐름이 시스템에 의해 중단되었을 때에, 애플리케이션에 통지할 수 없으면 안 되는 것이다. 예를 들어, 사용자가 Alt+Tab 키를 사용해 다른 애플리케이션으로 전환해 변환 후의 애플리케이션으로 입력 장치를 사용했을 경우, 원의 애플리케이션은, 입력 장치가 자신에게 속하지 않고, 버퍼 상태가 변화한 가능성이 있는 것을 알 필요가 있다. DISCL_FOREGROUND 협조 레벨에서의 애플리케이션을 고려해 본다. 사용자가 Shift 키를 누르면서 다른 애플리케이션으로 전환한다. 그 후, 사용자는 Shift 키를 떼어 놓아, 원의 애플리케이션에 돌아온다. 원의 애플리케이션으로부터 보면, Shift 키는 여전히 밀리고 있는 상태이다. 취득의 메카니즘에서는, 원의 애플리케이션에 입력이 종료한 것을 통지해, 이 상태로부터 회복 당한다.

이제 1 개의 이유는, 애플리케이션이 장치의 프로퍼티를 변경할 수 있으므로, 보호가 없으면 사용자가 데이터를 취득하려고 할 때마다, DirectInput 가 프로퍼티를 체크해야 하게 되는 것이다. 이것으로는, 매우 효율이 나쁘다. 한층 더 나쁜 것에는, 버퍼 사이즈를 변경하고 있는 한중간에, 데이터 버퍼에 액세스 하는 하드웨어 인터럽트가 발생하는 등, 큰 장해가 일어날 가능성이 있다. 그러한 이유로써, DirectInput 는, 프로퍼티를 변경하기 전에, 애플리케이션에 대해서 장치를 릴리즈 하도록(듯이) 요구한다. 장치를 재얻어온다와 DirectInput 는 프로퍼티를 확인해, 장치로부터 애플리케이션에의 최적인 데이터 전송의 방법을 결정한다. 이 처리는 1 회 밖에 행해지지 않기 때문에, 데이터 취득의 각 메서드를 매우 고속으로 할 수가 있다.

장치를 잃는 가장 자주 있는 원인은, 애플리케이션이 백그라운드로 처리하는 것이다. 따라서, 애플리케이션이 액티브하게 되었을 때에는, 항상 장치를 재얻어올 필요가 있다. 그러나, 기동시의 WM_ACTIVATE 핸들러에 의존하려면 주의가 필요하다. 최초의 WM_ACTIVATE 메시지가 도착하는 것은, 윈도우의 초기화중에서, DirectInput 의 셋업전인 것이 많다. 기동시에 장치를 확실히 얻어오려면, 장치가 초기화되자 마자 IDirectInputDevice8::Acquire 를 호출하도록(듯이) 한다.

특히 표준의 키보드나 마우스 이외의 장치의 경우, 프로그램 윈도우가 액티브하게 되었을 때에 장치를 취득해도, 장치가 릴리즈 되는 모든 케이스에 대응할 수 있다고는 할 수 없다. 애플리케이션이 장치를 갑자기 릴리즈 하는 경우도 있으므로, 장치로부터 데이터를 취득하려고 하기 전에, 취득 상태를 확인하는 메카니즘이 필요하다. Scrawl 샘플에서는,Scrawl_OnMouseInput 함수로 이 확인을 실시하고 있다. 이 함수에서는,DIERR_INPUTLOST 에러가, 마우스를 재얻어온다 메시지의 방아쇠가 된다. 더 자세한 정보는, 「튜토리얼 2 : 마우스의 사용법」을 참조할것.

취득 끝난 장치를 재취득하려고 해도 상관없다. IDirectInputDevice8::Acquire 에 대한 장황한 호출은 무시되어 장치는 항상 IDirectInputDevice8::Unacquire 를 1 회 호출하는 것으로 릴리즈 할 수 있다.

Windows 는, 애플리케이션이 마우스를 배타 모드로 사용하고 있을 때는, 마우스에 액세스 하지 않는다. Windows 에 마우스를 취득시키고 싶은 경우, 마우스를 릴리즈 해야 한다. Scrawl 샘플에서는, 오른쪽 버튼의 클릭에 반응하기 위해서, 마우스를 릴리즈 해, Windows 커서를 같은 점에 표시해, 쇼트 컷 메뉴를 표시해, 메뉴 선택을 할 때까지 Windows 가 입력을 처리하도록(듯이) 하고 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP