我希望能够判断修改键(Ctrl或Shift)何时被按下或释放。
基本上,用户可以在按下修饰键的情况下执行多个击键操作,而我不想在释放之前执行任何操作(类似于 Emacs 中的 Ctrl + X + S 操作)。
我曾试图使用 PreviewKeyUp 和 PreviewKeyDown 来实现此功能,但它似乎只处理普通键而不是修饰键。一旦进入事件,我就可以判断修改键是否被按下,但我无法判断修改键是否在事件之间被释放并重新按下。
我希望能够判断修改键(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;
}
if (e.Key == Key.A && Keyboard.Modifiers == ModifierKeys.Shift)
{
// Do something.
}