SlimDX RawInput с WPF

Я пытаюсь настроить управление клавиатурой и мышью для космической игры, используя SlimDX и RawInput. Мой текущий код выглядит следующим образом:

Device.RegisterDevice(UsagePage.Generic, UsageId.Keyboard, DeviceFlags.None);
Device.KeyboardInput += new EventHandler<KeyboardInputEventArgs>(keyboardInput);
Device.RegisterDevice(UsagePage.Generic, UsageId.Mouse, DeviceFlags.None);
Device.MouseInput += new EventHandler<MouseInputEventArgs>(mouseInput);

Однако я прочитал здесь: http://code.google.com/p/slimdx/issues/detail?id=785, что для WPF мне нужно использовать другую перегрузку для Device.RegisterDevice(), а также назначить HandleMessage с помощью Device.HandleMessage(IntPtr message)

Я нашел правильную перегрузку для RegisterDevice(), а именно:

RegisterDevice(UsagePage usagePage, UsageId usageId, DeviceFlags flags, IntPtr target, bool addThreadFilter)

Чего я не могу понять, так это:

1) Теперь, когда мне нужно использовать цель, что я должен установить в качестве цели?

2) Откуда я могу получить это сообщение IntPtr?


person Nick Udell    schedule 25.02.2013    source источник
comment
Разве он не просит вашу оконную ручку?   -  person Andy    schedule 25.02.2013
comment
Для цели? Я думал, что это может быть, но я не смог проверить это должным образом, не решив часть 2.   -  person Nick Udell    schedule 26.02.2013
comment
Вы можете получить дескриптор окна WPF, используя класс System.Windows.Interop.WindowInteropHelper, просто создайте новый экземпляр, передав ссылку на окно в качестве параметра конструктора, а его свойство Handle - это IntPtr   -  person Andy    schedule 26.02.2013
comment
О, я вижу. Итак, если это дескриптор, что передается в качестве цели? Или я должен просто установить значение null. К сожалению, в документации SlimDX фактически не упоминается, к чему она относится, и это один из случаев, когда она отличается от C++ DirectX SDK.   -  person Nick Udell    schedule 26.02.2013


Ответы (1)


Это может помочь, я сделал это для игры в понг. Надеюсь, поможет

            private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Down)
        {
            spaceKeyDown = true;
        }
        if (e.KeyCode == Keys.Up)
        {
            spaceKeyUp = true;
        }
        if (e.KeyCode == Keys.W)
        {
            spaceKeyW = true;
        }
        if (e.KeyCode == Keys.S)
        {
            spaceKeyS = true;
        }
        if (direction == 0)
        {
            if (e.KeyCode == Keys.Space)
            {
                Random rand = new Random();
                direction = rand.Next(1, 5);
            }
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Down)
        {
            spaceKeyDown = false;
        }
        if (e.KeyCode == Keys.Up)
        {
            spaceKeyUp = false;
        }
        if (e.KeyCode == Keys.W)
        {
            spaceKeyW = false;
        }
        if (e.KeyCode == Keys.S)
        {
            spaceKeyS = false;
        }
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (spaceKeyDown == true)
        {
            if (p2y < picPicture.Height - Paddle2.Height)
                p2y += 15;
        }
        if (spaceKeyUp == true)
        {
            if (p2y > 0)
                p2y -= 15;
        }
        if (spaceKeyS == true)
        {
            if (p1y < picPicture.Height - Paddle1.Height)
                p1y += 15;
        }
        if (spaceKeyW == true)
        {
            if (p1y > 0)
                p1y -= 15;
        }
    }
person Dylan    schedule 19.04.2013
comment
Спасибо, Дилан, на самом деле это система, которая у меня сейчас работает. Однако я надеялся получить что-то, что использует RawInput для разбора элементов управления, поскольку я слышал, что это может быть более отзывчивым (и я делаю космический шутер, поэтому задержка контроллера может быть катастрофической в ​​большом бою). - person Nick Udell; 20.04.2013