处理 UWP 应用程序中的替代键

本文关键字:UWP 应用程序 处理 | 更新日期: 2023-09-27 17:56:51

我在Window.Current.CoreWindow上使用KeyDown和KeyUp处理程序来捕获UWP的VNC应用程序中的击键。 这很好用,但有一个例外:alt ( VirtualKey.Menu/LeftMenu/RightMenu ) 永远不会发送到我的应用程序。 此外,alt+letter 不会导致两者都不会发送到处理程序。

我假设这是因为某些加速器处理程序在到达 CoreWindow 之前正在吃掉这些事件。 有什么办法吗?

处理 UWP 应用程序中的替代键

尝试使用 Dispatcher.AcceleratorKeyActivated 相反,它处理 Alt 键。

此外,CoreWindow似乎存在问题。有关 MSDN 的更多详细信息

这是我如何在 Xamarin 窗体中解决此问题的示例。

// A model to store the values of the key event.
public class KeyEventArgs : EventArgs
{
    public bool IsAltKeyPressed { get; set; }
    public string Key { get; set; }
}
// UWP Custom render
public class MyPageViewRenderer : PageRenderer
{
    /// <summary>
    /// Monitor windows core ui keypress when MyPageView is showing
    /// </summary>
    public MyPageViewRenderer() : base()
    {
        // When ExplorePage appears then attach to the ui core keydown event
        Loaded += (object sender, RoutedEventArgs e) =>
        {
            CoreWindow.GetForCurrentThread().Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
        };
        // When ExplorePage disappears then detach from the ui core keydown event
        Unloaded += (object sender, RoutedEventArgs e) =>
        {
            CoreWindow.GetForCurrentThread().Dispatcher.AcceleratorKeyActivated -= Dispatcher_AcceleratorKeyActivated;
        };
    }
    private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
    {
        if ((args.EventType == CoreAcceleratorKeyEventType.KeyDown || args.EventType == CoreAcceleratorKeyEventType.SystemKeyDown)
            && !args.KeyStatus.WasKeyDown)
        {
            bool isAltKeyPressed = args.KeyStatus.IsMenuKeyDown;
            (Element as MyPageView).MyPageView_KeyPressed(Element, new KeyEventArgs { IsAltKeyPressed = isAltKeyPressed, Key = args.VirtualKey.ToString() });
        }
    }
}
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyPageView : ContentPage
{
    public MyPageView()
    {
        InitializeComponent();
        this.Focus();
    }
    public void MyPageView_KeyPressed(object sender, KeyEventArgs e)
    {
        (this.BindingContext as MyPageViewModel).CommandOnKeyPress?.Execute(e);
        
    }
}