C# Keybord事件无法正常工作

C# Keybord事件无法正常工作,c#,windows-8,winrt-xaml,C#,Windows 8,Winrt Xaml,我已经创建了一个工作良好的游戏,但我有一个关键的命令部分的问题。当我点击屏幕上的某个地方时,我的按键事件不起作用。我猜测,具有KeyDown事件处理程序的控件失去了焦点,并且我的应用程序没有收到消息。我花了一周时间试图解决这个问题 我试图为更多控件设置KeyDown事件。我还尝试设置控件的焦点,该控件处理事件但未成功 如果有人告诉我在我的游戏中处理按键收集的正确方法是什么,我将不胜感激,无论在我的应用程序中发生了什么。我只想知道用户何时按下箭头键来更改内容。我不确定WinRT是否正确,但在WPF

我已经创建了一个工作良好的游戏,但我有一个关键的命令部分的问题。当我点击屏幕上的某个地方时,我的按键事件不起作用。我猜测,具有KeyDown事件处理程序的控件失去了焦点,并且我的应用程序没有收到消息。我花了一周时间试图解决这个问题

我试图为更多控件设置KeyDown事件。我还尝试设置控件的焦点,该控件处理事件但未成功


如果有人告诉我在我的游戏中处理按键收集的正确方法是什么,我将不胜感激,无论在我的应用程序中发生了什么。我只想知道用户何时按下箭头键来更改内容。

我不确定WinRT是否正确,但在WPF中,您可以通过添加这样的处理程序来捕获来自所有子控件的路由事件

this.AddHandler(UIElement.PreviewKeyDownEvent, new RoutedEventHandler(OnKeyDown), true);
这里是父控件。WinRT也可以用,请试试

编辑


UIElement.PreviewKeyDownEvent
替换为
UIElement.KeyDownEvent
if
UIElement.PreviewKeyDownEvent
在WinRT中不存在我之前没有回答,因为系统不允许我回答,因为我没有10个信誉点,所以我不得不等待8小时

这是我键入的内容,但它似乎需要声明一些我不知道如何制作的内容

this.AddHandler(UIElement.KeyUpEvent, new RoutedEventHandler(KeyUp), true);
错误消息是

委托Windows.UI.Xaml.RoutedEventHandler 表示将处理路由事件的方法。 错误: “KeyUp”与委托“Windows.UI.Xaml.RoutedEventHandler”匹配时没有重载。

将用作事件处理程序的函数具有以下格式:

private void KeyUp(object sender, KeyRoutedEventArgs e)
{
}
我找到了一个绕过我的问题的方法,我想与你分享它,以防其他人需要它,但如果其他人知道一个更好的方法,让我知道

我在页面的可见区域外放置了一个按钮,我使用了它的KeyUp事件,并编写了代码以确保它始终处于活动状态。下面你可以找到我的代码

public frmMain()
{
    this.InitializeComponent();

    btnKeboardCollector.Loaded += MyBoard_Loaded;
    btnKeboardCollector.LostFocus += btnKeboardCollector_LostFocus;
    btnKeboardCollector.KeyUp += KeyUpHandler;
}

void MyBoard_Loaded(object sender, RoutedEventArgs e)
{
    // I do other initialization here

    btnKeboardCollector.Focus(Windows.UI.Xaml.FocusState.Programmatic);
}

void btnKeboardCollector_LostFocus(object sender, RoutedEventArgs e)
{
    btnKeboardCollector.Focus(Windows.UI.Xaml.FocusState.Programmatic);
}

private void KeyUpHandler(object sender, KeyRoutedEventArgs e)
{
}

我刚刚遇到了一个类似的问题,但我接着了解了他们在LayoutWarePage中是如何做到的。CoreDispatcher\u AcceleratoryActivated和它似乎都按预期工作。

我刚刚找到了一个非常直接的解决方案。无论元素是否被聚焦,它总是有效的

1st:功能

private void onAcceleratorKey(object sender, AcceleratorKeyEventArgs e)
{
    CoreVirtualKeyStates ctrl = Window.Current.CoreWindow.GetAsyncKeyState(VirtualKey.Control);

    if (ctrl == CoreVirtualKeyStates.Down)
    {
        switch (e.VirtualKey)
        {
            case VirtualKey.F:
                // CTRL + F pressed.
                break;
        }
    }
}
2:活动

Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += onAcceleratorKey;

对CoreDispatcher.AcceleratoryActivated事件:激活(按下或按住)加速器键时激发。我想指出的是,如果您遇到CoreAccleraterWorkeys.AcceleraterWorkeyActivated,它就是相同的事件。