Что нового

Как поменять иконку папки

saraconor

Новичок
Сообщения
418
Репутация
3
Код:
$icon = "E:\SOFT\Графика\Иконки\Система\camera_128.ico"   ;иконка
$folder = " E:\SOFT\тестовая папка" ;папка в которой нужно иконку поменять


А дальше как быть? пробывала создавать в той папке Desktop.ini c текстом:
[.ShellClassInfo]
IconFile=E:\SOFT\Графика\Иконки\Система\camera_128.ico
-не помогло.
примеры от сюда http://autoit-script.ru/index.php?topic=7358.0 и от сюда: http://autoit-script.ru/index.php/topic,4407.msg31831.html#msg31831
не работали. Файл ini создавался, лежал в папке, но ничего не делал.
Win7 x64.
У меня ощущение что следует изменять сразу в реестре, но где там находятся параметры папок я не нашла :(
 

sanf

Новичок
Сообщения
30
Репутация
0
По умолчанию Windows хранит параметры отображения и настройки каждой папки.
Эти параметры находятся в следующих разделах реестра.
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell


Добавлено:
Сообщение автоматически объединено:


в Path указываешь путь E:\SOFT\тестовая папка или любой другой, в папке должна лежать иконка

Код:
$sPath = "E:\SOFT\тестовая папка"
    FileDelete($sPath & '\Desktop.ini')
    IniWrite($sPath & '\Desktop.ini', '.ShellClassInfo', 'IconFile', $sPath & '\camera_128.ico')
    IniWrite($sPath & '\Desktop.ini', '.ShellClassInfo', 'IconIndex', 0)
    IniWrite($sPath & '\Desktop.ini', '.ShellClassInfo', 'InfoTip', 'Иконка папки заменена на camera_128.ico')
	FileSetAttrib($sPath, '+R')
    FileSetAttrib($sPath & '\Desktop.ini', '+H')
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
Опять тоже самое :smile: в папке создается файл ini, и больше нет изменений.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
saraconor
В Win7 нужно атрибут папки не +R, а +S. Кстати Icon_of_folder.
Да, иногда требуется перекеширование иконок, особенно если иконка меняется несколько раз у одной и той же папки.
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
В принципе работает, помещаю в папку desctop.ini
[.ShellClassInfo]
IconFile=Desktop.ico
IconIndex=0
IconResource=E:\SOFT\тестовая папка\Desktop.ico
кладу рядом Desktop.ico
и минуты через 2 папка меняет свою иконку :whistle: осталось понять как эти 2 минуты сократить в 200 ms
Вы говорили что-то о «перекешировании» ? Как это можно реализовать? В вашей программе кнопка "обновить кеш иконок" не ускорила процесс.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
как перекешировать иконки?
"Кусок" из программы AZJIO
Код:
; Обновление кэша значков
; Не сработало на WIN7
; engine
; http://www.autoitscript.com/forum/topic/70433-rebuild-shell-icon-cache/page__view__findpost__p__531242
;Автор AZJIO

Func _RebuildShellIconCache()
    Local Const $sKeyName = "HKCU\Control Panel\Desktop\WindowMetrics"
    Local Const $sValue = "Shell Icon Size"
    
    $sDataRet = RegRead($sKeyName, $sValue)
    If @error Then Return SetError(1)
    
    RegWrite($sKeyName, $sValue, "REG_SZ", $sDataRet + 1)
    If @error Then Return SetError(1)
    
    $bcA = _BroadcastChange()
    
    RegWrite($sKeyName, $sValue, "REG_SZ", $sDataRet)
    
    $bcB = _BroadcastChange()
    
    If $bcA = 0 Or $bcB = 0 Then Return SetError(1)
    
    Return
EndFunc ;==> _RebuildShellIconCache()

Func _BroadcastChange()
    Local Const $HWND_BROADCAST = 0xffff
    Local Const $WM_SETTINGCHANGE = 0x1a
    Local Const $SPI_SETNONCLIENTMETRICS = 0x2a
    Local Const $SMTO_ABORTIFHUNG = 0x2
    
    $bcResult = DllCall("user32.dll", "lresult", "SendMessageTimeout", _
        "hwnd", $HWND_BROADCAST, _
            "uint", $WM_SETTINGCHANGE, _
                "wparam", $SPI_SETNONCLIENTMETRICS, _
                    "lparam", 0, _
                        "uint", $SMTO_ABORTIFHUNG, _
                            "uint", 10000, _
                                "dword*", "success")
    If @error Then Return 0
    
    Return $bcResult[0]
EndFunc ;==> _BroadcastChange()
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
У меня Win7 x64.
Этот кусок кода не работает.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
saraconor
Вот это
Код:
DllCall("shell32.dll", "none", "SHChangeNotify", "long", '0x8000000', "uint", '0x1000', "ptr", '0', "ptr", '0')
Делает обновление проводника и в большинстве достаточно.
Если иконка указывается из DLL то выше указанное достаточно.
Если иконка извлекается из DLL в каталог,то при первом разе вышеуказанное достаточно, но если иконка меняется второй и более раз, то иконка уже сохраняется в кэш "C:\Documents and Settings\имя_пользователя\Local Settings\Application Data\IconCache.db" для ускорения её использования. Если не обновить кеш то используется старая иконка, которая назначена первой.
Кстати, функция _RebuildShellIconCache добавлена в справку, предложена мне snoitaleR'ом и с указанием в том что она не работает на Win7.
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
Код:
$sPath = "E:\SOFT\тестовая папка"
    FileDelete($sPath & '\Desktop.ini')
    IniWrite($sPath & '\Desktop.ini', '.ShellClassInfo', 'IconFile', $sPath & '\иконки.dll') ; dll лежит там-же $sPath
    IniWrite($sPath & '\Desktop.ini', '.ShellClassInfo', 'IconIndex', 3) ;если менять последнее значение -меняются иконки
    FileSetAttrib($sPath, '+S') ;для чего этот атрибут нужен?
    FileSetAttrib($sPath & '\Desktop.ini', '+H') ; а этот видимо «hide» файлу?
	DllCall("shell32.dll", "none", "SHChangeNotify", "long", '0x8000000', "uint", '0x1000', "ptr", '0', "ptr", '0')
	exit

Удалось запаковать несколько иконок в dll, обновление проводника не помогает. функция _RebuildShellIconCashe не помогает, иконка меняется, но очень медленно.
Кстати, а есть возможность вытащить png изображение с прозрачностью и без рамок поверх всех окон (как это иногда видно делают в «лекарствах»)?
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
Уже пробывала тамошние примеры, не работают.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
saraconor
Кстати, а есть возможность вытащить png изображение с прозрачностью и без рамок поверх всех окон (как это иногда видно делают в «лекарствах»)?
Открывайте тему, не принято в одной теме более одного вопроса.

иконка меняется, но очень медленно
Медленно это как? То есть без _RebuildShellIconCashe и SHChangeNotify, или при использовании одной и них? И сколько в секундах? дело в том что _RebuildShellIconCashe при выполнении изменяет размер установленных иконок, что заставляет обновить кеш иконок, потом возвращает предыдущий размер, что опять приводит к обновлению кеша иконок, в итоге операция занимает 1-2 сек при этом все окна проводника моргают и перерисовываются 2 раза.
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
от 1 до 2х минут идет смена иконки и без использования _RebuildShellIconCashe и SHChangeNotify, и с ними тоже. Наверняка ведь есть решение, обычным если способом поменять иконку -сразу меняется, без всяких морганий.
 

gora

Знающий
Сообщения
315
Репутация
19
AZJIO [?]
В Win7 нужно атрибут папки не +R, а +S.
Откуда информация про атрибут? У меня на win 7 x64 работает такой батник:
Код:
Set fldr=%~dp0
For %%i In ("%~dp0*.ico") Do Set icon="%%~nxi"
If Defined icon (
	If Exist "%~dp0desktop.ini" Attrib -H -S "%~dp0desktop.ini"
	(Echo [.ShellClassInfo]
	Echo IconResource=%icon%,0)>"%~dp0desktop.ini"
	Attrib +H +S "%~dp0desktop.ini"
	Attrib +R "%fldr:~0,-1%"
)
Помещаю батник в папку, там же лежит иконка, запускаю батник и у папки новая иконка.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
gora
у меня такая же система. батник не работает.
 

gora

Знающий
Сообщения
315
Репутация
19
joiner
Возможно из-за пробелов в путях\именах. Подправил.
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
AZJIO а как иконка называлась в папке?
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
gora
Откуда информация про атрибут?
От snoitaleR.

saraconor
AZJIO а как иконка называлась в папке?
Вопрос конечно интересный, предпологаю в моей утилите, при экспорте иконке даётся имя Desktop.ico, такое же как и у desktop.ini.
 
Автор
S

saraconor

Новичок
Сообщения
418
Репутация
3
Не помог ваш батник. Прописывает иконку в Desktop.ini и все, через минуту иконка обновляется.
 

gora

Знающий
Сообщения
315
Репутация
19
AZJIO [?]
1 Я исхожу из поведения самой системы. При смене иконки через "Свойства папки" система сама устанавливает именно атрибут R, а не S.
2 Некоторые программы имеют собственные иконки у своей папки, например, SKYPE, и у папки тоже установлен атрибут R

saraconor [?]
через минуту иконка обновляется.
Я не утверждал, что смена происходит мгновенно, хотя у меня это происходит значительно быстрее.
Попробуйте использовать команду shellrefresh утилиты nircmd, может это ускорит процесс...
 
Верх