public static bool ReadKey(ILogger logger, KeyAction key) { if (string.IsNullOrEmpty(key.Key)) { logger.LogError($"You must specify either 'Key' (ConsoleKey value) or 'KeyName' (ConsoleKey enum name) for { key.Name}"); return(false); } if (KeyMapping.ContainsKey(key.Key)) { key.ConsoleKey = KeyMapping[key.Key]; } else { var consoleKey = consoleKeys.FirstOrDefault(k => k.ToString() == key.Key); if (consoleKey == 0) { logger.LogError($"You must specify a valid 'KeyName' (ConsoleKey enum name) for { key.Name}"); return(false); } key.ConsoleKey = consoleKey; } if (!string.IsNullOrEmpty(key.Name)) { logger.LogInformation($"[{key.Name}] uses \"{key.Key}\" -> {key.ConsoleKey}"); } return(true); }
public static IHardwareKeyMappingTarget ConvertPressedKey(KeyEventArgs keyEventArgs, KeyboardDevice keyboardDevice) { var pressedKey = keyEventArgs.Key; // To be more precise, that's the key that has been pressed and is now released var otherKeysPressed = EnumExtensions.GetValues <Key>() .Where(key => key != Key.None) .Where(key => (keyboardDevice.GetKeyStates(key) & KeyStates.Down) != 0) .ToList(); var modifierKeys = otherKeysPressed.Where(ModifierKeys.ContainsKey).ToList(); // Only valid if key is known! var valid = KeyMapping.ContainsKey(pressedKey); if (!valid) { return(null); } // Ignore other regular keys, but take into account modifiers var modifiers = modifierKeys .Select(key => ModifierKeys[key]) .Aggregate(Modifier.None, (mod, acc) => mod | acc); var pressedConvertedKey = new HardwareKeyMappingTarget(KeyMapping[pressedKey], modifiers); return(pressedConvertedKey); }