Determining the Default Application for Opening a File Type on Windows
Opening files with the appropriate default application is a common task for many applications. To achieve this in .NET Framework 2.0 using C#, you can utilize the System.Diagnostics.Process.Start method. However, this method requires the exact file extension to determine the default application.
To open files without a specific extension in the desired default application, you need to retrieve the application associated with the file type. While using the registry to determine this association is an unreliable approach, the Win32 API provides a more robust method.
The AssocQueryString function in the Shlwapi.dll library allows you to query the association for a specific file type. Using this function, you can determine the default command, executable, or other relevant information for the file type.
The sample usage demonstrates how to utilize AssocQueryString to obtain the command associated with a file extension:
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"); } } }
The above is the detailed content of How to Programmatically Determine the Default Application for Opening a File Type in Windows?. For more information, please follow other related articles on the PHP Chinese website!