Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengaitkan Sambungan Fail dengan Aplikasi dalam C#?

Bagaimana untuk Mengaitkan Sambungan Fail dengan Aplikasi dalam C#?

Barbara Streisand
Barbara Streisandasal
2025-01-19 23:41:14852semak imbas

How to Associate a File Extension with an Application in C#?

Kaitkan sambungan fail dengan aplikasi

Untuk mengaitkan sambungan fail dengan aplikasi, anda boleh menambah kunci pada HKEY_CLASSES_ROOT. Berikut ialah kaedah boleh guna semula yang berfungsi pada mana-mana sistem pengendalian:

<code class="language-csharp">public static void SetAssociation(string Extension, string KeyName, string OpenWith, string FileDescription)
{
    RegistryKey BaseKey;
    RegistryKey OpenMethod;
    RegistryKey Shell;
    RegistryKey CurrentUser;

    BaseKey = Registry.ClassesRoot.CreateSubKey(Extension);
    BaseKey.SetValue("", KeyName);

    OpenMethod = Registry.ClassesRoot.CreateSubKey(KeyName);
    OpenMethod.SetValue("", FileDescription);
    OpenMethod.CreateSubKey("DefaultIcon").SetValue("", "\"" + OpenWith + "\",0");
    Shell = OpenMethod.CreateSubKey("Shell");
    Shell.CreateSubKey("edit").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
    Shell.CreateSubKey("open").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
    BaseKey.Close();
    OpenMethod.Close();
    Shell.Close();

    CurrentUser = Registry.CurrentUser.CreateSubKey(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + Extension);
    CurrentUser = CurrentUser.OpenSubKey("UserChoice", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
    CurrentUser.SetValue("Progid", KeyName, RegistryValueKind.String);
    CurrentUser.Close();
}</code>

Untuk menggunakan kaedah ini, anda memanggilnya dengan parameter yang sesuai:

<code class="language-csharp">SetAssociation(".ucs", "UCS_Editor_File", Application.ExecutablePath, "UCS File"); </code>

NOTA: Coretan kod menggunakan "CurrentUser" nampaknya berfungsi jika anda melakukan perkara yang sama menggunakan regedit, tetapi tidak dengan aplikasi anda. Ini kerana aplikasi anda mungkin tidak mempunyai kebenaran yang diperlukan untuk mengubah suai pendaftaran. Anda boleh cuba menjalankan aplikasi sebagai pentadbir untuk melihat sama ada ia menyelesaikan isu tersebut.

Contoh penggunaan:

Berikut ialah contoh lengkap cara menggunakan kaedah SetAssociation:

<code class="language-csharp">public class FileAssociation
{
    public string Extension { get; set; }
    public string ProgId { get; set; }
    public string FileTypeDescription { get; set; }
    public string ExecutableFilePath { get; set; }
}

public class FileAssociations
{
    // 更新注册表后,需要刷新资源管理器窗口
    [System.Runtime.InteropServices.DllImport("Shell32.dll")]
    private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);

    private const int SHCNE_ASSOCCHANGED = 0x8000000;
    private const int SHCNF_FLUSH = 0x1000;

    public static void EnsureAssociationsSet()
    {
        var filePath = Process.GetCurrentProcess().MainModule.FileName;
        EnsureAssociationsSet(
            new FileAssociation
            {
                Extension = ".ucs",
                ProgId = "UCS_Editor_File",
                FileTypeDescription = "UCS File",
                ExecutableFilePath = filePath
            });
    }

    public static void EnsureAssociationsSet(params FileAssociation[] associations)
    {
        bool madeChanges = false;
        foreach (var association in associations)
        {
            madeChanges |= SetAssociation(
                association.Extension,
                association.ProgId,
                association.FileTypeDescription,
                association.ExecutableFilePath);
        }

        if (madeChanges)
        {
            SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
        }
    }

    public static bool SetAssociation(string extension, string progId, string fileTypeDescription, string applicationFilePath)
    {
        bool madeChanges = false;
        madeChanges |= SetKeyDefaultValue(@"Software\Classes\" + extension, progId);
        madeChanges |= SetKeyDefaultValue(@"Software\Classes\" + progId, fileTypeDescription);
        madeChanges |= SetKeyDefaultValue($@"Software\Classes\{progId}\shell\open\command", "\"" + applicationFilePath + "\" \"%1\"");
        return madeChanges;
    }

    private static bool SetKeyDefaultValue(string keyPath, string value)
    {
        using (var key = Registry.CurrentUser.CreateSubKey(keyPath))
        {
            if (key.GetValue(null) as string != value)
            {
                key.SetValue(null, value);
                return true;
            }
        }

        return false;
    }
}</code>

Anda kemudian boleh menghubungi FileAssociations.EnsureAssociationsSet() untuk mengaitkan sambungan fail yang ditentukan dengan aplikasi yang ditentukan.

Output mengekalkan pemformatan imej dan kod asal, sambil menyusun semula teks untuk mencapai penggantian hampir sinonim dan variasi struktur ayat. Makna keseluruhan kekal tidak berubah.

Atas ialah kandungan terperinci Bagaimana untuk Mengaitkan Sambungan Fail dengan Aplikasi dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn