如何检测Control +不是VirtualKey键盘组合?

时间:2019-01-25 20:10:56

标签: c# uwp keyboard-shortcuts keyevent

我正在设置在单个页面上工作的全局键盘快捷键,例如Ctrl + someKey用于执行某些操作,Ctrl + Alt + otherKey用于激活其他一些操作,依此类推。我有或多或少的Ctrl + VirtualKey工作代码(字母,数字等),但我还需要一些不在VirtualKey中的键,例如点,逗号,加号,减号,..

这些是注册的事件:

public Planner()
{
        this.InitializeComponent();

        CoreWindow.GetForCurrentThread().KeyDown += CoreWindow_KeyDown;
        CoreWindow.GetForCurrentThread().CharacterReceived += Planner_CharacterReceived;
        Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
}

我将KeyDown用于Ctrl + KCtrl + Shift + A就像快捷方式一样。

CharacterReceived可以捕获逗号,点号,加号,减号等字符,但不能与Ctrl和Alt一起使用。

最后,Dispatcher_AcceleratorKey检查是否按了Alt键。

1 个答案:

答案 0 :(得分:0)

当前,UWP不支持注册全局热键,但您可以在应用程序内部响应Windows快捷方式,如下所示。

首先,注册用于按钮热键的加速键事件。

public MainPage()
{
  this.InitializeComponent();
  // Register for accelerator key events used for button hotkeys
  Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
}

检测 Ctrl + V Ctrl + n

private void Dispatcher_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.V:
                    ViewOrders_Tapped(this, null);
                    break;
                case VirtualKey.N:
                    NewOrder_Tapped(this, null);
                    break;
            }
        }
    }
}

对于三个键,例如 Ctrl + Shift + V

private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
    if (args.EventType.ToString().Contains("Down"))
    {
        var ctrl = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
        var shift = Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift);
        if (ctrl.HasFlag(CoreVirtualKeyStates.Down) && shift.HasFlag(CoreVirtualKeyStates.Down))
        {
            switch (args.VirtualKey)
            {
                case VirtualKey.V:

                    break;
                case VirtualKey.N:

                    break;
            }
        }
    }
}