Windows Store应用程序中的页面全局键盘事件

本文关键字:全局 键盘 事件 Store 应用程序 Windows | 更新日期: 2023-09-27 18:07:20

我正在制作一款基于WPF并使用c#编写的Windows Store应用程序。当玩家按Esc键时,我想暂停游戏并显示菜单(继续,退出等)。

听起来很简单。遗憾的是,它不是。

游戏发生在Windows.UI.Xaml.Controls.Page中,主要由Canvas中的数百个Shape组成,但没有单个Button, TextBox或其他支持键盘交互的东西。唯一的交互是点击或轻敲形状。

我需要捕捉键盘事件,全局为整个页面,无论什么元素有焦点,或者甚至有任何焦点等。当按下Esc键时,必须触发一个事件。

What I tried:

  • 使用事件Page.KeyDown或重写Page.OnKeyDown(KeyRoutedEventArgs e)(或KeyUp):不触发,除非有一个元素,如具有键盘焦点的TextBox。但是在我的UI中没有这样的元素

  • 使用一个不可见的(Opacity = 0和/或隐藏在画布下)文本框作为一个hack,使KeyDown工作:只要画布或任何形状被点击/点击,文本框失去焦点,黑客停止工作。因此,需要更多的技巧来保持焦点,这与其他东西(如菜单按钮)相结合。此外,文本框偶尔会显示Windows软件键盘,这是相当不希望的。

  • 使用InputGestures, KeyBinding等:不可用于Windows商店应用程序

有什么想法或解决方案吗?

Windows Store应用程序中的页面全局键盘事件

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

public MyPage()
{
    CoreWindow.GetForCurrentThread().KeyDown += MyPage_KeyDown;
}
void MyPage_KeyDown(CoreWindow sender, KeyEventArgs args)
{
    Debug.WriteLine(args.VirtualKey.ToString());
}

CoreWindow.GetForCurrentThread()。如果焦点在其他网格/webView/文本框上,KeyDown将不会捕获事件,因此使用AcceleratorKeyActivated event。无论焦点在哪里,它总是会捕捉到事件。

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;
            }
        }
    }
}