public static bool TryGetKey(string keyName, string keyboardLayout, out Key key, INativeMethods nativeMethods) { if (_keys.TryGetValue(keyName, out key)) { return(true); } _ = Elite.Internal.KeyMappings.TryGetKey(keyName, keyboardLayout, out var vk, nativeMethods); IntPtr hkl = KeyboardLayoutMap.GetKeyboardLayout(keyboardLayout, nativeMethods); var scanCode = nativeMethods.MapVirtualKeyEx((uint)vk, NativeMethods.MAPVK.VK_TO_VSC_EX, hkl); return(_scanCodes.TryGetValue(scanCode, out key)); }
private static IReadOnlyDictionary <char, VirtualKey> BuildMap(string keyboardLayout, INativeMethods nativeMethods) { var res = new Dictionary <char, VirtualKey>(); IntPtr hkl = KeyboardLayoutMap.GetKeyboardLayout(keyboardLayout, nativeMethods); foreach (var key in _oemKeys) { var c = (char)(nativeMethods.MapVirtualKeyEx((uint)key, MAPVK.VK_TO_CHAR, hkl) & 0x7fffffff); if (c != 0 && !res.ContainsKey(c)) { res.Add(c, key); } } return(res); }
public static bool TryGetKey(string keyboardLayout, char c, bool enUSOverride, out VirtualKey key, INativeMethods nativeMethods) { keyboardLayout = keyboardLayout ?? KeyboardLayoutMap.GetCurrentLayout(nativeMethods); if (!_layoutCache.TryGetValue(keyboardLayout, out var map)) { map = BuildMap(keyboardLayout, nativeMethods); _layoutCache[keyboardLayout] = map; } if (!enUSOverride) { return(map.TryGetValue(c, out key)); } // Elite:Dangerous won't recognize some keyboard layouts (at least, es-ES) // and treats them as en-US. Here we fix this behavior. _ = _enUSScanCodes.TryGetValue(c, out var scanCode); IntPtr hkl = KeyboardLayoutMap.GetKeyboardLayout(keyboardLayout, nativeMethods); key = (VirtualKey)nativeMethods.MapVirtualKeyEx(scanCode, MAPVK.VSC_TO_VK_EX, hkl); return(key != 0); }