WPF 应用程序文件关联:DefaultIcon 不起作用

Posted

技术标签:

【中文标题】WPF 应用程序文件关联:DefaultIcon 不起作用【英文标题】:WPF application file association: DefaultIcon is not working 【发布时间】:2013-04-28 08:10:08 【问题描述】:

我想将“.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 的图标已更改)。怎么了?谢谢!

顺便说一句:我在 Windows 8 中使用 .NET 4

【问题讨论】:

【参考方案1】:

您不需要DefaultIcon 条目。默认使用第一个图标。 删除它,它应该可以工作 ^^ 如果我删除 ToShortPathName (带引号的长名称可以)和 更改Root 属性returns Registry.ClassesRoot 代码在这里工作。

【讨论】:

谢谢。后来我找到了答案,但忘记在这里更新了。你是对的,问题是 Root 属性的返回值。就我而言,它应该是 HKEY_CURRENT_USER/Software/Classes,而不是 HKEY_CURRENT_USER:p

以上是关于WPF 应用程序文件关联:DefaultIcon 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WPF 应用程序无法通过文件关联打开

Win32 使用 SetCurrentProcessExplicitAppUserModelID 关联多个进程 在任务栏合并 WPF 多进程窗口

WPF中checkBox关联一个Combox,设置Combox的IsEnable=False,过程中再True

如果我使用“打开方式”,C# WPF 应用程序会静默崩溃

WPF Toolkit AutoCompleteBox 实体类绑定 关键字自定义关联搜索匹配

有没有办法将命令与 WPF 工具包 DataGridHyperlinkColumn 相关联?