Что нового

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

bigarN

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

jilexandr

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

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

Medic84

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

Yashied

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

bigarN

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

Ganibal95

GreenBytes
Сообщения
876
Репутация
239
Код:
#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
 

agikon

Знающий
Сообщения
789
Репутация
16
как это закреплённый вариант?
 
Автор
B

bigarN

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

agikon

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

AZJIO

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

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
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
Репутация
16
а если надо именно 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
Репутация
659
а что если с помощью аутоита создать просто файл 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 752
Репутация
1 149
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
Репутация
659
Arei,
Немного похожий вопрос.Как всем avi файлам сделать 1 иконку?
Код:
$Icon = FileOpenDialog('', '', 'ICO File (*.ico)')
If @error Then Exit
RegWrite('HKEY_CLASSES_ROOT\AVIFile\DefaultIcon', '', 'REG_SZ', $Icon)
ProcessClose('explorer.exe')
 
Верх