如何判断修改键何时被按下/释放
问题描述:
我希望能够判断何时按下或释放了修改键(CNTRL或SHIFT)。基本上,用户可以按下一个修饰键来执行多个按键操作,我不想在操作被释放之前执行一个操作(想想带有CNTRL + X + S的emacs)。我试图用PreviewKeyUp和PreviewKeyDown做到这一点,但似乎处理普通的键而不是修饰符。我可以判断一旦我处于事件中时是否按下了修饰键,但我不知道修饰键是否在事件之间释放并重新按下。如何判断修改键何时被按下/释放
答
刚刚意识到存在Key.LeftShift等。因此,我可以在按下时设置一个标志,并在释放按键时检查该标志。
答
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
//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))
.....
答
最简单的方法就是这样做,只要你想得到哪些修饰符被按下。
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事件是这样的。
//这里我只是把移位的示例+ A
如果(e.Key == Key.A & & Keyboard.Modifiers == ModifierKeys.Shift)
{
// 做一点事。
}