2011-02-08 19 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では、デバイスは抽象クラスですが、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(); 

しかし、Microsoftはそれを推奨していますので、あなたがSlimDX.RawInputを使用する必要があります。

DirectInputのは のDirectXライブラリの一部を形成しながら、それはかなりのDirectX 8以降改訂 されていない (2001- 2002)。 Microsoftは 新しいアプリケーションが(メルトダウン2005 スライドショー[1]で示さ など)の代わりにDirectInputののキーボードと マウス入力用 Windowsメッセージループを使用すること、及びXbox 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

実際のhWnd(コントロールの/フォームのハンドル)からカーソルを取得するにはSlimDX.RawInput を使用して、あなたは "user32.dllの"

  1. BOOL GetCursorPos(LPOINT lpPoint)からのextern関数に必要

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のオーバーライドでいくつかのコーディングを行うことができます.WindProcプログラマがちょうどそれに慣れていて、それと面倒な書き込みをするメッセージを処理するのに使用されています。しかし、あなたが持っているより多くのコントロールを下に行く。 私は、すべての情報を元に戻すが、マウスの位置はハンドラのMouseInputEventArgsから取得すると言った。私はWndProcコールバックを介して処理されたメッセージをチェックするほうが良いことがわかります。