una teclas teclado tecla pulsacion programar eventos evento detectar combinacion boton asignar c# wpf windows-store-apps keyboard-events

c# - teclas - eventos del teclado javascript



Eventos de teclado de página global en aplicaciones de la Tienda Windows (2)

Estoy trabajando en un juego, una aplicación de Windows Store basada en WPF y escrita en C #. Cuando el jugador presiona la tecla Esc, quiero pausar el juego y mostrar un menú (Continuar, Salir, etc.).

Suena simple. Lamentablemente, no lo es.

El juego se lleva a cabo en Windows.UI.Xaml.Controls.Page y consiste principalmente en cientos de Shape s en un Canvas , pero no hay un solo Button , TextBox o cualquier otra cosa que admita la interacción con el teclado. La única interacción es hacer clic o tocar formas.

Necesito capturar eventos de teclado, globalmente para toda la página, sin importar qué elemento tenga el enfoque o si hay algún enfoque, etc. Cuando se presiona la tecla Esc, debe dispararse un evento.

Lo que intenté:

  • Usar el evento Page.KeyDown o anular Page.OnKeyDown(KeyRoutedEventArgs e) (o KeyUp): no se dispara, a menos que exista un elemento como un TextBox con el teclado. Pero en mi interfaz de usuario no hay tal elemento.

  • Usar un TextBox invisible ( Opacity = 0 y / o escondido debajo del Lienzo) como truco para hacer que KeyDown funcione: Tan pronto como se hace clic en el Lienzo o en cualquier Forma, el Cuadro de texto pierde el foco y el truco deja de funcionar. Por lo tanto, se necesitan más hacks para mantener el enfoque, que se atornilla con otras cosas, como los botones del menú. Más aún, el TextBox ocasionalmente muestra el teclado del software de Windows, que es más bien no deseado. Un truco que apenas funciona, frágil.

  • Uso de InputGestures , InputGestures , etc .: No disponible para aplicaciones de la Tienda Windows.

¿Ideas o soluciones?


CoreWindow.GetForCurrentThread (). KeyDown no capturará eventos si se enfoca en alguna otra cuadrícula / webView / cuadro de texto, por lo tanto, use el evento AcceleratorKeyActivated . Independientemente de dónde se enfoca, siempre capturará el evento.

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


Intente usar CoreWindow.KeyDown . Asigne el manejador en su página y creo que debería interceptar todos los eventos keydown.

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