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