Événements de clavier globaux dans le Windows Store Apps

Je travaille sur un jeu, une application Windows Store basée sur WPF et écrite en C #. Lorsque le joueur appuie sur la touche Echap, je souhaite mettre en pause le jeu et afficher un menu (Continuer, Quitter, etc.).

Cela semble simple. Malheureusement, ce n’est pas le cas.

Le jeu se déroule dans une Windows.UI.Xaml.Controls.Page et consiste principalement en des centaines de Shape dans un Canvas , mais pas de Button , de zone de TextBox ou d’autre support prenant en charge les interactions clavier. La seule interaction est en cliquant ou en tapant des formes.

J’ai besoin de capturer des événements de clavier, globalement pour toute la page, quel que soit l’élément ayant le focus ou s’il existe même un focus, etc. Chaque fois que vous appuyez sur la touche Echap, un événement doit se déclencher.

Ce que j’ai essayé:

  • Utilisation de l’événement Page.KeyDown ou Page.OnKeyDown(KeyRoutedEventArgs e) (ou KeyUp): ne se déclenche pas, sauf s’il existe un élément tel qu’un TextBox avec le focus clavier. Mais dans mon interface utilisateur, cet élément n’existe pas.

  • Utilisation d’un TextBox invisible ( Opacity = 0 et / ou caché sous le canevas) comme moyen de faire fonctionner KeyDown: Dès que vous cliquez / tapez sur le canevas ou une forme quelconque, le contrôle TextBox perd le focus et le hack cesse de fonctionner. Il faut donc plus de piratage pour que le focus rest clair, ce qui se combine à d’autres choses telles que les boutons de menu. De plus, la TextBox affiche occasionnellement le clavier logiciel Windows, ce qui est plutôt indésirable. Un hack fragile qui fonctionne à peine.

  • Utilisation de InputGestures , KeyBinding etc.: non disponible pour les applications du Windows Store.

Des idées ou des solutions?

Essayez d’utiliser CoreWindow.KeyDown . Assignez le gestionnaire dans votre page et je crois qu’il devrait intercepter tous les événements keydown.

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

CoreWindow.GetForCurrentThread (). KeyDown ne capturera pas les événements si le focus est sur une autre zone de grid / webView /, utilisez plutôt l’événement AcceleratorKeyActivated . Indépendamment de l’endroit où l’accent est mis, l’événement sera toujours capturé.

 public MyPage() { Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += AcceleratorKeyActivated; } private void AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args) { if (args.EventType.ToSsortingng().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; } } } }