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

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

Linda Hamilton
풀어 주다: 2025-01-19 23:31:13
원래의
406명이 탐색했습니다.

How to Reliably Associate File Extensions with Applications in C#?

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

문제:

소프트웨어 개발자로서 사용자가 애플리케이션을 특정 파일 형식에 대한 기본 편집기로 설정할 수 있도록 합니다. 그러나 현재 방법이 제대로 작동하지 않는 것 같습니다.

응답:

다음과 같은 경우 제공된 방법에 문제가 발생할 수 있습니다.

  • 귀하의 애플리케이션이 상승된 권한으로 실행되고 있지 않습니다.
  • 귀하의 방법이 아래에 필요한 레지스트리 키를 올바르게 설정하지 않았습니다. HKEY_CURRENT_USER.

이러한 문제를 해결하는 대체 구현:

public class FileAssociation
{
    public string Extension { get; set; }
    public string ProgId { get; set; }
    public string FileTypeDescription { get; set; }
    public string ExecutableFilePath { get; set; }
}

public static class FileAssociations
{
    static FileAssociations()
    {
        SetDllDirectory(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName));
    }

    [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
    extern static int SHChangeNotify(int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2);
    const int SHCNE_ASSOCCHANGED = 0x8000000;
    const int SHCNF_FLUSH = 0x1000;

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

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

    public static bool SetAssociation(string extension, string progId, string fileTypeDescription, string applicationFilePath)
    {
        var changesMade = false;
        using (RegistryKey extensionKey = RegistryKey.CurrentUser.CreateSubKey($@"Software\Classes\{extension}"))
        {
            changesMade |= SetKeyDefaultValue(extensionKey, null, progId);
        }

        using (RegistryKey progIdKey = RegistryKey.CurrentUser.CreateSubKey($@"Software\Classes\{progId}"))
        {
            changesMade |= SetKeyDefaultValue(progIdKey, null, fileTypeDescription);
            changesMade |= SetKeyDefaultValue(progIdKey.CreateSubKey(@"shell\open\command"), null, $"\"{applicationFilePath}\" \"%1\"");
        }

        return changesMade;
    }

    static bool SetKeyDefaultValue(RegistryKey key, string name, object value)
    {
        var originalValue = key.GetValue(name);
        if (value == null)
        {
            if (originalValue == null)
                return false;
            key.DeleteValue(name);
            return true;
        }

        if (value is string && originalValue is string && (string)value == (string)originalValue)
            return false;

        key.SetValue(name, value);
        return true;
    }
}
로그인 후 복사

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

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