public static bool TryGetKey(string keyName, string keyboardLayout, bool enUSOverride, out Key key, INativeMethods nativeMethods) { if (_keys.TryGetValue(keyName, out key)) { return(true); } keyboardLayout = keyboardLayout ?? KeyboardLayoutMap.GetCurrentLayout(nativeMethods); _ = Elite.Internal.KeyMappings.TryGetKey(keyName, keyboardLayout, enUSOverride, 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)); }
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); }