使用WPF的SlimDX RawInput

3
我正在尝试使用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()重载方式,并使用Device.HandleMessage(IntPtr message)来分配HandleMessage。
我已经找到了正确的RegisterDevice()重载方式:
RegisterDevice(UsagePage usagePage, UsageId usageId, DeviceFlags flags, IntPtr target, bool addThreadFilter)

我不明白的是:

1)现在我需要使用一个目标,那么我应该设置什么作为目标?

2)我从哪里得到这个IntPtr消息?


它不是在要求您的窗口句柄吗? - Andy
对于目标? 我以为可能是,但如果没有解决第二部分,我就无法进行适当的测试。 - Nick Udell
您可以通过System.Windows.Interop.WindowInteropHelper类获取WPF窗口的句柄,只需创建一个新实例并将窗口引用作为构造函数参数传递,然后它的Handle属性即为IntPtr。 - Andy
哦,我明白了。那么如果这是句柄,传递的目标是什么?或者我应该将其设置为null。可悲的是,SlimDX文档实际上没有提到它所涉及的内容,这是一种情况,它与C++ DirectX SDK不同。 - Nick Udell
1个回答

2
这可能有所帮助,我为乒乓球游戏制作了这个。希望能帮到你。
            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;
        }
    }

谢谢,Dylan - 那实际上是我现在正在使用的系统。然而,我希望能够得到一个使用RawInput来解析控件的东西,因为我听说它可以更加响应(而且我正在做一个太空射击游戏 - 所以在大战中控制器延迟可能会很糟糕)。 - Nick Udell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接