Ассоциация файлов приложения WPF: DefaultIcon не работает

Я хочу связать файл ".abc" со своим приложением WPF.

Я добавляю ассоциацию, используя этот код:

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();
    }
}

Примечание. Метод расширения Quote () используется только для преобразования строки abc в «abc».

Теперь ассоциация файлов работает нормально! Я могу дважды щелкнуть файлы «.abc», чтобы открыть приложение WPF.

Но DefaultIcon не работает. Для ключа регистрации DefaultIcon установлено значение "D:\path\to\MyWPFApp.exe",0. Значок приложения моего приложения WPF установлен на значок на странице свойств (я вижу, что значок MyWPFApp.exe уже изменен). Что случилось? Спасибо!

Кстати: я использую .NET 4 в Windows 8


person Mouhong Lin    schedule 03.05.2013    source источник


Ответы (1)


Вам не нужна запись DefaultIcon. По умолчанию используется первый значок.
удалите его, и он должен работать ^^

Если я удалю ToShortPathName (длинное имя можно с кавычками) и изменю свойство Root returns Registry.ClassesRoot, код будет работать здесь.

person kux    schedule 23.05.2013
comment
Спасибо. Я нашел ответ позже, но забыл обновить его здесь. Вы правы, проблема в возвращаемом значении свойства Root. В моем случае это должен быть HKEY_CURRENT_USER / Software / Classes, а не HKEY_CURRENT_USER: p - person Mouhong Lin; 24.05.2013