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

협조 레벨


장치의 협조 레벨에 의해, 다른 애플리케이션이나 Microsoft® Windows® 시스템과의 사이에 장치를 공유할 방법이 정의된다. 협조 레벨을 설정하려면 , 다음과 같이 IDirectInputDevice8::SetCooperativeLevel 메서드를 사용한다.

/* hwnd is the top-level window handle.  */
lpdiDevice->SetCooperativeLevel(hwnd, 
DISCL_NONEXCLUSIVE? DISCL_FOREGROUND

파라미터는, 장치에 관련하는 최상정도 윈도우 (보통은 애플리케이션 윈도우)의 핸들과 1 개 또는 복수의 플래그이다.

Microsoft DirectInput® 에는 디폴트 설정이 준비되어 있지만, 협조 레벨은 명시적으로 설정해야 한다. 이것은, DirectInput 에 윈도우의 핸들을 주기 위한 유일한 방법이니까이다. 이 핸들이 없으면 DirectInput 는, 조이스틱의 재calibration 등, 윈도우 메시지가 필요한 상황으로 반응할 수 없게 된다.

유효한 플래그의 편성을 이하의 표에 나타낸다.

플래그메모
DISCL_NONEXCLUSIVE

DISCL_BACKGROUND

디폴트 설정
DISCL_NONEXCLUSIVE

DISCL_FOREGROUND

DISCL_EXCLUSIVE

DISCL_FOREGROUND

DISCL_EXCLUSIVE

DISCL_BACKGROUND

키보드 또는 마우스에는 무효

키보드의 경우는, DISCL_NOWINKEY 와 DISCL_NONEXCLUSIVE 를 동시에 사용할 수도 있다. 이 플래그로 Windows 키를 무효로 하는 것으로, 사용자는 부주의에 애플리케이션을 종료하는 것이 없어진다. 배타 모드에서는, Windows 키는 항상 무효이다.

  Windows 키는, 애플리케이션의 협조 레벨로 배타 협조 레벨을 통해 수동적으로 무효로 하는 경우나, DISCL_NOWINKEY 플래그를 사용해 능동적으로 무효로 하는 경우에서도, 디폴트의 액션 맵핑 UI 가 표시되고 있는 동안은 액티브하게 된다.

협조 레벨에는 2 개의 원가요소가 있다. 그것은, 장치를 foreground 또는 백그라운드에서 사용할까하고, 배타 또는 비배타에 사용할까이다.

foreground와 백그라운드

foreground 협조 레벨은, 애플리케이션이 foreground에 있는 경우, 즉, 입력초점을 가지는 경우에 한정해, 입력 장치가 사용 가능하게 되는 것을 의미한다. 애플리케이션이 백그라운드로 옮겨지면 입력 장치는 자동적으로 릴리즈 될까 사용 불가능하게 된다.

백그라운드 협조 레벨이란, 실제로는 foreground와 백그라운드이다. 백그라운드 협조 레벨의 장치는, 애플리케이션으로부터 언제라도 취득해 사용할 수 있다.

보통은, foreground 액세스권만으로 충분하다. 대부분의 애플리케이션은, 다른 프로그램이 foreground에 있는 경우에 발생하는 입력에 응답하도록(듯이)는 설계되지 않기 때문에이다.

애플리케이션의 개발중에, 조건부 컴파일을 사용해, 디버그용으로 백그라운드 협조 레벨을 설정하는 것은 유용하다. 이것에 의해, 애플리케이션은, 디버그 환경에의 변환으로 백그라운드로 이동할 때마다, 장치에의 액세스를 잃는 것이 없어진다.

배타와 비배타

많은 경우, 어느 애플리케이션이 장치를 배타 레벨로 사용하고 있다고 해도, 다른 애플리케이션이 같은 장치로부터 데이터를 취득할 수 없다고는 할 수 없다. 또, 배경 배타 모드를 요구하는 애플리케이션은, 다른 애플리케이션이 배타 액세스를 요구했을 때에 액세스를 잃을 가능성이 있다. 애플리케이션이 장치에의 액세스를 재얻어오려면, 장치를 수동으로 릴리즈 해, 재얻어온다.

예를 들어, 뮤직 player 애플리케이션의 경우, 애플리케이션은 백그라운드에 있어도, 소형의 리모트 콘트롤 장치로부터 입력을 받아들인다. 여기서, 같은 리모트 콘트롤 장치로부터의 신호에 응답해, 영화를 재생하는 애플리케이션을 실행 하면 한다. 사용자가 [Play] 를 누르면 무엇이 일어날까. 양쪽 모두의 프로그램이 재생을 시작 하게 된다. 이러한 결과는, 사용자가 바라는 것은 아니다. 이 상황이 발생하지 않게 하려면 , 각 애플리케이션에 DISCL_EXCLUSIVE 플래그를 설정해, 한 번에 어느 쪽인가의 프로그램 밖에 실행할 수 없게 할 필요가 있다.

force feedback 이펙트를 사용하려면 , 애플리케이션은 장치에의 배타 액세스를 할 수 있어야 한다.

Windows 자체에는, 마우스에의 배타 액세스가 필요하다. 이것은, 액티브하지 않은 윈도우상에서의 클릭등의 마우스 이벤트를 사용해, 애플리케이션에 장치를 강제 릴리즈 시키는 것이 가능하고, 그것이, 입력 버퍼로부터의 데이터의 상실 등, 문제를 발생시킬 가능성이 있기 때문이다. 이 때문에,IDirectInput8::CreateDevice 에 GUID_SysMouse 를 건네주어 생성 된 시스템 마우스에 대한 배타 액세스권을 애플리케이션이 가지고 있는 경우, Windows 에는 액세스가 용서되지 않고, 마우스 메시지는 생성되지 않는다. 한층 더 부작용으로서 커서가 사라지는 일도 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP