Windows でファイル タイプを開くためのデフォルト アプリケーションを決定する
適切なデフォルト アプリケーションでファイルを開くことは、多くのアプリケーションにとって共通のタスクです。 C# を使用して .NET Framework 2.0 でこれを実現するには、System.Diagnostics.Process.Start メソッドを利用できます。ただし、この方法では、デフォルトのアプリケーションを決定するために正確なファイル拡張子が必要です。
目的のデフォルト アプリケーションで特定の拡張子のないファイルを開くには、ファイルの種類に関連付けられたアプリケーションを取得する必要があります。レジストリを使用してこの関連付けを判断する方法は信頼性が低いですが、Win32 API はより堅牢な方法を提供します。
Shlwapi.dll ライブラリの AssocQueryString 関数を使用すると、特定のファイル タイプの関連付けをクエリできます。この関数を使用すると、ファイル タイプのデフォルトのコマンド、実行可能ファイル、またはその他の関連情報を決定できます。
使用例では、AssocQueryString を利用してファイル拡張子に関連付けられたコマンドを取得する方法を示します。
using System; using System.Runtime.InteropServices; namespace FileAssociation { class Program { [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)] public static extern uint AssocQueryString( AssocF flags, AssocStr str, string pszAssoc, string pszExtra, [Out] StringBuilder pszOut, ref uint pcchOut); public enum AssocF { None = 0x00000000, Init_NoRemapCLSID = 0x00000001, Init_ByExeName = 0x00000002, Open_ByExeName = 0x00000002, Init_DefaultToStar = 0x00000004, Init_DefaultToFolder = 0x00000008, NoUserSettings = 0x00000010, NoTruncate = 0x00000020, Verify = 0x00000040, RemapRunDll = 0x00000080, NoFixUps = 0x00000100, IgnoreBaseClass = 0x00000200, Init_IgnoreUnknown = 0x00000400, Init_Fixed_ProgId = 0x00000800, Is_Protocol = 0x00001000, Init_For_File = 0x00002000 } public enum AssocStr { Command = 1, Executable, FriendlyDocName, FriendlyAppName, NoOpen, ShellNewValue, DDECommand, DDEIfExec, DDEApplication, DDETopic, InfoTip, QuickTip, TileInfo, ContentType, DefaultIcon, ShellExtension, DropTarget, DelegateExecute, Supported_Uri_Protocols, ProgID, AppID, AppPublisher, AppIconReference, Max } public static string AssocQueryString(AssocStr association, string extension) { const int S_OK = 0x00000000; const int S_FALSE = 0x00000001; uint length = 0; uint ret = AssocQueryString(AssocF.None, association, extension, null, null, ref length); if (ret != S_FALSE) { throw new InvalidOperationException("Could not determine associated string"); } var sb = new StringBuilder((int)length); // (length - 1) will probably work too as the marshaller adds null termination ret = AssocQueryString(AssocF.None, association, extension, null, sb, ref length); if (ret != S_OK) { throw new InvalidOperationException("Could not determine associated string"); } return sb.ToString(); } public static void Main(string[] args) { string extension = ".txt"; string command = AssocQueryString(AssocStr.Command, extension); System.Diagnostics.Process.Start(command, "test.txt"); } } }
以上がWindows でファイルの種類を開くためのデフォルトのアプリケーションをプログラムで決定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。