2011-02-08 7 views
2

최근 Direct3D 11을 사용하여 MDX 2.0에서 SlimDX로 바꾸었지만 키보드 및 마우스 컨트롤을 구현하는 데 어려움을 겪고 있습니다.SlimDX DirectInput 초기화

MDX에서 당신은 그러나 SlimDX는 다른 방법을 가지고,

keyb = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard); 
keyb.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive); 
keyb.Acquire(); 

는 키보드 인터페이스를 설정하는 데 사용할 수 있습니다. SlimDX에서 Device는 추상 클래스입니다. 대신 DirectInput 개체를 전달하여 초기화해야하는 Keyboard 클래스가 있지만 DirectInput 개체를 만드는 방법이나 그 기능을 이해할 수는 없습니다.

SlimDX에 대한 문서가 꽤 슬림한데, 환상적인 특정 버크를 배우는 데 필요한 훌륭한 자료를 알고 있다면 감사합니다.

답변

4

나는 이렇게 사용했다. 마우스 조작은 동일합니다.

using SlimDX.DirectInput; 

private DirectInput directInput; 
private Keyboard keyboard; 

[...] 

//init 
directInput = new DirectInput(); 
keyboard = new Keyboard(directInput); 
keyboard.SetCooperativeLevel(form, CooperativeLevel.Nonexclusive | CooperativeLevel.Background); 
keyboard.Acquire(); 

[...] 

//read 
KeyboardState keys = keyboard.GetCurrentState(); 

그러나 마이크로 소프트가 권장 때문에 SlimDX.RawInput을 사용해야합니다

의 DirectInput은 의 DirectX 라이브러리의 일부를 형성하고 있지만, 크게 다이렉트 X 8부터 개정 되지 않았습니다 (2001 2002). Microsoft는 새로운 응용 프로그램 (붕괴 2005 슬라이드 쇼 [1]에 표시된 등) 대신의 DirectInput의 키보드와 마우스 입력에 대한 Windows 메시지 루프를 사용합니다, X 박스 360 에 대한 XInput에 대신의 DirectInput을 사용하는 것이 좋습니다 컨트롤러.

(http://en.wikipedia.org/wiki/DirectInput)

rawinput 마우스 샘플 (키보드 거의 동일) :

SlimDX.RawInput.Device.RegisterDevice(UsagePage.Generic, UsageId.Mouse, SlimDX.RawInput.DeviceFlags.None); 
      SlimDX.RawInput.Device.MouseInput += new System.EventHandler<MouseInputEventArgs>(Device_MouseInput); 

지금 당신이에 반응 할 수 이벤트.

1

사용 SlimDX.RawInput 실제로 HWND (컨트롤의/폼의 핸들)에서 커서를 얻으려면, 당신은 "USER32.DLL"에서 통근 기능에 필요

  1. BOOL GetCursorPos (LPOINT lpPoint)

대신 System.Runtime.Interlop 및 System.Drawing.Point를 사용하십시오 (대신 POINT 구조체를 만들지 않는 한).

[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)] 
[return: MarshalAs(UnmanagedType.Bool)] 
internal unsafe static extern bool GetCursorPos(Point* lpPoint); 

이 당신에게 당신이 lpPoint 주소를 가지고도 BOOL을 반환 ScreenToClient (HWND HWND, LPPOINT lpPoint)로 전달합니다 바탕 화면 다음에 커서의 실제 위치를 얻을 것이다.

[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall,SetLastError=true)] 
internal static extern int ScreenToClient(IntPtr hWnd, Point* p); 

것은 그냥이 다음처럼에서 포인트를하자 :

public unsafe Point GetClientCurorPos(IntPtr hWnd, Point*p) 
{ 
    Point p = new Point(); 
    if (GetCursorPos(&p)) 
    { 
     ScreenToClient(hWnd, &p); 
    } 
    return p; 
} 

당신은 SlimDX.RawInput.Device를 사용할 수 있습니다.MouseInput 처리기를 원하거나 WndProc에 대한 재정의로 코딩 작업을 수행 할 수 있습니다. WndProc은 WINAPI 프로그래머들 모두에게 익숙한 지루하고 어려운 메시지를 처리하는 데 사용됩니다. 그러나, 당신은 당신이 가진 더 많은 컨트롤을 낮추십시오. 마찬가지로 모든 정보를 다시 가져 왔지만 핸들러의 MouseInputEventArgs에서 마우스 위치를 얻는다 고 말한 것입니다. WndProc 콜백을 통해 처리 된 메시지를 확인하는 것이 좋습니다.