6

これは、ここでの私の質問の続きです。タイプ*.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オペレーティングシステムはexeファイルのバージョンリソースからアプリケーション名を自動的に抽出し、後で使用するために「MuiCache」と呼ばれるレジストリキーに保存します。MUICacheデータは、HKEY_CURRENT_USER \ Software \ Classes \ Local Settings \ Software \ Microsoft \ Windows \ Shell\MuiCacheに保存されます

ただし、アプリケーションが少なくとも1回実行されたことを保証することはできません。また、ファイルのバージョンリソースから直接desciptionキーを取得することもできますが、次のようなコマンドからアプリケーションパスを分割するのに問題があります。

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

名前情報を取得するにはどうすればよいですか?

私のコマンドのリストの下

  • "C:\ Windows \ System32 \ rundll32.exe \" C:\ Program Files \ Windows Photo Viewer \ PhotoViewer.dll \ "、ImageView_Fullscreen%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 \ ""
4

4 に答える 4

2

Amalのソリューションに基づいて構築すると、処理する必要のあるシナリオは2つだけです。

1)「C:\ Windows \ System32 \ rundll32.exe」で始まるもの2)その他すべて

大まかなものが必要な場合は、「C:\ Windows \ System32\rundll32.exe」に置き換えると空の文字列になります。「s」を空の文字列に置き換え、文字列を最初のスラッシュ(/)または%で終了してから、結果をトリミングします。

名前を付けたい.dllまたは.exeの名前が残ります(これはおそらくRegExを使用してもう少し優雅に行うことができ、より多くのシナリオを処理する必要がある場合、このソリューションはすぐに複雑になります) 。

次に、それをAmalのコードで実行すると、必要なものが得られるはずです。

于 2012-08-25T21:03:43.567 に答える
2

コマンドのリストがわかっている場合は、以下のコードを使用して説明を取得できます

 FileVersionInfo.GetVersionInfo(Path.Combine(Environment.SystemDirectory, "Notepad.exe"));
 FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.SystemDirectory + "\\Notepad.exe");


    // Print the file name and version number.
    Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' +
       "Version number: " + myFileVersionInfo.FileVersion);
于 2012-08-16T07:06:48.930 に答える
1

更新: 申し訳ありませんが、私はあなたの投稿を読み違えました。

これは、拡張子に基づいてデフォルトのアプリケーション名を探す場合にのみ役立ちます。progID に基づいていません。

public static class FileAssoc
{
    [DllImport("Shlwapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern uint AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra, [Out] StringBuilder sOut, [In][Out] ref uint nOut);

    [Flags]
    public enum AssocF
    {
        Init_NoRemapCLSID = 0x1,
        Init_ByExeName = 0x2,
        Open_ByExeName = 0x2,
        Init_DefaultToStar = 0x4,
        Init_DefaultToFolder = 0x8,
        NoUserSettings = 0x10,
        NoTruncate = 0x20,
        Verify = 0x40,
        RemapRunDll = 0x80,
        NoFixUps = 0x100,
        IgnoreBaseClass = 0x200
    }

    public enum AssocStr
    {
        Command = 1,
        Executable,
        FriendlyDocName,
        FriendlyAppName,
        NoOpen,
        ShellNewValue,
        DDECommand,
        DDEIfExec,
        DDEApplication,
        DDETopic
    }

    public static string GetApplicationName(string fileExtensionIncludingDot)
    {
        uint cOut = 0;
        if (AssocQueryString(AssocF.Verify, AssocStr.FriendlyAppName, fileExtensionIncludingDot, null, null, ref cOut) != 1)
            return null;
        StringBuilder pOut = new StringBuilder((int)cOut);
        if (AssocQueryString(AssocF.Verify, AssocStr.FriendlyAppName, fileExtensionIncludingDot, null, pOut, ref cOut) != 0)
            return null;
        return pOut.ToString();
    }
}

こんな感じで使えます

string applicationName = FileAssoc.GetApplicationName(".docx");
// results in "Microsoft Office Word"
于 2012-08-28T11:16:38.670 に答える