检测是不是在 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)中完成了句子检测?

如何检测ARP是不是被攻击

检测页面是不是在 JavaScript 中的 WKWebView 中加载

如何知道在opencv上是不是检测到颜色[重复]

检测用户是不是在 iTunes 商店中登录

检测输入元素是不是在 ReactJS 中聚焦