C# - Window.Current.CoreWindow.GetKeyState无法按预期工作

时间:2017-06-27 16:03:33

标签: c# uwp

我正在使用C#开发一个简单的通用Windows应用程序。我有一个 RichEditBox ,当我使用 Control + I 组合键时,我发现了一个奇怪的行为,由于某些原因,它会插入标签这是预期的吗?)。因为我希望组合键切换Italic字体样式,我认为最好的方法是通过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;
            }

        }
    }

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

  

KeyDown:Control =>控制力下降了!

     

KeyDown:Control

     

KeyDown:Control =>控制力下降了!

     

KeyDown:Control

     

...

提前致谢:)

1 个答案:

答案 0 :(得分:2)

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

var state = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
Debug.WriteLine(state);

我发现第二次按键时,其状态不是 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
}

或者这个:

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