首頁 > 後端開發 > C++ > 如何以程式設計方式確定在 Windows 中開啟檔案類型的預設應用程式?

如何以程式設計方式確定在 Windows 中開啟檔案類型的預設應用程式?

Susan Sarandon
發布: 2025-01-05 01:26:40
原創
688 人瀏覽過

How to Programmatically Determine the Default Application for Opening a File Type in Windows?

確定在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板