Обновление значков в explorerе
От: Peter K.  
Дата: 05.02.02 19:12
Оценка:
Добрый вечер.
Как обновить значки explorere, подобно тому как это
делает Tweak UI компонент панели управления
по команде Rebuild Icons?
Некоторые утилиты делают то же самое.

Пробовал SystemParametersInfo(SPI_SETICONS, 0, NULL, SPIF_SENDCHANGE).
Не работает?

Помогите, пожалуйста. Заранее большое спасибо.
Re: Обновление значков в explorerе
От: SergH Россия  
Дата: 06.02.02 23:05
Оценка:
Здравствуйте Peter K., Вы писали:

PK>Добрый вечер.

PK>Как обновить значки explorere, подобно тому как это
PK>делает Tweak UI компонент панели управления
PK>по команде Rebuild Icons?
PK>Некоторые утилиты делают то же самое.

PK>Пробовал SystemParametersInfo(SPI_SETICONS, 0, NULL, SPIF_SENDCHANGE).

PK>Не работает?

PK>Помогите, пожалуйста. Заранее большое спасибо.


Попробуйте SNChangeNotify()
Делай что должно, и будь что будет
Re: Обновление значков в explorerе
От: Аноним  
Дата: 06.02.02 23:08
Оценка:
Здравствуйте Peter K., Вы писали:

Пардон, SHChangeNotify()
Re[2]: Обновление значков в explorerе
От: Peter K.  
Дата: 07.02.02 18:59
Оценка:
Здравствуйте SergH, Вы писали:

SH>Попробуйте SNChangeNotify()


Если можно, подробнее — как с помощью SHChangeNotify()
обновить ВСЕ значки в explorere
(Рабочий стол, окна папок и т.п.)?
Re[3]: Обновление значков в explorerе
От: SergH Россия  
Дата: 07.02.02 21:32
Оценка:
Здравствуйте Peter K., Вы писали:

PK>Если можно, подробнее — как с помощью SHChangeNotify()

PK>обновить ВСЕ значки в explorere
PK>(Рабочий стол, окна папок и т.п.)?

Я не уверен, так как конкретно "обновлять значки" на пробовал. Вообще, эта функция сообщает оболочке, что в ней произошли какие-то изменения. Поэтому я думаю, что для этого случая она подойдёт. Попробуйте так:

SHChangeNotify(SHCNE_GLOBALEVENT, SHCNF_DWORD, 0, 0);
Делай что должно, и будь что будет
Re[4]: Обновление значков в explorerе
От: Peter K.  
Дата: 08.02.02 18:09
Оценка:
Здравствуйте SergH, Вы писали:

К сожалению на
SH>
SH>SHChangeNotify(SHCNE_GLOBALEVENTS, SHCNF_DWORD, 0, 0);
SH>

не реагирует.

В чем собс-но суть проблемы:

В некоторых ситуациях в оболочке Windows "портятся" значки
(искажаются, заменяются на неправильные и т.п.).

(В качестве примера: такое происходит иногда при переключении в
DirectX и обратно — фон с белого заменяется на серый).

Нажатие F5 не спасает.
Это исправляется перезагрузкой Windows, но не всегда.
Из-за ShellIconCache, как я понимаю.

Control panel applet Tweak UI из Power Toys по команде
Rebuild Icons на вкладке Repair производит "сброс"
всех окошек explorera, включая Рабочий стол.
Они "очищаются", "перезаполняются" в течение 2с или более
после чего значки всех объектов становятся нормальными.

В связи с этим окна получают сообщения WM_SETTINGCHANGE,
с wParam = SPI_SETNONCLIENTMETRICS (или 0 в других программах) и
lParam = 0, и обрабатывают их (return 0).

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0 ...

делает вроде то же самое, но не работает (return 1).

Как быть?
Re: Обновление значков в explorerе
От: raspopov Россия https://www.cherubicsoft.com/
Дата: 09.02.02 05:01
Оценка:
Здравствуйте Peter K., Вы писали:

PK>Как обновить значки explorere


Попробуй изменить размер значков в системе туда-обратно.
Re[2]: Обновление значков в explorerе
От: Peter K.  
Дата: 11.02.02 17:55
Оценка:
Здравствуйте raspopov, Вы писали:

R>Попробуй изменить размер значков в системе туда-обратно.


Большое спасибо! Это работает. НО сопровождается неприятной
"анимацией" — перерисовкой значков в один размер и обратно.
Как с этим справиться?

Я использую код:

BOOL ChangeRegIconSize(LPTSTR pszData)
{
    HKEY hkResult = NULL;
    if (RegCreateKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
            NULL, &hkResult, NULL) == ERROR_SUCCESS) {
        BOOL bRet = RegSetValueEx(hkResult, "Shell Icon Size", 0, REG_SZ,
            (CONST BYTE *)pszData, strlen(pszData)+1) == ERROR_SUCCESS;
        RegCloseKey(hkResult);
        return bRet;
    }
    return FALSE;
}

.....

    TCHAR szIconSizeSave[5];
    HKEY hkResult = NULL;
    DWORD dwSize = 5;

    if (RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics", 0, KEY_READ, &hkResult) != ERROR_SUCCESS) return 0;
    BOOL bRet = RegQueryValueEx(hkResult, "Shell Icon Size", 0, NULL, (LPBYTE)szIconSizeSave, &dwSize) == ERROR_SUCCESS;
    RegCloseKey(hkResult);
    if (!bRet) return 0;

    if (!ChangeRegIconSize("16")) return 0;
    SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD|SHCNF_FLUSH, (LPVOID)-1, NULL);

    if (!ChangeRegIconSize(szIconSizeSave)) return 0;
    SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, (LPVOID)-1, NULL);
.....
Re[2]: Обновление значков в explorerе
От: Peter K.  
Дата: 12.02.02 12:21
Оценка:
ЕСТЬ!!! Такой код работает:

    if (!ChangeRegIconSize("16")) return 0;
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_NORMAL, 5000, NULL);

    if (!ChangeRegIconSize(szIconSizeSave)) return 0;
    SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, (LPVOID)-1, NULL);
Re[3]: Обновление значков в explorerе
От: raspopov Россия https://www.cherubicsoft.com/
Дата: 12.02.02 16:01
Оценка:
Здравствуйте Peter K., Вы писали:

R>>Попробуй изменить размер значков в системе туда-обратно.


PK>Это работает.

PK>Я использую код:
PK> BOOL bRet = RegSetValueEx(hkResult, "Shell Icon Size", 0, REG_SZ,
PK> (CONST BYTE *)pszData, strlen(pszData)+1) == ERROR_SUCCESS;

Мда. А SystemParametersInfo() c параметрами SPI_SETICONS и/или SPI_SETICONMETRICS пробовал использовать?
Re[4]: Обновление значков в explorerе
От: Peter K.  
Дата: 14.02.02 11:29
Оценка:
Здравствуйте raspopov, Вы писали:

R>Мда. А SystemParametersInfo() c параметрами SPI_SETICONS и/или SPI_SETICONMETRICS пробовал использовать?


Вот с этого и начал.

А вообще интересно, меняет ли SystemParametersInfo какие-нибудь системные параметры самостоятельно
(без предварительного изменения в реестре вручную)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.