Sharpdx takeit 输入不适用于 windows 10 个通用应用程序

Sharpdx tookit input won't work with windows 10 universal apps

我正在 windows 10 中使用通用应用程序试用 sharpdx tookit,但无法使输入正常工作。我知道我必须为不同的设备创建不同的输入,但现在我只想尝试键盘。

所以我先按照这个link来设置项目:Is there a SharpDx Template, for a Windows Universal App?

现在我正在尝试像往常一样输入:

在构造函数中:

_keyboardManager = new KeyboardManager(this);

在更新方法中:

var state = _keyboardManager.GetState();
if (state.IsKeyDown(Keys.B))
{
  //do stuff
}

但他从未注册过按键 B 已关闭(或我尝试过的任何其他按键)。我也试过 GetDownKeys() 但列表总是空的。

那么有人知道在这里做什么吗?

HEUREKA!

我遇到了同样的问题,但是 windows 8.1。我花了 2 天时间才找到解决方案。这是愚蠢的 SwapChainPanel,它不能成为焦点,因为 class 没有继承自 Control class,所以它不会处理键盘事件。

解决方案是HERE,也就是说,你必须放一个XAML继承自Controlclass的元素,比如Button来处理事件。我的 XAML 文件是这样的:

<SwapChainPanel  x:Name="_swapChainPanel"
                 Loaded="_swapChainPanel_Loaded"
                 KeyDown="_swapChainPanel_KeyDown">
    <Button x:Name="_swapChainButton"
            Content="Button"
            HorizontalAlignment="Left"
            Height="0"
            VerticalAlignment="Top"
            Width="0" 
            KeyDown="_swapChainButton_KeyDown">
    </Button>
</SwapChainPanel>

在 XAML.cs 我是这样处理事件的:

private void _swapChainButton_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
    {
        e.Handled = false; //This will pass the event to its parent, which is the _swapChainPanel
    }

private void _swapChainPanel_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
    {
        game.KeyboardEvent();
    }

在 KeyboardEvent() 方法中,我放置了 if 东西...并且您必须使用代码手动使按钮处于焦点状态。 “_swapChainButton.Focus(FocusState.Programmatic);”

但最后,它对我来说不是很好,它太慢了。它有延迟。 :/

还有另一个更好、更简单的版本:

using Windows.UI.Core;
using SharpDX.Toolkit;
using Windows.System;
namespace Example
{
    class MyGame : Game
    {
        public MyGame()
        {
            CoreWindow.GetForCurrentThread().KeyDown += MyGame_KeyDown;
        }
        void MyGame_KeyDown(CoreWindow sender, KeyEventArgs args)
        {
            System.Diagnostics.Debug.WriteLine(args.VirtualKey);
        }
    }
}

您必须订阅 CoreWindow 的事件,仅此而已:)