2013-04-03 16 views
16

Pracuję nad grą, aplikacją Windows Store opartą na WPF i napisaną w języku C#. Kiedy gracz naciśnie klawisz Esc, chcę zatrzymać grę i wyświetlić menu (Kontynuuj, Wyjdź itp.).Zdarzenia globalnej klawiatury strony w aplikacjach Windows Store

Brzmi prosto. Niestety, nie jest.

Gra odbywa się w Windows.UI.Xaml.Controls.Page i składa się głównie z setek Shape s w Canvas, ale żaden pojedynczy Button, TextBox lub cokolwiek innego, co umożliwia interakcję klawiatury. Jedyna interakcja to klikanie lub stukanie w kształty.

Potrzebuję przechwytywać zdarzenia klawiatury, globalnie dla całej strony, bez względu na to, który element ma fokus lub czy w ogóle jest skupienie itd. Po naciśnięciu klawisza Esc wydarzenie musi zostać wywołane.

Co próbowałem:

  • Korzystanie zdarzenie Page.KeyDown lub nadrzędnym Page.OnKeyDown(KeyRoutedEventArgs e) (lub KeyUp): Nie strzelać, chyba że jest to element, taki jak TextBox z klawiatury ostrości. Ale w moim interfejsie nie ma takiego elementu.

  • Korzystanie niewidzialny (Opacity = 0 i/lub ukryte pod płótnie) TextBox jako hack do KeyDown pracę: Jak tylko płótna lub dowolny kształt kliknięciu/podsłuchu, TextBox traci fokus i siekać przestaje działać. Potrzebnych jest więcej hacków, aby skupić się na innych elementach, takich jak przyciski menu. Co więcej, TextBox okazjonalnie pokazuje klawiaturę Windows, która jest raczej niechciana. Ledwie działający, delikatny hack.

  • Korzystanie z InputGestures, KeyBinding itp .: Niedostępne dla aplikacji Sklepu systemu Windows.

Wszelkie pomysły lub rozwiązania?

Odpowiedz

21

Spróbuj użyć CoreWindow.KeyDown. Przypisz handler na swojej stronie i uważam, że powinien on przechwycić wszystkie zdarzenia związane z keydown.

public MyPage() 
{ 
    CoreWindow.GetForCurrentThread().KeyDown += MyPage_KeyDown; 
} 

void MyPage_KeyDown(CoreWindow sender, KeyEventArgs args) 
{ 
    Debug.WriteLine(args.VirtualKey.ToString()); 
} 
+0

Wydaje się działać, dziękuję. Zrobię więcej testów jutro, a następnie zaakceptuję twoją odpowiedź. –

+0

@SebastianNegraszus - Nie ma problemu, mam nadzieję, że działa! – keyboardP

2

CoreWindow.GetForCurrentThread(). KeyDown nie będzie przechwytywać zdarzenia, jeśli skupiamy się na innym polu siatki/Webview/tekstu, więc zamiast używać AcceleratorKeyActivated wydarzenie. Niezależnie od tego, gdzie się znajduje, zawsze będzie rejestrować wydarzenie.

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; 
      } 
     } 
    } 
} 
Powiązane problemy