Как сделать, чтобы имя приложения отображалось в открытом -со списком?

Это продолжение моего вопроса здесь . Я создаю открытый список для типа *.bmp. В соответствии с ответами на этот вопрос я создал список открытых приложений из ключей реестра.

   public void RecommendedPrograms(string ext)
    {


        string baseKey = @"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." + ext;

        using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"\OpenWithList"))
        {
            if (rk != null)
            {
                string mruList = (string)rk.GetValue("MRUList");
                if (mruList != null)
                {
                    foreach (char c in mruList.ToString())
                    {
                        string str=rk.GetValue(c.ToString()).ToString();
                        if (!progs.Contains(str))
                        {
                            progs.Add(str);
                        }
                    }
                }
            }
        }

        using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"\OpenWithProgids"))
        {
            if (rk != null)
            {
                foreach (string item in rk.GetValueNames())
                    progs.Add(item);
            }
        }

        using (RegistryKey rk = Registry.ClassesRoot.OpenSubKey("." + ext + @"\OpenWithList"))
        {
            if (rk != null)
            {
                foreach (var item in rk.GetSubKeyNames())
                {
                    if (!progs.Contains(item))
                    {
                        progs.Add(item.ToString());
                    }
                }
            }
        }
        using (RegistryKey rk = Registry.ClassesRoot.OpenSubKey("." + ext + @"\OpenWithProgids"))
        {
            if (rk != null)
            {
                foreach (string item in rk.GetValueNames())
                {
                    if (!progs.Contains(item))
                    {
                        progs.Add(item);
                    }
                }
            }
        }

    }

Этот метод вернет список имен приложений, таких как

  • Paint.Picture
  • ehshell.exe
  • MSPaint.exe
  • ois.exe
  • VisualStudio.bmp.10.0
  • QuickTime.bmp

Это PrgId, и я могу получить команду, которую нужно выполнить, чтобы открыть конкретное приложение, из

      public string GetRegisteredApplication(string StrProgID)
    {
        // 
        //  Return registered application by file's extension
        // 
        RegistryKey oHKCR;
        RegistryKey oOpenCmd;
        string command;

        if (Environment.Is64BitOperatingSystem == true)
        {
            oHKCR = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.ClassesRoot, RegistryView.Registry64);
        }
        else
        {
            oHKCR = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.ClassesRoot, RegistryView.Registry32);
        }
        try
        {


            oOpenCmd = oHKCR.OpenSubKey(StrProgID + "\\shell\\open\\command");
            if (oOpenCmd == null)
            {
                oOpenCmd = oHKCR.OpenSubKey("\\Applications\\" + StrProgID + "\\shell\\open\\command");
            }
            if (oOpenCmd != null)
            {
                command = oOpenCmd.GetValue(null).ToString();
                oOpenCmd.Close();
            }
            else
            {
                return null;
            }
        }
        catch (Exception ex)
        {
            return null;
        }
        return command;
    }

Теперь, как мне получить имя приложения, которое должно отображаться в меню? Каждый раз, когда вы начинаете использовать новое приложение, операционная система Windows автоматически извлекает имя приложения из ресурса версии исполняемого файла и сохраняет его для последующего использования в разделе реестра, известном как «MuiCache». Данные MUICache хранятся в разделе HKEY _CURRENT _USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache

но мы не можем гарантировать, что приложение было запущено хотя бы один раз. Также мы можем напрямую получить ключ описания из ресурсов версии файла, но у меня есть некоторые проблемы с разделением пути приложения из таких команд, как

%SystemRoot%\System32\rundll32.exe "%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen %1

Как я могу получить информацию об имени?

Под списком моих команд

  • "C :\Windows\System32\rundll32.exe \"C :\Program Files\Windows Средство просмотра фотографий\PhotoViewer.dll\",ImageView _Полноэкранный режим %1"
  • "\"C :\Windows\eHome\ehshell.exe\" \"%1\""
  • "C :\PROGRA ~1\MIF5BA ~1\Office14\OIS.EXE /shellOpen \"%1\""
  • "\"C :\Program Files (x86 )\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe\"/dde"
  • "C :\Program Files (x86 )\QuickTime\PictureViewer.exe \"%1\""

6
задан Community 23 May 2017 в 11:53
поделиться