Windows マシンで、どのアプリケーションが特定の拡張子のファイルを開くかをプログラムで調べる方法はありますか? .PDF ファイルを開く原因となっているアプリケーションをプログラムで調べたいとします。(C# または VB.NET コードを持っているかどうかは気にしません)
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 チェックのあるいくつかのステートメントに分割したい場合があります ;-)
お役に立てれば!
コマンドライン コマンド ASSOC はファイルの関連付けを検出し、コマンド FTYPE はそれらに割り当てられたアクションを検出します。
C:\> assoc .docx
.docx=Word.Document.12C:\> 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;
}
これについてはまだテストしていないので、一粒の塩で考えてください。ただし、これで正しい軌道に乗るはずです。
コードは提供しませんが、この情報がどこに保存されているかをお伝えします – 残りの部分はご自身で判断してください :)
そのため、すべてのデータはレジストリ内のHKEY_CLASSES_ROOT
. 例として、デフォルト値として含まれる.pdf
キーがあります(少なくとも私のセットアップでは)。.pdf
AcroExch.Document
ここでもHKEY_CLASSES_ROOT
キーがあり、そのキーには値としてAcroExch.Document\Shell\Open\Command
含ま"C:\Program Files (x86)\Adobe\Acrobat 8.0\Acrobat\Acrobat.exe" "%1"
れています。そして、それが私のコンピューターでPDFファイルを開くために使用されているものです。