Пересоздать (перестроить) кеш иконок Windows, так, как это делала Microangelo On Display:

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
#define NO_WIN32_LEAN_AND_MEAN #include <string> #include <shlobj.h> #include <tchar.h> #include <registry.hpp> #include <sstream> #define SSTR( x ) static_cast< std::ostringstream & >( \ ( std::ostringstream() << std::dec << x ) ).str() const std::string keyWindowMetrics = "Control Panel\\Desktop\\WindowMetrics\\"; std::string paramShellIconSize = "Shell Icon Size"; bool regWriteString(HKEY rootKey, std::string Key, std::string paramName, std::string Value) { bool ret = false; TRegistry *reg = new TRegistry(KEY_WRITE); try { reg->RootKey = rootKey; reg->OpenKey(Key.c_str(), true); reg->WriteString(paramName.c_str(), Value.c_str()); reg->CloseKey(); } __finally { delete reg; } return ret; } std::string regReadString(HKEY rootKey, std::string Key, std::string paramName) { std::string ret; TRegistry *reg = new TRegistry(KEY_READ); try { reg->RootKey = rootKey; if(reg->OpenKeyReadOnly(Key.c_str())) ret = reg->ReadString(paramName.c_str()).c_str(); reg->CloseKey(); } __finally { delete reg; } return ret; } std::string WindowsDir() { char buffer[255]; GetWindowsDirectory(buffer, sizeof(buffer)); return buffer; } static BOOL _stdcall PASCAL UpdateAllWindowsCallback(HWND WHandle, void *Parm) // Parm Pointer { SendMessage(WHandle, WM_SETTINGCHANGE, 0, 0); return true; } void _stdcall UpdateAllWindows() { EnumWindows((int (__stdcall *)())UpdateAllWindowsCallback, WM_SETTINGCHANGE); } std::string GetIconCacheFile() { TCHAR winDir[MAX_PATH]; SHGetSpecialFolderPath(0, winDir, CSIDL_WINDOWS, false); AnsiString aStr_winDir = winDir; AnsiString s_winDir = aStr_winDir + "ShellIconCache"; return s_winDir.c_str(); } void DeleteIconCache() { std::string sfile; sfile = GetIconCacheFile(); if(FileExists(sfile.c_str())) { if (!DeleteFile(sfile.c_str())) ShowMessage("Can not erase file!"); // Can not erase file [sfile] } ////////////////////////////////////////////////////////////////////////////////////// // Здесь необходимо проверить, необходима ли перезагрузка ОС ////////////////////////////////////////////////////////////////////////////////////// } bool RefreshActiveDesktop() { TGUID CLSID_ActiveDesktop = StringToGUID("{75048700-EF1F-11D0-9888-006097DEACF9}"); //IActiveDesktop ActiveDesktop; HRESULT hr; IActiveDesktop* pIAD; try { // Вместо Borland-овской функции CreateComObject(CLSID_ActiveDesktop) используем CoCreateInstance(ShlObj::CLSID_ActiveDesktop) // 1. Инициализация библиотеки COM (заставляем Windows загрузить библиотеки DLL). CoInitialize(NULL); // Создаем COM-объект, используя CO-класс Active Desktop, поставляемый оболочкой. // Четвертый параметр сообщает COM какой именно интерфейс нам нужен (IActiveDesktop). hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&pIAD); // ???? | CLSCTX_LOCAL_SERVER, ???? if (SUCCEEDED(hr)) { // Если COM-объект был создан, то вызываем его метод hr = pIAD->ApplyChanges(AD_APPLY_ALL || AD_APPLY_FORCE); // ActiveDesktop = CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop; // ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE); } } catch(...) { // Exception // cout << _T("CoCreateInstance() failed.") << endl return false; } // __finally { // Освобождаем интерфейс. pIAD->Release(); // Разинициализируем библиотеку COM CoUninitialize(); return true; } } void RefreshDesktop() { HWND Hwnd; bool fl; fl = RefreshActiveDesktop(); if (!fl) { Hwnd = FindWindow("Progman", "Program Manager"); if (Hwnd != 0) SendMessage(Hwnd, WM_COMMAND, 0xA065, 0); else UpdateAllWindows; } } void RebuildIconCache() { std::string news, olds; int sz; // Changing cursor to clock - StartWait(); try { DeleteFile(GetIconCacheFile().c_str()); olds = regReadString(HKEY_CURRENT_USER, keyWindowMetrics, paramShellIconSize); sz = StrToIntDef(olds.c_str(), 32); ++sz; news = SSTR(sz); regWriteString(HKEY_CURRENT_USER, keyWindowMetrics, paramShellIconSize, news); UpdateAllWindows(); if(olds == "") olds = "32"; regWriteString(HKEY_CURRENT_USER, keyWindowMetrics, paramShellIconSize, olds); UpdateAllWindows(); RefreshDesktop(); } catch(...) { } // StopWait(); } |
