[英]How to tell when modifier keys are pressed/released
我希望能够知道何时按下或释放修改后的键( Ctrl或Shift )。
基本上,用户可以在按下修饰键的情况下执行多次击键,并且在释放之前我不想执行操作(想想Emacs的Ctrl + X + S )。
我试图用 PreviewKeyUp 和 PreviewKeyDown 来做到这一点,但这似乎处理普通键而不是修饰符。 一旦我在事件中,我就可以判断修改键是否被按下,但我无法判断修改键是否在事件之间被释放和重新按下。
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
// I just picked that key for a sample
case Key.Tab:
if (Keyboard.IsKeyDown(Key.LeftShift) ||
Keyboard.IsKeyDown(Key.RightShift))
{
DoMyStuff();
}
// Similar things for Ctrl:
if (Keyboard.IsKeyDown(Key.LeftCtrl) ||
Keyboard.IsKeyDown(Key.RightCtrl))
{
....
}
我刚刚意识到Key.LeftShift
等存在。 所以我可以在按下时设置一个标志,并在释放键时检查该标志。
最简单的方法是执行此操作,无论何时您想获取按下了哪些修饰符。
var kb = new Microsoft.VisualBasic.Devices.Keyboard();
var alt = kb.AltKeyDown;
var ctrl = kb.CtrlKeyDown;
var shift = kb.ShiftKeyDown;
你可以用它制作一个方法,所以它会更容易使用,就像这样:
using Microsoft.VisualBasic.Devices;
...
private static readonly Keyboard KEYBOARD = new Keyboard();
private static Keys GetPressedModifiers()
{
var mods = Keys.None;
if (KEYBOARD.AltKeyDown)
{
mods |= Keys.Alt;
}
if (KEYBOARD.CtrlKeyDown)
{
mods |= Keys.Control;
}
if (KEYBOARD.ShiftKeyDown)
{
mods |= Keys.Shift;
}
return mods;
}
您可以在 KeyDown 或 PreviewKeydown 事件中执行类似操作。
在这里,我只是以Shift + A为例:
if (e.Key == Key.A && Keyboard.Modifiers == ModifierKeys.Shift)
{
// Do something.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.