Ответ 1
Хитрость заключается в использовании свойства SystemKey, если < Свойству i1 > установлено значение Key.System
:
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
// The text box grabs all input.
e.Handled = true;
// Fetch the actual shortcut key.
Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
// Ignore modifier keys.
if (key == Key.LeftShift || key == Key.RightShift
|| key == Key.LeftCtrl || key == Key.RightCtrl
|| key == Key.LeftAlt || key == Key.RightAlt
|| key == Key.LWin || key == Key.RWin) {
return;
}
// Build the shortcut key name.
StringBuilder shortcutText = new StringBuilder();
if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) {
shortcutText.Append("Ctrl+");
}
if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) {
shortcutText.Append("Shift+");
}
if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) {
shortcutText.Append("Alt+");
}
shortcutText.Append(key.ToString());
// Update the text box.
_ShortcutTextBox.Text = shortcutText.ToString();
}
Я добавил левый и правый клавиши Windows
в список модификаторов, потому что они иногда появлялись в имени клавиши быстрого вызова, когда сложная комбинация клавиш (Ctrl+Shift+Alt
) была введена из сеанса сервера терминалов. Они никогда не присутствуют в Keyboard.Modifiers
, хотя, поскольку они зарезервированы для глобальных ярлыков, поэтому я не обрабатываю их там.
Я также использовал StringBuilder, чтобы избежать создания слишком большого количества экземпляров string
.
Это решение работает с любой комбинацией клавиш, кроме Shift+Alt
(в этом случае модификатор Alt
не отображается). Это может быть артефактом моей среды сервера терминалов, поэтому ваш пробег может отличаться.
Наконец, я добавил в окно меню _File
, чтобы увидеть, что произойдет, и ярлык Alt+F
будет эффективно захвачен текстовым полем до того, как он достигнет меню, которое, кажется, вам нужно.