【问题标题】:How to detect Control + not VirtualKey keyboard combinations?如何检测 Control + not VirtualKey 键盘组合?
【发布时间】:2019-06-19 16:40:39
【问题描述】:

我正在设置一个在单个页面上工作的全局键盘快捷键,例如 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 键。

【问题讨论】:

  • 有意从 VirtualKey 枚举中省略了这些键。它们是 OEM 键,键盘制造商可以将它们放在他们喜欢的任何地方。或者完全省略它们。世界上某个地方的用户必须首先按下特殊键才能获得角色的情况并不少见。这使他们在面向整个世界的框架中选择快捷键很糟糕。你仍然可以使用 CharacterReceived,你need this
  • 正如我上面所指出的,我正在使用 CharacterReceived 来捕获逗号、点、加号、减号键,但与 Ctrl 或 Alt 结合使用时,它们不会触发事件。就像任何特殊键(Ctrl、Alt 或 shift)阻止触发发生一样。可能是因为字符结果不是 CharaterReceived。

标签: c# uwp keyboard-shortcuts keyevent


【解决方案1】:

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

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

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

检测 Ctrl + VCtrl + 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;
            }
        }
    }
}

【讨论】:

  • 这是我目前得到的。我目前正在使用这 3 个注册事件,但目前不支持带有 Ctrl 或 Alt 或 Shift 组合的特殊字符。这就是我要问的,如何获得 Ctrl + Comma、Ctrl + Alt + Dot 和类似的组合。
  • 对于三个key,你也可以使用上面的解决方案添加一个交集条件shift.HasFlag(CoreVirtualKeyStates.Down)
猜你喜欢
  • 2016-09-30
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多