Существуют ли какие-либо глобальные конструкции, которые я могу использовать всякий раз, когда мне нужно получить доступ к кнопкам Control, Shift, Alt? Например, внутри MouseDown
события TreeView
.
Если так, то как?
Существуют ли какие-либо глобальные конструкции, которые я могу использовать всякий раз, когда мне нужно получить доступ к кнопкам Control, Shift, Alt? Например, внутри MouseDown
события TreeView
.
Если так, то как?
Ответы:
Используйте класс Keyboard
. С помощью Keyboard.IsKeyDown
вы можете проверить, не работает ли Control, Shift, Alt.
Для смены:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Для управления:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Для Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Есть также:
// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{
}
Keyboard.Modifiers == ModifierKeys.Shift
оператор. Если вы хотите поймать клавишу Shift, но вам все равно, нажимаются ли одновременно другие модификаторы, используйте (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
синтаксис HasFlag или намного лучший вариантKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
показывает какNone
private bool IsShiftKey { get; set; }
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;
if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
{
e.Handled = true;
}
}
Вот как я справляюсь (используя PreviewKeyDown), скажем, мы ищем Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Может быть, кто-то может прояснить, почему я должен был использовать e.SystemKey, а не просто e.Key, возможно, из-за модификатора? но это сработало для меня безупречно при поиске модификатора + ключ.
а также:
если My.Computer.Keyboard.ShiftKeyDown, то ...
My.Computer.Keyboard.CtrlKeyDown
My.Computer.Keyboard.AltKeyDown
Частично заимствуя у @Josh, и несколько похож на @Krushik, а также ссылаясь на вопрос о разнице между KeyEventArgs.systemKey и KeyEventArgs.Key (отвечая, почему Джош должен использовать SystemKey); где с ключами-модификаторами (такими как Alt) e.Key возвращает Key.System, и, таким образом, «реальный» ключ находится в e.SystemKey.
Чтобы обойти это, сначала нужно получить «реальный» ключ, а затем выполнить ваше условие:
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
// Fetch the real key.
var key = e.Key == Key.System ? e.SystemKey : e.Key;
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
&& key == Key.Return)
{
// Execute your code.
}
}
(e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
вместо всего остального ...