2013-05-03 1 views
2

".abc"파일을 내 WPF 응용 프로그램에 연결하려고합니다.WPF 응용 프로그램 파일 연결 : DefaultIcon이 작동하지 않습니다.

은이 코드를 사용하여 연결을 추가

public class FileAssociation 
{ 
    static RegistryKey Root 
    { 
     get 
     { 
      return Registry.CurrentUser; 
     } 
    } 

    // Associate file extension with progID, description, icon and application 
    public static void Associate(string extension, 
      string progID, string description, string application) 
    { 
     Require.NotNullOrEmpty(extension, "extension"); 
     Require.NotNullOrEmpty(progID, "progID"); 
     Require.NotNullOrEmpty(application, "application"); 
     Require.NotNullOrEmpty(description, "description"); 

     Root.CreateSubKey(extension).SetValue("", progID); 

     using (var key = Root.CreateSubKey(progID)) 
     { 
      key.SetValue("", description); 

      key.CreateSubKey("DefaultIcon").SetValue("", ToShortPathName(application).Quote() + ",0"); 
      key.CreateSubKey(@"Shell\Open\Command").SetValue("", ToShortPathName(application).Quote() + " \"%1\""); 

      // Tell explorer the file association has been changed 
      SHChangeNotify(0x08000000, 0x0000, IntPtr.Zero, IntPtr.Zero); 
     } 
    } 

    // Return true if extension already associated in registry 
    public static bool IsAssociated(string extension) 
    { 
     return (Root.OpenSubKey(extension, false) != null); 
    } 

    [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2); 

    [DllImport("Kernel32.dll")] 
    private static extern uint GetShortPathName(string lpszLongPath, 
     [Out] StringBuilder lpszShortPath, uint cchBuffer); 

    // Return short path format of a file name 
    private static string ToShortPathName(string longName) 
    { 
     StringBuilder s = new StringBuilder(1000); 
     uint iSize = (uint)s.Capacity; 
     uint iRet = GetShortPathName(longName, s, iSize); 
     return s.ToString(); 
    } 
} 

참고 : 견적() 확장 방법은 "ABC"에 문자열 abc 방송을 만들기 위해 단지 사용된다.

이제 파일 연결이 정상적으로 작동합니다. 내 WPF 응용 프로그램을 열려면 ".abc"파일을 두 번 클릭하면됩니다.

그러나 DefaultIcon이 작동하지 않습니다.. DefaultIcon Registery 키는 "D:\path\to\MyWPFApp.exe",0으로 설정됩니다. 내 WPF 응용 프로그램의 응용 프로그램 아이콘이 속성 페이지의 아이콘으로 설정되어 있습니다 (MyWPFApp.exe의 아이콘이 이미 변경되었음을 알 수 있습니다). 뭐가 문제 야? 감사! BTW

: 나는 윈도우 8

답변

1

에 .NET 4를 사용하고 당신은 DefaultIcon 항목이 필요하지 않습니다. 첫 번째 아이콘은 기본적으로 사용됩니다.
그것을 제거하고 난 ToShortPathName (긴 이름 따옴표로 괜찮습니다)와 변화가 Root 재산 returns Registry.ClassesRoot 코드가 여기에 작동 제거하면 그것은 ^^

을 작동합니다.

+0

감사합니다. 나중에 답변을 찾았지만 여기에서 업데이트하는 것을 잊었습니다. 맞습니다. 문제는 Root 속성의 반환 값입니다. 제 경우에는 HKEY_CURRENT_USER가 아니라 HKEY_CURRENT_USER/Software/Classes 여야합니다 : p –