C# - Window.Current.CoreWindow.GetKeyState 没有按预期工作

Fáb*_*par 2 c# uwp

我正在使用 C# 开发一个简单的通用 Windows 应用程序。我有一个RichEditBox,在使用Control+I组合键时发现了一个奇怪的行为,由于某种原因插入了一个Tab(这是预期的吗?)。因为我想要组合键来切换斜体字体样式,所以我认为最好的方法是通过 KeyDown 事件。所以,这是我的代码:

    private void richbox_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        System.Diagnostics.Debug.Write("\nKeyDown : " + e.Key.ToString());
        if (e.Key == VirtualKey.Tab)
        {
            richbox.Document.Selection.TypeText("\t");
            e.Handled = true;
        }
        else if (Window.Current.CoreWindow.GetKeyState(VirtualKey.Control) == Windows.UI.Core.CoreVirtualKeyStates.Down)
        {
            //If Control is pressed down, check if current key is B,I,U...
            System.Diagnostics.Debug.Write(" => Control is down!");
            switch (e.OriginalKey)
            {
                case VirtualKey.B:
                    toogleBold();
                    e.Handled = true;
                    break;
                case VirtualKey.I:
                    e.Handled = true;
                    toogleItalic(); 
                    break;
                case VirtualKey.U:
                    toogleUnderline();
                    e.Handled = true;
                    break;
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我按下 Control 键时,Else If上的条件并不总是正确的。我想了解为什么以及我能做些什么来解决它。如果我运行代码并按几次控制键,则输出如下:

KeyDown:控制 => 控制已关闭!

KeyDown:控制

KeyDown:控制 => 控制已关闭!

KeyDown:控制

...

提前致谢 :)

Mar*_*und 5

我尝试了您的代码并使用调试器输出来查看在这些情况下 Ctrl 的实际状态:

var state = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
Debug.WriteLine(state);
Run Code Online (Sandbox Code Playgroud)

我发现你第二次按下这个键时,它的状态不是Down,而是Down|Locked,更具体地说Windows.UI.Core.CoreVirtualKeyStates.Down | Windows.UI.Core.CoreVirtualKeyStates.Locked。原来CoreVirtualKeyStates是一个标志枚举,它可以同时具有多个值。在这种情况下,您正在与==这进行比较,这意味着您没有匹配。您可以先使用该HasFlag方法或按位 AND ( &) 来获得正确的值,然后进行比较,您就可以开始了!

这意味着:

else if ( Window.Current.CoreWindow.GetKeyState(VirtualKey.Control).
             HasFlag( CoreVirtualKeyStates.Down ) )
{
    //rest of the code
}
Run Code Online (Sandbox Code Playgroud)

或这个:

else if ( 
  ( Window.Current.CoreWindow.GetKeyState(VirtualKey.Control) &
    Windows.UI.Core.CoreVirtualKeyStates.Down )
    == CoreVirtualKeyStates.Down )
{ 
    //rest of the code
}
Run Code Online (Sandbox Code Playgroud)