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));
        }
Exemple #2
0
        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);
        }