Как определить комбинации клавиш Control +, а не VirtualKey? - PullRequest
0 голосов
/ 25 января 2019

Я устанавливаю глобальные сочетания клавиш, работающие на отдельных страницах, например 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 + K, Ctrl + Shift + A как ярлыки.

CharacterReceived для захвата запятой, точки, плюс, минус как символы, но они не работают с Ctrl и Alt.

Последнее, Dispatcher_AcceleratorKey, чтобы проверить, нажата ли клавиша Alt.

1 Ответ

0 голосов
/ 28 января 2019

В настоящее время UWP не поддерживает регистрацию глобальной горячей клавиши, но вы можете ответить на ярлык окна во внутреннем приложении следующим образом:

Сначала зарегистрируйте события клавиши ускорения, используемые для горячих клавиш кнопок.

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;
            }
        }
    }
}

Для трех клавиш такихas 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;
            }
        }
    }
}
...