在Windows应用商店应用页面,全局键盘事件(Page-global keyboard event

2019-08-19 07:33发布

我工作的一个游戏,一个Windows Store应用基于WPF和C#编写的。 当玩家按下Esc键,我想暂停游戏,并显示一个菜单(继续,退出等)。

听起来很简单。 可悲的是,事实并非如此。

游戏的故事发生在一个Windows.UI.Xaml.Controls.Page ,主要由数百Shape在A S Canvas ,但没有一个ButtonTextBox或其他任何支持键盘交互。 唯一的互动是点击或点击形状。

我需要捕捉键盘事件,全球整个页面,无论什么元素具有焦点或甚至有任何聚焦在所有等当Esc键被按下时,事件已触发。

我的尝试:

  • 使用事件Page.KeyDown或压倒一切的Page.OnKeyDown(KeyRoutedEventArgs e)或KEYUP):不火,除非有一个元素,如TextBox具有键盘焦点。 但在我的UI也没有这样的元素。

  • 使用不可见( Opacity = 0和/或在画布隐藏的)文本框作为一个黑客,使工作的KeyDown:只要帆布或任何形状点击/挖掘,文本框失去焦点和黑客停止工作。 因此,需要更多的黑客,使之保持焦点,这与其他事物的螺钉,如菜单按钮。 Futhermore,文本框偶尔显示了Windows软件键盘,这是相当不想要的。 勉强工作,脆弱的黑客。

  • 使用InputGesturesKeyBinding等:不适用于Windows应用商店的应用程序。

任何意见或解决方案?

Answer 1:

尝试使用CoreWindow.KeyDown 。 分配在你的页面的处理程序,我相信这应该拦截所有的keydown事件。

public MyPage()
{
    CoreWindow.GetForCurrentThread().KeyDown += MyPage_KeyDown;
}

void MyPage_KeyDown(CoreWindow sender, KeyEventArgs args)
{
    Debug.WriteLine(args.VirtualKey.ToString());
}


Answer 2:

CoreWindow.GetForCurrentThread()的KeyDown不会捕获事件,如果它的重点是一些其他的网格/ web视图/文本框,所以改用AcceleratorKeyActivated事件。 无论是将重点它将始终捕获事件。

public MyPage()
{
    Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += AcceleratorKeyActivated;
}


private void AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
    if (args.EventType.ToString().Contains("Down"))
    {
        var ctrl = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
        if (ctrl.HasFlag(CoreVirtualKeyStates.Down))
        {
            switch (args.VirtualKey)
            {
                case VirtualKey.A:
                    Debug.WriteLine(args.VirtualKey);
                    Play_click(sender, new RoutedEventArgs());
                    break;
            }
        }
    }
}


文章来源: Page-global keyboard events in Windows Store Apps