> 백엔드 개발 > C++ > C#에서 파일 확장자를 응용 프로그램과 연결하는 방법은 무엇입니까?

C#에서 파일 확장자를 응용 프로그램과 연결하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-19 23:41:14
원래의
847명이 탐색했습니다.

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

파일 확장자를 애플리케이션과 연결

파일 확장자를 애플리케이션과 연결하려면 HKEY_CLASSES_ROOT에 키를 추가하면 됩니다. 모든 운영 체제에서 작동하는 재사용 가능한 방법은 다음과 같습니다.

<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>
로그인 후 복사

이 메소드를 사용하려면 적절한 매개변수를 사용하여 호출하세요.

<code class="language-csharp">SetAssociation(".ucs", "UCS_Editor_File", Application.ExecutablePath, "UCS File"); </code>
로그인 후 복사

참고: "CurrentUser"를 사용하는 코드 조각은 regedit를 사용하여 동일한 작업을 수행하는 경우 작동하는 것처럼 보이지만 애플리케이션에서는 작동하지 않습니다. 이는 애플리케이션에 레지스트리를 수정하는 데 필요한 권한이 없을 수 있기 때문입니다. 관리자 권한으로 응용 프로그램을 실행하여 문제가 해결되는지 확인할 수 있습니다.

사용 예:

다음은 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>
로그인 후 복사

그런 다음 FileAssociations.EnsureAssociationsSet()을 호출하여 지정된 파일 확장자를 지정된 애플리케이션과 연결할 수 있습니다.

출력은 원본 이미지와 코드 형식을 유지하는 동시에 동의어에 가까운 대체 및 문장 구조 변형을 달성하기 위해 텍스트를 변경합니다.

위 내용은 C#에서 파일 확장자를 응용 프로그램과 연결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿