public void ProcessValues(RegistryKey key)
        {
            _values.Clear();
            Errors.Clear();

            var currentKey = string.Empty;

            try
            {
                foreach (var registryKey in key.SubKeys) // subkeys of FileExts
                {
                    currentKey = registryKey.KeyName;

                    var oe = new List <string>();
                    var op = new List <string>();
                    var uc = "(UserChoice key not present)";

                    if (registryKey.SubKeys.Count == 0)
                    {
                        var progId = registryKey.Values.SingleOrDefault(t => t.ValueName == "Progid");
                        if (progId != null)
                        {
                            op.Add(progId.ValueData);
                        }
                        var vo1 = new ValuesOut(registryKey.KeyName, string.Join(", ", oe), string.Join(", ", op), uc);

                        _values.Add(vo1);
                        continue;
                    }


                    foreach (var subKey in registryKey.SubKeys) // subkey's subkeys
                    {
                        switch (subKey.KeyName)
                        {
                        case "OpenWithList":
                            // contains values with name == char and value data of an executable name
                            //there is an MRUList that contains the order the executables were selected

                            var mruList = subKey.Values.SingleOrDefault(t => t.ValueName == "MRUList");

                            if (mruList != null)
                            {
                                //foreach slot in MRU, get the value and append it to our oe variable

                                foreach (var mruPos in mruList.ValueData.ToCharArray())
                                {
                                    var exeName =
                                        subKey.Values.SingleOrDefault(t => t.ValueName == mruPos.ToString());

                                    if (exeName != null)
                                    {
                                        oe.Add(exeName.ValueData);
                                    }
                                    else
                                    {
                                        oe.Add($"(Executable name for MRU slot '{mruPos}' not found!)");
                                    }
                                }
                            }


                            break;

                        case "OpenWithProgids":
                            foreach (var proIdValue in subKey.Values)
                            {
                                op.Add(proIdValue.ValueName);
                            }
                            break;

                        case "UserChoice":
                            var progId = subKey.Values.SingleOrDefault(t => t.ValueName == "ProgId");
                            if (progId != null)
                            {
                                uc = progId.ValueData;
                            }
                            break;
                        }
                    }

                    //we have enough to add an entry

                    var vo = new ValuesOut(registryKey.KeyName, string.Join(", ", oe), string.Join(", ", op), uc);
                    vo.BatchKeyPath   = key.KeyPath;
                    vo.BatchValueName = "Multiple";

                    _values.Add(vo);
                }
            }
            catch (Exception ex)
            {
                Errors.Add($"Error processing FileExts subkey {currentKey}: {ex.Message}");
            }

            if (Errors.Count > 0)
            {
                AlertMessage = "Errors detected. See Errors information in lower right corner of plugin window";
            }
        }
        public void ProcessValues(RegistryKey key)
        {
            _values.Clear();
            Errors.Clear();

            var currentKey = string.Empty;

            try
            {
                foreach (var registryKey in key.SubKeys) // subkeys of FileExts
                {
                    currentKey = registryKey.KeyName;

                    var oe = new List<string>();
                    var op = new List<string>();
                    var uc = "(UserChoice key not present)";

                    if (registryKey.SubKeys.Count == 0)
                    {
                        var progId = registryKey.Values.SingleOrDefault(t => t.ValueName == "Progid");
                        if (progId != null)
                        {
                            op.Add(progId.ValueData);
                        }
                        var vo1 = new ValuesOut(registryKey.KeyName, string.Join(", ", oe), string.Join(", ", op), uc);

                        _values.Add(vo1);
                        continue;
                    }

                    foreach (var subKey in registryKey.SubKeys) // subkey's subkeys
                    {
                        switch (subKey.KeyName)
                        {
                            case "OpenWithList":
                                // contains values with name == char and value data of an executable name
                                //there is an MRUList that contains the order the executables were selected

                                var mruList = subKey.Values.SingleOrDefault(t => t.ValueName == "MRUList");

                                if (mruList != null)
                                {
                                    //foreach slot in MRU, get the value and append it to our oe variable

                                    foreach (var mruPos in mruList.ValueData.ToCharArray())
                                    {
                                        var exeName =
                                            subKey.Values.SingleOrDefault(t => t.ValueName == mruPos.ToString());

                                        if (exeName != null)
                                        {
                                            oe.Add(exeName.ValueData);
                                        }
                                        else
                                        {
                                            oe.Add($"(Executable name for MRU slot '{mruPos}' not found!)");
                                        }
                                    }
                                }

                                break;
                            case "OpenWithProgids":
                                foreach (var proIdValue in subKey.Values)
                                {
                                    op.Add(proIdValue.ValueName);
                                }
                                break;
                            case "UserChoice":
                                var progId = subKey.Values.SingleOrDefault(t => t.ValueName == "ProgId");
                                if (progId != null)
                                {
                                    uc = progId.ValueData;
                                }
                                break;
                        }
                    }

                    //we have enough to add an entry

                    var vo = new ValuesOut(registryKey.KeyName, string.Join(", ", oe), string.Join(", ", op), uc);

                    _values.Add(vo);
                }
            }
            catch (Exception ex)
            {
                Errors.Add($"Error processing FileExts subkey {currentKey}: {ex.Message}");
            }

            if (Errors.Count > 0)
            {
                AlertMessage = "Errors detected. See Errors information in lower right corner of plugin window";
            }
        }