在通用Windows应用程序中获取键盘状态

13

我想检测Windows应用程序中的键盘组合键(例如Control-A)。KeyDown 事件处理程序包含有关最后按下的键的信息。但是,如何找出是否同时按下了 Control 键?


通常情况下,您会执行 KeyPressed == Control | A - kevintjuh93
@KevinKal 谢谢。但我试过了,只有 A - ispiro
控制键是系统关键,因此记录方式不同。我不确定如何完成,但这就是您看到的问题。 - rmn36
@rmn36 是的。在 WPF 中,我们可以使用 Keyboard 类来实现。不幸的是,在 UWP 中这是无法访问的。 - ispiro
Windows Hooks?抱歉,我从未在UWP中工作过。 - rmn36
2个回答

23

您可以使用 CoreVirtualKeyStates.HasFlag(CoreVirtualKeyStates.Down) 来判断是否按下了 Ctrl 键,像这样 -

Window.Current.CoreWindow.KeyDown += (s, e) =>
{
    var ctrl = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
    if (ctrl.HasFlag(CoreVirtualKeyStates.Down) && e.VirtualKey == VirtualKey.A)
    {
        // do your stuff
    }
};

1
如果我正确理解了您的问题,那么请订阅 Window.Current.CoreWindow.KeyDown 而不是您页面上的 KeyDown 事件,这就像我在回答中提到的那样。 - Justin XL
1
太好了!非常感谢! - ispiro
我们如何捕获功能键?我尝试使用CoreWindow.KeyDown和CoreWindow.CharacterReceived,但都没有起作用。我需要在CoreWindow级别上设置什么来捕获功能键吗? - Sudheer

8
您可以使用AcceleratorKeyActivated事件,无论焦点在哪里,它都将捕获该事件。
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;
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接