2

Windows マシンで、どのアプリケーションが特定の拡張子のファイルを開くかをプログラムで調べる方法はありますか? .PDF ファイルを開く原因となっているアプリケーションをプログラムで調べたいとします。(C# または VB.NET コードを持っているかどうかは気にしません)

4

3 に答える 3

3

さて、次の位置でレジストリを調べることから始めます。

HKEY_Current_User\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts.pdf\OpenWithList

そのタイプのファイルを開くために使用されるプログラムを指すa以降の1 つ以上のキーがあります。

using Microsoft.Win32;
var key = Registry.CurrentUser
    .OpenSubKey("Software")
    .OpenSubKey("Microsoft")
    .OpenSubKey("Windows")
    .OpenSubKey("CurrentVersion")
    .OpenSubKey("Explorer")
    .OpenSubKey("FileExts")
    .OpenSubKey(".doc")
    .OpenSubKey("OpenWithList");

var firstProgram = key.GetValue("a"); // E.g. Winword.exe

key への代入を null チェックのあるいくつかのステートメントに分割したい場合があります ;-)

お役に立てれば!

于 2012-07-20T20:45:59.797 に答える
3

コマンドライン コマンド ASSOC はファイルの関連付けを検出し、コマンド FTYPE はそれらに割り当てられたアクションを検出します。

C:\> assoc .docx
.docx=Word.Document.12

C:\> ftype Word.Document.12
Word.Document.12="C:\Program Files (x86)\Microsoft Office\Office12\WINWORD.EXE" /n /dde

おそらく、任意のスクリプトからプログラムで呼び出すことができます。

C# から、次のようなことをしたいと思うでしょう:

private string ShellCommand(string command)  
{
  var psi = new ProcessStartInfo("cmd", "/c " + command) {
    RedirectStandardOutput = true,
    CreateNoWindow = true
  };
  var p = Process.Start(psi);
  return p.StandardOutput.ReadToEnd();
}

private string FindDefaultProgram(string extension)
{
   assoc = ShellCommand("assoc " + extension).Split('=')[1];
   program = ShellCommand("ftype " + assoc).Split('=')[1];
   return program;
}

これについてはまだテストしていないので、一粒の塩で考えてください。ただし、これで正しい軌道に乗るはずです。

于 2012-07-20T20:35:07.423 に答える
2

コードは提供しませんが、この情報がどこに保存されているかをお伝えします – 残りの部分はご自身で判断してください :)

そのため、すべてのデータはレジストリ内のHKEY_CLASSES_ROOT. 例として、デフォルト値として含まれる.pdfキーがあります(少なくとも私のセットアップでは)。.pdfAcroExch.Document

ここでもHKEY_CLASSES_ROOTキーがあり、そのキーには値としてAcroExch.Document\Shell\Open\Command含ま"C:\Program Files (x86)\Adobe\Acrobat 8.0\Acrobat\Acrobat.exe" "%1"れています。そして、それが私のコンピューターでPDFファイルを開くために使用されているものです。

于 2012-07-20T20:36:02.727 に答える