Windows 应用商店应用中的页面全局键盘事件

Posted

技术标签:

【中文标题】Windows 应用商店应用中的页面全局键盘事件【英文标题】:Page-global keyboard events in Windows Store Apps 【发布时间】:2013-04-03 16:31:17 【问题描述】:

我正在开发一个游戏,一个基于 WPF 并用 C# 编写的 Windows 应用商店应用程序。当玩家按下 Esc 键时,我想暂停游戏并显示一个菜单(继续、退出等)。

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

游戏在Windows.UI.Xaml.Controls.Page 中进行,主要由Canvas 中的数百个Shapes 组成,但没有单个ButtonTextBox 或任何其他支持键盘交互的东西。唯一的交互是点击或点击形状。

我需要在全局范围内捕获整个页面的键盘事件,无论哪个元素具有焦点,甚至是否有任何焦点等。每当按下 Esc 键时,都必须触发一个事件。

我尝试了什么:

使用事件Page.KeyDown 或覆盖Page.OnKeyDown(KeyRoutedEventArgs e)(或KeyUp):不会触发,除非有诸如TextBox 之类的元素具有键盘焦点。但在我的 UI 中没有这样的元素。

使用不可见的(Opacity = 0 和/或隐藏在画布下)文本框作为使 KeyDown 工作的技巧:一旦单击/点击画布或任何形状,文本框就会失去焦点并且 hack停止工作。因此,需要更多的技巧来使其保持焦点,这与菜单按钮等其他东西有关。此外,TextBox 偶尔会显示 Windows 软件键盘,这是相当不受欢迎的。一个勉强有效、脆弱的黑客。

使用 InputGesturesKeyBinding 等:不适用于 Windows 应用商店应用。

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

【问题讨论】:

【参考方案1】:

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

public MyPage()

    CoreWindow.GetForCurrentThread().KeyDown += MyPage_KeyDown;


void MyPage_KeyDown(CoreWindow sender, KeyEventArgs args)

    Debug.WriteLine(args.VirtualKey.ToString());

【讨论】:

似乎有效,谢谢。我明天再做一些测试,然后接受你的回答。 @keyboardP 你拯救了我的一天!!没有话要感谢你... :-)【参考方案2】:

CoreWindow.GetForCurrentThread().KeyDown 如果焦点位于其他网格/webView/文本框上,则不会捕获事件,因此请改用 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;
            
        
    

【讨论】:

以上是关于Windows 应用商店应用中的页面全局键盘事件的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 应用商店应用中读取 HID 代理卡

我无法在提升的 Windows 应用程序中全局挂钩键盘

全局应用程序设置应存储在 Windows 7 的啥位置?

QT 捕获事件(全局拦截)

处理 Windows Phone 应用中的“后退”按钮 (XAML)

在没有 XAML 的情况下创建 Windows 应用商店应用页面