Что нового

Как сменить значок (иконку) папки

bigarN

Новичок
Сообщения
50
Репутация
0
Доброе время. Пожалуйста скажите как создать папку и задать ему другую иконку. :wacko: :scratch:Спасибо
 

jilexandr

Знающий
Сообщения
129
Репутация
6
ПКМ на папке - Свойства - Настройка - Сменить значок
я правильно понял?) :whistle:

или средствами autoit?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Иконки для папок задаются через desktop.ini в нужной папке. Создать ini не составит проблем. Осталось прочитать документацию - какие параметры нужно изменять.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
См. пример для функции _WinAPI_ShellGetSetFolderCustomSettings() из WinAPIEx UDF.
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Destop set icon", 437, 135, -1, -1)
$Label1 = GUICtrlCreateLabel("Выберете папку:", 8, 8, 420, 17)
$Input1 = GUICtrlCreateInput("", 8, 32, 361, 21)
$Button1 = GUICtrlCreateButton("&Обзор", 368, 32, 65, 25)
$Input2 = GUICtrlCreateInput("", 8, 80, 361, 21)
$Button2 = GUICtrlCreateButton("&Обзор", 368, 80, 67, 25)
$Button3 = GUICtrlCreateButton("&Ok", 168, 104, 75, 25)
$Label2 = GUICtrlCreateLabel("Выберите иконку:", 8, 56, 420, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			GUICtrlSetData($Input1,FileSelectFolder("Choose a folder.", ""))
		Case $Button2
			GUICtrlSetData($Input2,FileOpenDialog('','','Icon(*.ico)'))
		Case $Button3
			FileSetAttrib(GUICtrlRead($Input1)&'\Shell_Icon.ico', "-RSH")
			FileDelete(GUICtrlRead($Input1)&'\Shell_Icon.ico')
			FileCopy(GUICtrlRead($Input2), GUICtrlRead($Input1)&'\Shell_Icon.ico')
			FileSetAttrib(GUICtrlRead($Input1)&'\Desktop.ini', "-RSH")
			FileDelete(GUICtrlRead($Input1)&'\Desktop.ini')
			IniWrite(GUICtrlRead($Input1)&'\Desktop.ini','.ShellClassInfo','IconFile','Shell_Icon.ico')
			IniWrite(GUICtrlRead($Input1)&'\Desktop.ini','.ShellClassInfo','IconIndex','0')
			FileSetAttrib(GUICtrlRead($Input1)&'\Shell_Icon.ico', "+RSH")
			FileSetAttrib(GUICtrlRead($Input1)&'\Desktop.ini', "+RSH")
	EndSwitch
WEnd
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Ganibal95
Спасибо .Мне понравился ваш пример.Благодарью :blink:
А как быть с закрепленным вариантом. Например.
Папка C:\qqq
Иконка 51 с Shell32.dll
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Ganibal95
Раза два получилось. Но потом скрипт на отрез отказывается сменить иконку.
Может быть это связан с Desktop.ini
agikon
Без выбора папки и иконки.
Заранее зная, что это папка C:\qqq а иконка ('shell32.dll', 51)
 

agikon

Знающий
Сообщения
789
Репутация
17
почему не понимание?
я вас понял. а если я понял то и другие поняли.
ждите, я думаю то что вам надо ещё легче реализовать чем то что написал Ganibal95.
код от Ganibal95 не тяжело переделать, но я не знаю как в ini-файл записать ('shell32.dll', 51)
к тому же мне тоже интересно.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
bigarN
Посмотри Icon_of_folder, там используется функция _RebuildShellIconCache. Вообще есть два варианта обновления иконки, если взята из dll то достаточно SHChangeNotify, а если указан файл иконки, то _RebuildShellIconCache, в случае если иконка меняется второй раз.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bigarN,
Вам же Yashied дал решение. Чуть переделанный пример из справки (у меня работает как часы).
Код:
#include <APIConstants.au3>
#include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $tSHFCS, $tIcon, $sPath, $sIconFile = @SystemDir & '\shell32.dll'

$sPath = @ScriptDir & '\qqq'

For $i = 10 To 20
	$tSHFCS = DllStructCreate($tagSHFOLDERCUSTOMSETTINGS & 'wchar[' & (StringLen($sIconFile) + 1) & ']')
	DllStructSetData($tSHFCS, 'Size', DllStructGetPtr($tSHFCS, 16) - DllStructGetPtr($tSHFCS))
	DllStructSetData($tSHFCS, 'Mask', $FCSM_ICONFILE)
	DllStructSetData($tSHFCS, 'IconFile', DllStructGetPtr($tSHFCS, 16))
	DllStructSetData($tSHFCS, 'SizeIF', 260)
	DllStructSetData($tSHFCS, 'IconIndex', $i)
	DllStructSetData($tSHFCS, 16, $sIconFile)
	_WinAPI_ShellGetSetFolderCustomSettings($sPath, $FCS_FORCEWRITE, $tSHFCS)
	If @error Then
		MsgBox(16, 'Error', '_WinAPI_ShellGetSetFolderCustomSettings')
	Else
		MsgBox(64, 'Info', 'OK' & @LF & 'IconIndex: ' & $i)
	EndIf
Next
 

agikon

Знающий
Сообщения
789
Репутация
17
а если надо именно 51 и именно папку с:\qqq
то чуток изменив код madmasles'a
получаем
Код:
#include <APIConstants.au3>
#include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $tSHFCS, $tIcon, $sPath, $sIconFile = @SystemDir & '\shell32.dll'

;$sPath = @ScriptDir & 'C:\qqq'
$sPath = 'C:\qqq'

For $i = 51 To 51
    $tSHFCS = DllStructCreate($tagSHFOLDERCUSTOMSETTINGS & 'wchar[' & (StringLen($sIconFile) + 1) & ']')
    DllStructSetData($tSHFCS, 'Size', DllStructGetPtr($tSHFCS, 16) - DllStructGetPtr($tSHFCS))
    DllStructSetData($tSHFCS, 'Mask', $FCSM_ICONFILE)
    DllStructSetData($tSHFCS, 'IconFile', DllStructGetPtr($tSHFCS, 16))
    DllStructSetData($tSHFCS, 'SizeIF', 260)
    DllStructSetData($tSHFCS, 'IconIndex', $i)
    DllStructSetData($tSHFCS, 16, $sIconFile)
    _WinAPI_ShellGetSetFolderCustomSettings($sPath, $FCS_FORCEWRITE, $tSHFCS)
    If @error Then
        MsgBox(16, 'Error', '_WinAPI_ShellGetSetFolderCustomSettings')
    Else
        MsgBox(64, 'Info', 'OK' & @LF & 'IconIndex: ' & $i)
    EndIf
Next




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

а что если с помощью аутоита создать просто файл Desktop.ini в папке с:\qqq
с таким содержимым
[.ShellClassInfo]
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=51


эффект не будет ли тот же?
в чём разница? где-то в реестре прописывается ещё что-то функцией _WinAPI_ShellGetSetFolderCustomSettings($sPath, $FCS_FORCEWRITE, $tSHFCS)
или как?
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
а что если с помощью аутоита создать просто файл Desktop.ini в папке с:\qqq
с таким содержимым
[.ShellClassInfo]
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=51

эффект не будет ли тот же?
Тот-же :smile:
 

StarEdik

Новичок
Сообщения
365
Репутация
4
Чуточку изменил отличный пример от madmasles
Надо только заранее определить и сохранить нужную иконку под именем 128.ico .
Код:
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global $tSHFCS, $tIcon, $aIcon, $sPath
; Select folder
$sPath ='C:\qqq'
$aIcon ='C:\128.ico'
; Set icon to selected folder
$tIcon = DllStructCreate('wchar[260]')
DllStructSetData($tIcon, 1, $aIcon)
$tSHFCS = DllStructCreate($tagSHFOLDERCUSTOMSETTINGS)
DllStructSetData($tSHFCS, 'Size', DllStructGetSize($tSHFCS))
DllStructSetData($tSHFCS, 'Mask', $FCSM_ICONFILE)
DllStructSetData($tSHFCS, 'IconFile', DllStructGetPtr($tIcon))
DllStructSetData($tSHFCS, 'SizeIF', 260)
DllStructSetData($tSHFCS, 'IconIndex', $aIcon)
_WinAPI_ShellGetSetFolderCustomSettings($sPath, $FCS_FORCEWRITE, $tSHFCS)
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Большое спасибо вам всем.
Вот еще решении. http://autoit-script.ru/index.php/topic,4407.msg31831.html#msg31831
Может пригодиться.

CreatoR
Код:
$sDir_Path = "C:\TestDir"
IniWrite($sDir_Path & "\Desktop.ini", ".ShellClassInfo", "IconFile", @ScriptDir & "\Icon.ico")
IniWrite($sDir_Path & "\Desktop.ini", ".ShellClassInfo", "IconIndex", 0)[/quote]

madmasles
Код:
If FileExists(@ScriptDir & '\2.ico') Then
    If FileExists(@ScriptDir & '\Desktop.ini') Then
        FileDelete(@ScriptDir & '\Desktop.ini')
    EndIf
    IniWrite(@ScriptDir & '\Desktop.ini', '.ShellClassInfo', 'IconFile', @ScriptDir & '\2.ico')
    IniWrite(@ScriptDir & '\Desktop.ini', '.ShellClassInfo', 'IconIndex', 0)
    IniWrite(@ScriptDir & '\Desktop.ini', '.ShellClassInfo', 'InfoTip', 'Иконка папки заменена на 2.ico')
    FileSetAttrib(@ScriptDir, '+R')
    FileSetAttrib(@ScriptDir & '\Desktop.ini', '+H')
EndIf[/quote]


Тема закрыта
 

Arei

Скриптер
Сообщения
938
Репутация
115
Немного похожий вопрос.Как всем avi файлам сделать 1 иконку?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Arei
Как бы вопрос не похожий, и решение связано с реестром. Сделай поисковой запрос по слову DefaultIcon и разберёшся где указана иконка.

Кстати иконки некоторых папок можно указать в реестре, типа так:
Код:
REGEDIT4

# Избранное (FAVOURITE)

[HKEY_CLASSES_ROOT\CLSID\{1A9BA3A0-143A-11CF-8350-444553540000}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,3"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1A9BA3A0-143A-11CF-8350-444553540000}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,3"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]
"43"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,3"

# Интернет (INTERNET)

[HKEY_CLASSES_ROOT\CLSID\{25336920-03F9-11CF-8FD0-00AA00686F13}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_CLASSES_ROOT\CLSID\{3050F3D9-98B5-11CF-BB82-00AA00BDCE0B}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_CLASSES_ROOT\CLSID\{65014010-9F62-11d1-A651-00600811D5CE}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_CLASSES_ROOT\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_CLASSES_ROOT\CLSID\{AE24FDAE-03C6-11D1-8B76-0080C744F389}\ToolboxBitmap32]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{25336920-03F9-11CF-8FD0-00AA00686F13}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{3050F3D9-98B5-11CF-BB82-00AA00BDCE0B}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{65014010-9F62-11d1-A651-00600811D5CE}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{AE24FDAE-03C6-11D1-8B76-0080C744F389}\ToolboxBitmap32]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,8"

# документы интернет-эксплорера (IEDOC)

[HKEY_CLASSES_ROOT\htmlfile\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,7"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\htmlfile\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,7"




# 1 неассоциированный файл (anyfile)
# 2 *.com или *.exe без иконки (COMFILE)
# 3 Папка (FOLDER)
# 4 открытая папка (FolderOpen)
# 15 Мой компьютер (MYCOM)
# 19, 36 Программные группы (APPGROUP)
# 20 Мои документы (MYDOC)
# 23 Помощь (HELP)
# 24 Выполнить (RUN)
# 27 Выключение компа (SHUTDOWN)

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]
"0"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,2"
"2"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,1"
"3"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,4"
"4"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,5"
"15"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,9"
"19"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,0"
"36"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,0"
"20"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,10"
"23"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,6"
"24"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,11"


# Мой компьютер (MYCOM)

[HKEY_USERS\.DEFAULT\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,9"

# Мои документы (MYDOC)

[HKEY_USERS\.DEFAULT\Software\Classes\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,10"

# Полная корзина (BINFULL)

[HKEY_USERS\.DEFAULT\Software\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,13"
"Full"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,13"

# Пустая корзина (BINEMPTY)

[HKEY_USERS\.DEFAULT\Software\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon]
"Empty"="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,12"


# Иконка диску С (osdrive)

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons\C\DefaultIcon]
@="C:\\windows\\Resources\\Icons\\assotiations\\shell.dll,14"
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Arei,
Немного похожий вопрос.Как всем avi файлам сделать 1 иконку?
Код:
$Icon = FileOpenDialog('', '', 'ICO File (*.ico)')
If @error Then Exit
RegWrite('HKEY_CLASSES_ROOT\AVIFile\DefaultIcon', '', 'REG_SZ', $Icon)
ProcessClose('explorer.exe')
 
Верх