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
中的数百个Shape
s 组成,但没有单个Button
、TextBox
或任何其他支持键盘交互的东西。唯一的交互是点击或点击形状。
我需要在全局范围内捕获整个页面的键盘事件,无论哪个元素具有焦点,甚至是否有任何焦点等。每当按下 Esc 键时,都必须触发一个事件。
我尝试了什么:
使用事件Page.KeyDown
或覆盖Page.OnKeyDown(KeyRoutedEventArgs e)
(或KeyUp):不会触发,除非有诸如TextBox
之类的元素具有键盘焦点。但在我的 UI 中没有这样的元素。
使用不可见的(Opacity = 0
和/或隐藏在画布下)文本框作为使 KeyDown 工作的技巧:一旦单击/点击画布或任何形状,文本框就会失去焦点并且 hack停止工作。因此,需要更多的技巧来使其保持焦点,这与菜单按钮等其他东西有关。此外,TextBox 偶尔会显示 Windows 软件键盘,这是相当不受欢迎的。一个勉强有效、脆弱的黑客。
使用 InputGestures
、KeyBinding
等:不适用于 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 应用商店应用中的页面全局键盘事件的主要内容,如果未能解决你的问题,请参考以下文章