2011-02-08 49 views
2

我最近從MDX 2.0轉換到SlimDX,使用Direct3D 11,但我努力實現鍵盤和鼠標控制。SlimDX DirectInput初始化

在MDX可以使用

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

建立一個鍵盤接口,但是SlimDX有不同的方法。在SlimDX中,Device是一個抽象類,相反,有一個Keyboard類必須通過傳入一個DirectInput對象來初始化,但是我不能在我的生活中找出如何創建一個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庫的一部分,它一直沒有 因爲DirectX 8的顯著修訂 (2001- 2002)。 Microsoft建議 新的應用程序使用鍵盤和 鼠標輸入而不是DirectInput的的 的Windows消息循環(如 在熔燬2005年 幻燈片[1]所示),並使用XINPUT 代替的DirectInput爲Xbox 360 控制器。

(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中」 需要extern函數

  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地址,並把它傳遞到ScreenToClient(HWND的HWND,LPPOINT LPPOINT)也返回一個BOOL。

[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的一些編碼,這是你用來處理消息,我們所有的WINAPI程序員只是習慣和繁瑣的寫作與它是首選。然而,越低,你得到的控制越多。 就像我說過的,你得到所有的信息,但從處理程序的MouseInputEventArgs中獲取鼠標位置。我發現最好通過WndProc回調來檢查處理過的消息。