2009-11-18 103 views
3

一旦我安装完成安装我的应用程序的EXE的新版本,我想告诉浏览器使用新的exe文件的图标,其快捷方式。但是,我无法弄清楚如何做到这一点。如何让Windows资源管理器刷新其图标?

从网上阅读,它看起来像问题是,system image list是缓存旧版本的图标。我打过电话SHChangeNotifySHCNE_UPDATEIMAGE参数。我试过打电话SHUpdateImage。我甚至试过sledgehammer approach的广播WM_SETTINGCHANGE。似乎没有任何工作。

这是完全可能的,我只是在做一些错误。任何帮助,将不胜感激。

警告:非常难看的测试代码如下。

#if 1 
    // First attempt: using shell functions 
    wchar_t icon_path[MAX_PATH]; 
    int icon_index; 
    UINT icon_flags; 

    IShellFolder *desktop_folder; 
    IShellFolder *sub_folder; 
    IExtractIcon *extract_icon; 
    LPITEMIDLIST pidl; 

    SHGetDesktopFolder(&desktop_folder); 

    wchar_t *folder_path = L"C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\MyCompany\\"; 
    desktop_folder->ParseDisplayName(NULL, NULL, folder_path, NULL, &pidl, 
     NULL); 
    desktop_folder->BindToObject(pidl, NULL, IID_IShellFolder, 
     (void**) &sub_folder); 
    sub_folder->ParseDisplayName(NULL, NULL, L"MyApp.lnk", NULL, &pidl, 
     NULL); 

    sub_folder->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*) &pidl, 
     IID_IExtractIcon, NULL, (void**) &extract_icon); 

    extract_icon->GetIconLocation(0, icon_path, MAX_PATH, 
     &icon_index, &icon_flags); 

    SHFILEINFO sfi; 
    DWORD_PTR result = SHGetFileInfo(shortcut_path, 0, &sfi, sizeof(sfi), 
     SHGFI_SYSICONINDEX | SHGFI_LARGEICON); 
    SHUpdateImage(icon_path, icon_index, icon_flags, sfi.iIcon); 
    // sfi.iIcon should be correct, but we'll try both, just for fun... 
    SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, NULL, 
     (LPCVOID) icon_index); 
    SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, NULL, 
     (LPCVOID) sfi.iIcon); 
#else 
    // Second attempt: broadcasting a settings change 
    HKEY reg; 
    RegCreateKeyEx(HKEY_CURRENT_USER, 
     L"Control Panel\\Desktop\\WindowMetrics", 0, NULL, 0, 
     KEY_SET_VALUE, NULL, &reg, NULL); 
    DWORD value; 
    value = 33; 
    RegSetValueEx(reg, L"Shell Icon Size", 0, REG_DWORD, (BYTE*) &value, 
     sizeof(value)); 
    value = 32; 
    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 
     (int) L"WindowMetrics"); 
    RegSetValueEx(reg, L"Shell Icon Size", 0, REG_DWORD, (BYTE*) &value, 
     sizeof(value)); 
    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 
     (int) L"WindowMetrics"); 
#endif 
+0

你试过只是问好吗? (对不起,忍不住了;) – 2009-11-18 17:56:43

+0

@Dustin:让我试试。开始 - >运行 - >“资源管理器 - 刷新 - 我的图标 - 请”。 Explorer回复:“路径'--refresh-my-icons-please'不存在或不是目录。”不,没有工作。 – 2009-11-18 18:01:08

回答

2

你的大锤的方法是我见过的用来完成这件事的方法。尽管在你的代码的糟糕,“壳牌图标大小”值是REG_SZ,而不是一个REG_DWORD。总是VERIFY()API函数返回值...

相关问题