2

最近、Direct3D11を使用してMDX2.0からSlimDXに交換しましたが、キーボードとマウスのコントロールを実装するのに苦労しています。

MDXでは使用できます

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

ただし、SlimDXには別の方法があります。SlimDXでは、デバイスは抽象クラスであり、代わりにDirectInputオブジェクトを渡すことによって初期化する必要があるKeyboardクラスがありますが、DirectInputオブジェクトの作成方法やその目的を理解することはできません。

私が知る限り、SlimDXのドキュメントはかなりスリムですが、その特定の癖を学ぶための優れたリソースを誰かが知っているなら、ありがとう。

4

2 に答える 2

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は、新しいアプリケーションでDirectInputの代わりにキーボードとマウスの入力にWindowsメッセージループを使用し(Meltdown 2005スライドショー[1]に示されているように)、Xbox360コントローラーのDirectInputの代わりにXInputを使用することをお勧めします。

(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);

これで、イベントに反応できます。

于 2011-02-08T11:17:30.320 に答える
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コールバックを介して処理されたメッセージを確認する方が良いと思います。

于 2011-11-27T01:14:05.763 に答える