检测是不是在 KeyRoutedEventArgs 事件中按下了修饰键
Posted
技术标签:
【中文标题】检测是不是在 KeyRoutedEventArgs 事件中按下了修饰键【英文标题】:Detect if Modifier Key is Pressed in KeyRoutedEventArgs Event检测是否在 KeyRoutedEventArgs 事件中按下了修饰键 【发布时间】:2012-10-11 15:50:04 【问题描述】:我有以下代码:
public void tbSpeed_KeyDown(object sender, KeyRoutedEventArgs e)
e.Handled = !((e.Key >= 48 && e.Key <= 57) || (e.Key >= 96 && e.Key <= 105) || (e.Key == 109) || (e.Key == 189));
有什么方法可以检测是否按下了像 shift 这样的修饰键?
【问题讨论】:
【参考方案1】:使用GetKeyState。例如
var state = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
return (state & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
注意:对于 Alt,您将使用 VirtualKey.Menu。
【讨论】:
【参考方案2】:对于 Win10 UWP,我注意到 CTRL 和 SHIFT 键设置为锁定状态。所以我做了以下事情:
var shiftState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
var isShiftDown = shiftState != CoreVirtualKeyStates.None;
var isCtrlDown = ctrlState != CoreVirtualKeyStates.None;
【讨论】:
实际上使用HasFlag
方法会更好——CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift).HasFlag( CoreVirtualKeyStates.Down )
——因为这样可以避免键只被锁定而没有被实际按下的情况。【参考方案3】:
你可以试试下面的代码
CoreVirtualKeyStates controlKeyState = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
var ctrl = (controlKeyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
CoreVirtualKeyStates shiftKeyState = Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift);
var shift = (shiftKeyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
【讨论】:
【参考方案4】:Bitwise AND
带有Shift
键的键盘的Modifiers
属性-
bool isShiftKeyPressed = (Keyboard.Modifiers & ModifierKeys.Shift)
== ModifierKeys.Shift;
也试试这个-
bool isShiftKeyPressed = (ModifierKeys & Keys.Shift) == Keys.Shift;
或
Control.ModifierKeys == Keys.Shift
【讨论】:
我讨厌那些含糊不清的 cmets。 @Elmo 应该说的是,除了Keyboard
类在 UWP 下不可用之外,该代码非常好。以上是关于检测是不是在 KeyRoutedEventArgs 事件中按下了修饰键的主要内容,如果未能解决你的问题,请参考以下文章
如何检测是不是在语音到文本(Unity IBM Watson sdk)中完成了句子检测?