处理 UWP 应用程序中的替代键
本文关键字:UWP 应用程序 处理 | 更新日期: 2023-09-27 17:56:51
我在Window.Current.CoreWindow
上使用KeyDown和KeyUp处理程序来捕获UWP的VNC应用程序中的击键。 这很好用,但有一个例外:alt ( VirtualKey.Menu/LeftMenu/RightMenu
) 永远不会发送到我的应用程序。 此外,alt+letter 不会导致两者都不会发送到处理程序。
我假设这是因为某些加速器处理程序在到达 CoreWindow 之前正在吃掉这些事件。 有什么办法吗?
尝试使用 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);
}
}