C# 如何检测控件+;不是VirtualKey键盘组合?

C# 如何检测控件+;不是VirtualKey键盘组合?,c#,uwp,keyboard-shortcuts,keyevent,C#,Uwp,Keyboard Shortcuts,Keyevent,我正在设置一个在单个页面上工作的全局键盘快捷键,比如Ctrl+someKey来做一些事情,Ctrl+Alt+otherKey来激活一些其他事情等等。我对Ctrl+VirtualKey(字母、数字等)有或多或少的工作代码,但我还需要一些不在VirtualKey中的键,如点、逗号、加号、减号等 以下是已注册的事件: public Planner() { this.InitializeComponent(); CoreWindow.GetForCurrentThrea

我正在设置一个在单个页面上工作的全局键盘快捷键,比如
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;
}
我对
Ctrl+K
使用
KeyDown
Ctrl+Shift+A
类似快捷键

CharacterReceived
捕获逗号、点、加号、减号等字符,但它们不能与Ctrl和Alt一起使用


最后,
Dispatcher\u Acceleratoryy
检查是否按下了Alt键。

目前,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

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


这些键是故意从VirtualKey枚举中省略的。它们是OEM键,键盘制造商可以把它们放在任何他们喜欢的地方。或者完全忽略它们。世界上某个地方的用户必须先按一个特殊的键才能获得角色,这种情况并不少见。这使得他们在面向全世界的框架中选择快捷键时很糟糕。你仍然可以使用CharacterReceived,你。正如我上面指出的,我使用CharacterReceived来捕获逗号、点、加号、减号键,但与Ctrl或Alt组合使用时,它们不会触发事件。就像任何特殊的键(Ctrl、Alt或shift)都会阻止触发器的发生。也许是因为角色的结果,它不是一个被接受的角色。这就是我到目前为止得到的。我目前正在使用这3个已注册事件,但此时不支持使用Ctrl、Alt或Shift组合的特殊字符。这就是我要问的,如何获得Ctrl+逗号、Ctrl+Alt+Dot等组合。对于三个键,您还可以使用上面的解决方案添加一个相交条件
shift.HasFlag(coreVirtualKeyState.Down)
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;
            }
        }
    }
}
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;
            }
        }
    }
}