9

できればWin32APIを介して、ファイル拡張子に関連付けられているプログラムへのパスを取得したいと思います。

  1. 「プログラムから開く」メニュー項目に表示されるプログラムのリスト
  2. [プログラムから開く...]ダイアログで推奨されているように表示されるプログラムのリスト。

UPD:

マシンにoffice11とoffice12がインストールされているとすると、.xlsのデフォルトプログラムはoffice11です。HKEY_CLASSES_ROOT\Excel.Sheet.8 \ shell \ Open \ commandを見ると、office11 excel.exeへのパスがありますが、ファイルを右クリックして、[プログラムから開く]メニュー項目でoffice12を選択できます。では、この関連付けはどこに保存されますか?

私はC#を使用しています。

ありがとう。

4

3 に答える 3

14

私は小さなルーチンを書きました:

public IEnumerable<string> RecommendedPrograms(string ext)
{
  List<string> progs = new List<string>();

  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())
          progs.Add(rk.GetValue(c.ToString()).ToString());
      }
    }
  }

  using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"\OpenWithProgids"))
  {
    if (rk != null)
    {
      foreach (string item in rk.GetValueNames())
        progs.Add(item);
    }
    //TO DO: Convert ProgID to ProgramName, etc.
  }

  return progs;
  }

これはそのように呼ばれます:

foreach (string prog in RecommendedPrograms("vb"))
{
  MessageBox.Show(prog);
}
于 2011-07-17T12:14:55.273 に答える
3

システム上のファイルタイプをアプリケーションにプログラムで関連付けたいと思ったことがありますが、レジストリを自分で掘り下げるというアイデアが気に入らなかったでしょうか。もしそうなら、この記事とコードはあなたにぴったりです。

システムファイルの関連付け

于 2011-07-13T13:18:41.347 に答える
0

LarsTechによる方法を改善しました。これで、プログラムへのパスが返されます。

public List<string> RecommendedPrograms(string ext)
{
  //Search programs names:
  List<string> names = new List<string>();
  string baseKey = @"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." + ext;
  string s;

  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)
        {
          s = rk.GetValue(c.ToString()).ToString();
          if (s.ToLower().Contains(".exe"))
            names.Add(s);
        }
      }
    }
  }

  if (names.Count == 0)
    return names;

  //Search paths:
  List<string> paths = new List<string>();
  baseKey = @"Software\Classes\Applications\{0}\shell\open\command";

  foreach (string name in names)
    using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(String.Format(baseKey, name)))
    {
      if (rk != null)
      {
        s = rk.GetValue("").ToString();
        s = s.Substring(1, s.IndexOf("\"", 2) - 1); //remove quotes
        paths.Add(s);
      }
    }

  if (paths.Count > 0)
    return paths;

  //Search pathes for Windows XP:
  foreach (string name in names)
    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(String.Format(baseKey, name)))
    {
      if (rk != null)
      {
        s = rk.GetValue("").ToString();
        s = s.Substring(1, s.IndexOf("\"", 2) - 1); //remove quotes
        paths.Add(s);
      }
    }

  return paths;
}
于 2021-03-16T07:57:12.733 に答える