1

Тема: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Здравствуйте, есть хорошая программа, но у неё вырвиглазная иконка, хотелось бы её сменить либо удалить.

Вот что пробовал

loop
{
	IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_SMALL := 0

iconFile := "C:\staff\images_qDL_icon.ico"
hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)

	SetTitleMatchMode, 2
IfWinActive, xplorer2
{
	loop, 50
	{
WinGetTitle, Title, A
var := RegExMatch(title, "\-(.*)", match)
var := match1
SendMessage, 0xC, 0, hIcon, , xplorer2
SendMessage, 0xC, 0, ""var, , xplorer2
sleep, 500
}
}
sleep, 2000
}

В итоге иконка рас меняется, потом как будто заклинивает и больше не меняется. В чём может быть проблема?

2

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

OmTatSat, рука-лицо. Зачем вы это в бесконечном цикле делаете? У вас WM_SETICON определён, как 0х80, а посылаете вы зачем-то 0хC. Код сами писали, или надрали откуда-то?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

teadrinker, в бесконечном цикле потому что, заголовок меняется при каждом перемещении по папкам. Пробовал делать по клику - не то, после открытия папки нужно дополнительно кликать где-то на пустом месте папки.

Во, точно, 0х80, много вариантов пробовал, видимо какой-то раз 0х80 выбрал и сработало, потом наверное какие-то изменения откатывал и...
Спасибо!
Код честно копировал то там, то сям)

4

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

loop
{
	IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_SMALL := 0

iconFile := "C:\staff\images_qDL_icon.ico"
hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)

	SetTitleMatchMode, 2
IfWinActive, xplorer2
{
	loop, 50
	{
WinGetTitle, Title, A
var := RegExMatch(title, "\-(.*)", match)
var := match1
SendMessage, 0x80, 0, hIcon, , xplorer2
SendMessage, 0xC, 0, ""var, , xplorer2
sleep, 500
}
}
sleep, 2000
}

5

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Кстати, возможно ли "вытянуть" иконку папки?

6 (изменено: OmTatSat, 2016-11-28 00:00:23)

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Правда, придумался вариант боле рациональный.

#NoTrayIcon
SetTitleMatchMode, 2

#IfWinActive, ahk_exe xplorer2_64.exe

~LButton::
~RButton::
WinWait, xplorer2
IMAGE_ICON := 1,
iconFile := "C:\staff\explorer.ico"
hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)
WinGetTitle, Title, A
var := RegExMatch(title, "\-(.*)", match)
var := match1
SendMessage, 0x80, 0, hIcon, , xplorer2
SendMessage, 0xC, 0, ""var, , xplorer2

7

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Ещё интересно, почему я не могу заменить эту строку.

hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)

На такую.

hIcon := LoadPicture(iconFile, "w16 h-1", 1)

?

8 (изменено: OmTatSat, 2016-11-28 00:21:29)

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

На счёт иконок папок, придумался костыль который в итоге получился даже лучше, так как случайно начал делать то, что я хотел реализовать но ещё не придумал как.) А именно, мне хотелось если я в папке торрентов, то чтобы все подпапки имели такие же иконки, но в рукопашку всем присваивать то ещё занятие, а сейчас само собой получилось)) Хорошо что у меня только 2 папки с "левыми" иконками.

#NoTrayIcon
SetTitleMatchMode, 2

#IfWinActive, ahk_exe xplorer2_64.exe

~LButton::
~RButton::
WinWait, xplorer2
IMAGE_ICON := 1,
iconFilet := "C:\staff\torrent.ico"
iconFiles := "C:\staff\ahk.ico"
hIcont := LoadPicture(iconFilet, "w16 h-1", IMAGE_ICON)
hIcons := LoadPicture(iconFiles, "w16 h-1", IMAGE_ICON)
WinGetTitle, Title, A
var := RegExMatch(title, "\-(.*)", match)
var := match1
IfInString, var, TORRENTS
{
SendMessage, 0x80, 0, hIcont, , xplorer2
}
IfInString, var, staff
{
SendMessage, 0x80, 0, hIcons, , xplorer2
}
SendMessage, 0xC, 0, ""var, , xplorer2

А иконку для всех остальных папок поменял редактируя саму прогу через Resource Hacker. Вроде всё что хотел получилось.

9

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

OmTatSat пишет:

Правда, придумался вариант боле рациональный.

Не нужно hIcon получать каждый раз заново.
Достаточно один раз получить его в начале скрипта.

OmTatSat пишет:

почему я не могу заменить эту строку.

Не знаю, обмен равноценный, где-то в другом месте ошибка.

OmTatSat пишет:

возможно ли "вытянуть" иконку папки?

Можно, из папки, или из любого другого файла:

FilePath := A_WinDir

WM_SETICON := 0x80, ICON_BIG := 1, ICON_SMALL := 0
sz := { 16: "SMALL", 32: "LARGE", 48: "EXTRALARGE", 256: "JUMBO" }

Icon1 := GetSysImgListIcon(FilePath, sz[16])
Icon2 := GetSysImgListIcon(FilePath, sz[32])
Icon3 := GetSysImgListIcon(FilePath, sz[48])
Icon4 := GetSysImgListIcon(FilePath, sz[256])

Gui, +LastFound
Gui, Add, Pic, % "w" Icon2.W " h" Icon2.H, % "HICON:" Icon2.HICON
Gui, Add, Pic, % "x+10 yp w" Icon3.W " h" Icon3.H, % "HICON:" Icon3.HICON
Gui, Add, Pic, % "x+10 yp w" Icon4.W " h" Icon4.H, % "HICON:" Icon4.HICON
SendMessage, WM_SETICON, ICON_SMALL, Icon1.HICON  ; иконка в строке заголовка
SendMessage, WM_SETICON, ICON_BIG  , Icon2.HICON  ; иконка для Alt + Tab
Gui, Show
Return

GetSysImgListIcon(Path, Size := "SYSSMALL", Overlay := "")  {
   static SHIL := { LARGE: 0x00, SMALL: 0x01, EXTRALARGE: 0x02, SYSSMALL: 0x03, JUMBO: 0x04 }  ; возможные размеры
        , AW := A_IsUnicode ? "W" : "A"
        , cbSFI := A_PtrSize + 8 + (340 << A_IsUnicode)
        , IID_IIL_Str := "{46EB5926-582E-4017-9FDF-E8998DAA0950}"
        , SHGFI := {SYSICONINDEX: 0x4000, PIDL: 0x8}
        , SHGIOI := {SHARE: 0x0FFFFFFF, LINK: 0x0FFFFFFE, SLOWFILE: 0x0FFFFFFD, DEFAULT: 0x0FFFFFFC}
        , ILD_IMAGE := 0x20
   
   VarSetCapacity(IID_IIL, 16, 0) ; IID
   DllCall("Ole32\IIDFromString", WStr, IID_IIL_Str, Ptr, &IID_IIL, UInt)
   
   HMOD := DllCall("GetModuleHandle", Str, "shell32.dll", UPtr)
   FileIconInit := DllCall("GetProcAddress", Ptr, HMOD, Ptr, 660, UPtr)
   DllCall(FileIconInit, UInt, True, UInt)
   
   VarSetCapacity(SFI, cbSFI, 0) ; SHFILEINFO
   DllCall("Shell32\SHParseDisplayName", Str, path, Ptr, 0, PtrP, ppidl, UInt, 0, UIntP, 0)
   Flags := SHGFI.PIDL | SHGFI.SYSICONINDEX
   if !DllCall("Shell32\SHGetFileInfo" . AW, Ptr, ppidl, UInt, 0, Ptr, &SFI, UInt, cbSFI, UInt, Flags, UPtr)
      Return False
   
   IconIndex := NumGet(SFI, A_PtrSize, "Int")
   if DllCall("Shell32\SHGetImageList", Int, SHIL[Size], Ptr, &IID_IIL, PtrP, IIL, UInt)
      Return False
   
   Flags := ILD_IMAGE
   if SHGIOI.HasKey(Overlay)
   && (IOV := DllCall("Shell32\SHGetIconOverlayIndex", Ptr, 0, UInt, SHGIOI[Overlay], Int)) >= 0
      Flags |= IOV << 8
      
   DllCall("Comctl32\ImageList_GetIconSize", Ptr, IIL, IntP, CX, IntP, CY, UInt)
   hIcon := DllCall("Comctl32\ImageList_GetIcon", Ptr, IIL, Int, IconIndex, UInt, Flags, UPtr)
   
   Return { HICON: hIcon, W: CX, H: CY }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10 (изменено: OmTatSat, 2016-11-28 01:29:31)

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

С учётом предложенной оптимизации и доделки.

#NoTrayIcon
SetTitleMatchMode, 2

IMAGE_ICON := 1,
iconFilet := "C:\staff\torrent.ico"
iconFiles := "C:\staff\ahk.ico"
iconFile := "C:\staff\explorer.ico"
hIcont := LoadPicture(iconFilet, "w16 h-1", IMAGE_ICON)
hIcons := LoadPicture(iconFiles, "w16 h-1", IMAGE_ICON)
hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)

#IfWinActive, ahk_exe xplorer2_64.exe
changed = 0
~LButton::
~RButton::
WinWait, xplorer2

WinGetTitle, Title, A
;var := RegExMatch(title, "\-(.*)", match)
var := RegExMatch(title, "(.*)- xplorer2", match)
var := match1
IfInString, changed, 1
{
SendMessage, 0x80, 0, hIcon, , xplorer2
changed := 0
}
IfInString, var, TORRENTS
{
SendMessage, 0x80, 0, hIcont, , xplorer2
changed = 1
}
IfInString, var, staff
{
SendMessage, 0x80, 0, hIcons, , xplorer2
changed = 1
}
;ToolTip, 1 %changed%

SendMessage, 0xC, 0, ""var, , xplorer2

Запускаю ваш код получаю.

Error:  Invalid option.

Specifically: w

	Line#
	003: WM_SETICON := 0x80, ICON_BIG := 1, ICON_SMALL := 0  
	004: sz := { 16: "SMALL", 32: "LARGE", 48: "EXTRALARGE", 256: "JUMBO" }
	006: Icon1 := GetSysImgListIcon(FilePath, sz[16])
	007: Icon2 := GetSysImgListIcon(FilePath, sz[32])
	008: Icon3 := GetSysImgListIcon(FilePath, sz[48])
	009: Icon4 := GetSysImgListIcon(FilePath, sz[256])
	011: Gui,+LastFound
--->	012: Gui,Add,Pic,"w" Icon2.W " h" Icon2.H,"HICON:" Icon2.HICON
	013: Gui,Add,Pic,"x+10 yp w" Icon3.W " h" Icon3.H,"HICON:" Icon3.HICON
	014: Gui,Add,Pic,"x+10 yp w" Icon4.W " h" Icon4.H,"HICON:" Icon4.HICON
	015: SendMessage,WM_SETICON,ICON_SMALL,Icon1.HICON
	016: SendMessage,WM_SETICON,ICON_BIG,Icon2.HICON
	017: Gui,Show
	018: Return
	020: {

The current thread will exit.

11

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Не знаю, у меня работает. Надо смотреть, что функция возвращает в Icon2.W.

FilePath := A_WinDir

WM_SETICON := 0x80, ICON_BIG := 1, ICON_SMALL := 0
sz := { 16: "SMALL", 32: "LARGE", 48: "EXTRALARGE", 256: "JUMBO" }

Icon1 := GetSysImgListIcon(FilePath, sz[16])
Icon2 := GetSysImgListIcon(FilePath, sz[32])
Icon3 := GetSysImgListIcon(FilePath, sz[48])
Icon4 := GetSysImgListIcon(FilePath, sz[256])

MsgBox, % Icon2.W

Gui, +LastFound
Gui, Add, Pic, % "w" Icon2.W " h" Icon2.H, % "HICON:" Icon2.HICON
Gui, Add, Pic, % "x+10 yp w" Icon3.W " h" Icon3.H, % "HICON:" Icon3.HICON
Gui, Add, Pic, % "x+10 yp w" Icon4.W " h" Icon4.H, % "HICON:" Icon4.HICON
SendMessage, WM_SETICON, ICON_SMALL, Icon1.HICON  ; иконка в строке заголовка
SendMessage, WM_SETICON, ICON_BIG  , Icon2.HICON  ; иконка для Alt + Tab
Gui, Show
Return

GuiClose:
   ExitApp

GetSysImgListIcon(Path, Size := "SYSSMALL", Overlay := "")  {
   static SHIL := { LARGE: 0x00, SMALL: 0x01, EXTRALARGE: 0x02, SYSSMALL: 0x03, JUMBO: 0x04 }  ; возможные размеры
        , AW := A_IsUnicode ? "W" : "A"
        , cbSFI := A_PtrSize + 8 + (340 << A_IsUnicode)
        , IID_IIL_Str := "{46EB5926-582E-4017-9FDF-E8998DAA0950}"
        , SHGFI := {SYSICONINDEX: 0x4000, PIDL: 0x8}
        , SHGIOI := {SHARE: 0x0FFFFFFF, LINK: 0x0FFFFFFE, SLOWFILE: 0x0FFFFFFD, DEFAULT: 0x0FFFFFFC}
        , ILD_IMAGE := 0x20
   
   VarSetCapacity(IID_IIL, 16, 0) ; IID
   DllCall("Ole32\IIDFromString", WStr, IID_IIL_Str, Ptr, &IID_IIL, UInt)
   
   HMOD := DllCall("GetModuleHandle", Str, "shell32.dll", UPtr)
   FileIconInit := DllCall("GetProcAddress", Ptr, HMOD, Ptr, 660, UPtr)
   DllCall(FileIconInit, UInt, True, UInt)
   
   VarSetCapacity(SFI, cbSFI, 0) ; SHFILEINFO
   DllCall("Shell32\SHParseDisplayName", Str, path, Ptr, 0, PtrP, ppidl, UInt, 0, UIntP, 0)
   Flags := SHGFI.PIDL | SHGFI.SYSICONINDEX
   if !DllCall("Shell32\SHGetFileInfo" . AW, Ptr, ppidl, UInt, 0, Ptr, &SFI, UInt, cbSFI, UInt, Flags, UPtr)
      Return False
   
   IconIndex := NumGet(SFI, A_PtrSize, "Int")
   if DllCall("Shell32\SHGetImageList", Int, SHIL[Size], Ptr, &IID_IIL, PtrP, IIL, UInt)
      Return False
   
   Flags := ILD_IMAGE
   if SHGIOI.HasKey(Overlay)
   && (IOV := DllCall("Shell32\SHGetIconOverlayIndex", Ptr, 0, UInt, SHGIOI[Overlay], Int)) >= 0
      Flags |= IOV << 8
      
   DllCall("Comctl32\ImageList_GetIconSize", Ptr, IIL, IntP, CX, IntP, CY, UInt)
   hIcon := DllCall("Comctl32\ImageList_GetIcon", Ptr, IIL, Int, IconIndex, UInt, Flags, UPtr)
   
   Return { HICON: hIcon, W: CX, H: CY }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12 (изменено: OmTatSat, 2016-11-28 12:28:43)

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Понял, оно работает только если запускать ahk с папки, а я с редактора запускал.

Пытаюсь всунуть в прогу, но иконка берётся не с пути к папке а с проги xplorer2, что я не так сделал?

#NoTrayIcon
SetTitleMatchMode, 2


;global Icon1 := GetSysImgListIcon(global FilePath, sz[16])
;Icon2 := GetSysImgListIcon(FilePath, sz[32])
;Icon3 := GetSysImgListIcon(FilePath, sz[48])
;Icon4 := GetSysImgListIcon(FilePath, sz[256])
iconFilet := "C:\staff\torrent.ico"
iconFiles := "C:\staff\ahk.ico"
iconFile := "C:\staff\explorer.ico"
hIcont := LoadPicture(iconFilet, "w16 h-1", IMAGE_ICON)
hIcons := LoadPicture(iconFiles, "w16 h-1", IMAGE_ICON)
hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)



#IfWinActive, ahk_exe xplorer2_64.exe
changed = 0
~LButton::
~RButton::
WinWait, xplorer2
IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_BIG := 1, ICON_SMALL := 0
sz := { 16: "SMALL", 32: "LARGE", 48: "EXTRALARGE", 256: "JUMBO" }

WinGetTitle, Title, A
;var := RegExMatch(title, "\-(.*)", match)
var := RegExMatch(title, "(.*)- xplorer2", match)
var := match1

var1 = %match1%
FilePath := var1
Icon1 := GetSysImgListIcon(FilePath, sz[16])
ToolTip, %FilePath%
IfInString, changed, 1
{
SendMessage, 0x80, 0, hIcon, , xplorer2
changed := 0
}
;IfInString, var, TORRENTS
;{
;SendMessage, 0x80, 0, hIcont, , xplorer2
;changed = 1
;}
IfInString, var, staff
{
SendMessage, 0x80, 0, hIcons, , xplorer2
changed = 1
}
;ToolTip, 1 %changed%
sleep, 1000
SendMessage, WM_SETICON, ICON_SMALL, Icon1.HICON, , xplorer2

SendMessage, 0xC, 0, ""var, , xplorer2

GetSysImgListIcon(Path, Size := "SYSSMALL", Overlay := "")  {
   static SHIL := { LARGE: 0x00, SMALL: 0x01, EXTRALARGE: 0x02, SYSSMALL: 0x03, JUMBO: 0x04 }  ; возможные размеры
        , AW := A_IsUnicode ? "W" : "A"
        , cbSFI := A_PtrSize + 8 + (340 << A_IsUnicode)
        , IID_IIL_Str := "{46EB5926-582E-4017-9FDF-E8998DAA0950}"
        , SHGFI := {SYSICONINDEX: 0x4000, PIDL: 0x8}
        , SHGIOI := {SHARE: 0x0FFFFFFF, LINK: 0x0FFFFFFE, SLOWFILE: 0x0FFFFFFD, DEFAULT: 0x0FFFFFFC}
        , ILD_IMAGE := 0x20
   
   VarSetCapacity(IID_IIL, 16, 0) ; IID
   DllCall("Ole32\IIDFromString", WStr, IID_IIL_Str, Ptr, &IID_IIL, UInt)
   
   HMOD := DllCall("GetModuleHandle", Str, "shell32.dll", UPtr)
   FileIconInit := DllCall("GetProcAddress", Ptr, HMOD, Ptr, 660, UPtr)
   DllCall(FileIconInit, UInt, True, UInt)
   
   VarSetCapacity(SFI, cbSFI, 0) ; SHFILEINFO
   DllCall("Shell32\SHParseDisplayName", Str, path, Ptr, 0, PtrP, ppidl, UInt, 0, UIntP, 0)
   Flags := SHGFI.PIDL | SHGFI.SYSICONINDEX
   if !DllCall("Shell32\SHGetFileInfo" . AW, Ptr, ppidl, UInt, 0, Ptr, &SFI, UInt, cbSFI, UInt, Flags, UPtr)
      Return False
   
   IconIndex := NumGet(SFI, A_PtrSize, "Int")
   if DllCall("Shell32\SHGetImageList", Int, SHIL[Size], Ptr, &IID_IIL, PtrP, IIL, UInt)
      Return False
   
   Flags := ILD_IMAGE
   if SHGIOI.HasKey(Overlay)
   && (IOV := DllCall("Shell32\SHGetIconOverlayIndex", Ptr, 0, UInt, SHGIOI[Overlay], Int)) >= 0
      Flags |= IOV << 8
      
   DllCall("Comctl32\ImageList_GetIconSize", Ptr, IIL, IntP, CX, IntP, CY, UInt)
   hIcon := DllCall("Comctl32\ImageList_GetIcon", Ptr, IIL, Int, IconIndex, UInt, Flags, UPtr)
   
   Return { HICON: hIcon, W: CX, H: CY }
}

Но если запускаю ваш срипт, то он берёт иконку папки путь к которой указал в filepath, не пойму в чём заковыка...

13

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Какой путь у вас указан, оттуда и берётся.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

teadrinker, так вроде для проверки поставил ToolTip, %FilePath% в тултипе путь правильный - к папке, но иконка не с папки. Да и Бог с ним, главное я реализовал. Спасибо ещё раз за указание на ошибку, с вашей подсказкой всё легко решилось.

15 (изменено: OmTatSat, 2016-11-28 22:02:12)

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Блин, а всё оказалось тотально проще.

FileName = %match1% ; путь к папке иконка которой будет показываться
	hIcon := DllCall("Shell32\ExtractAssociatedIconA", UInt, 0, Str, FileName, UShortP, iIndex)

SendMessage, 0x80, 0, hIcon, , xplorer2

Маленький и рабочий код по получению иконки.

16

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Ок, только точки расставьте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

teadrinker пишет:

Не знаю, у меня работает. Надо смотреть, что функция возвращает в Icon2.W.

FilePath := A_WinDir

WM_SETICON := 0x80, ICON_BIG := 1, ICON_SMALL := 0
sz := { 16: "SMALL", 32: "LARGE", 48: "EXTRALARGE", 256: "JUMBO" }

Icon1 := GetSysImgListIcon(FilePath, sz[16])
Icon2 := GetSysImgListIcon(FilePath, sz[32])
Icon3 := GetSysImgListIcon(FilePath, sz[48])
Icon4 := GetSysImgListIcon(FilePath, sz[256])

MsgBox, % Icon2.W

Gui, +LastFound
Gui, Add, Pic, % "w" Icon2.W " h" Icon2.H, % "HICON:" Icon2.HICON
Gui, Add, Pic, % "x+10 yp w" Icon3.W " h" Icon3.H, % "HICON:" Icon3.HICON
Gui, Add, Pic, % "x+10 yp w" Icon4.W " h" Icon4.H, % "HICON:" Icon4.HICON
SendMessage, WM_SETICON, ICON_SMALL, Icon1.HICON  ; иконка в строке заголовка
SendMessage, WM_SETICON, ICON_BIG  , Icon2.HICON  ; иконка для Alt + Tab
Gui, Show
Return

GuiClose:
   ExitApp

GetSysImgListIcon(Path, Size := "SYSSMALL", Overlay := "")  {
   static SHIL := { LARGE: 0x00, SMALL: 0x01, EXTRALARGE: 0x02, SYSSMALL: 0x03, JUMBO: 0x04 }  ; возможные размеры
        , AW := A_IsUnicode ? "W" : "A"
        , cbSFI := A_PtrSize + 8 + (340 << A_IsUnicode)
        , IID_IIL_Str := "{46EB5926-582E-4017-9FDF-E8998DAA0950}"
        , SHGFI := {SYSICONINDEX: 0x4000, PIDL: 0x8}
        , SHGIOI := {SHARE: 0x0FFFFFFF, LINK: 0x0FFFFFFE, SLOWFILE: 0x0FFFFFFD, DEFAULT: 0x0FFFFFFC}
        , ILD_IMAGE := 0x20
   
   VarSetCapacity(IID_IIL, 16, 0) ; IID
   DllCall("Ole32\IIDFromString", WStr, IID_IIL_Str, Ptr, &IID_IIL, UInt)
   
   HMOD := DllCall("GetModuleHandle", Str, "shell32.dll", UPtr)
   FileIconInit := DllCall("GetProcAddress", Ptr, HMOD, Ptr, 660, UPtr)
   DllCall(FileIconInit, UInt, True, UInt)
   
   VarSetCapacity(SFI, cbSFI, 0) ; SHFILEINFO
   DllCall("Shell32\SHParseDisplayName", Str, path, Ptr, 0, PtrP, ppidl, UInt, 0, UIntP, 0)
   Flags := SHGFI.PIDL | SHGFI.SYSICONINDEX
   if !DllCall("Shell32\SHGetFileInfo" . AW, Ptr, ppidl, UInt, 0, Ptr, &SFI, UInt, cbSFI, UInt, Flags, UPtr)
      Return False
   
   IconIndex := NumGet(SFI, A_PtrSize, "Int")
   if DllCall("Shell32\SHGetImageList", Int, SHIL[Size], Ptr, &IID_IIL, PtrP, IIL, UInt)
      Return False
   
   Flags := ILD_IMAGE
   if SHGIOI.HasKey(Overlay)
   && (IOV := DllCall("Shell32\SHGetIconOverlayIndex", Ptr, 0, UInt, SHGIOI[Overlay], Int)) >= 0
      Flags |= IOV << 8
      
   DllCall("Comctl32\ImageList_GetIconSize", Ptr, IIL, IntP, CX, IntP, CY, UInt)
   hIcon := DllCall("Comctl32\ImageList_GetIcon", Ptr, IIL, Int, IconIndex, UInt, Flags, UPtr)
   
   Return { HICON: hIcon, W: CX, H: CY }
}

А возможно как то получить превью с проводника из имени файла?
То есть не ассоциированную иконку, а например как у видео файлов, тот кадр который отображается.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Так можно:

filePath := "D:\Downloads\Аватар Путь воды_2022_WEB-DLRip-AVC.mkv"
Gui, Add, Pic,, % "HBITMAP:" . GetThumbnailOrIcon(filePath, 48, 48, true)
Gui, Add, Pic, x+0 yp, % "HBITMAP:" . GetThumbnailOrIcon(filePath, 400)
Gui, Show
Return

GuiClose:
GuiEscape:
   ExitApp
   
GetThumbnailOrIcon(filePath, width, height := 0, iconOnly := false) {
   static IID_IShellItemImageFactory := "{BCC18B79-BA16-442F-80C4-8A59C30C463B}"
        , SIIGBF_BIGGERSIZEOK := 0x00000001
        , SIIGBF_ICONONLY     := 0x00000004
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("Ole32\IIDFromString", "WStr", IID_IShellItemImageFactory, "Ptr", &GUID)
   hr := DllCall("Shell32\SHCreateItemFromParsingName", "WStr", filePath, "Ptr", 0, "Ptr", &GUID, "PtrP", IShellItemImageFactory)
   if (hr != 0)
      Return 0
   flag := SIIGBF_BIGGERSIZEOK, (iconOnly && flag |= SIIGBF_ICONONLY)
   ; IShellItemImageFactory::GetImage
   DllCall(NumGet(NumGet(IShellItemImageFactory+0) + A_PtrSize*3), "Ptr", IShellItemImageFactory, "Int64", height << 32 | width
                                                                                                , "Int", flag, "PtrP", hBitmap, "Int")
   ObjRelease(IShellItemImageFactory)
   Return hBitmap
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Ну ты молодца!
Так сходу накопал?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Не, давно уже было.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

В меню работает, а с кнопкой почему то не работает.


filePath = C:\

Gui, +AlwaysOnTop -Border +HWNDhGui -Caption
Gui, Add, Button, x0 y0 w32 h32 hwndhBut
ButtonSetIcon(hBut, filePath, 32)
Gui, Show, w32 h32
Return 

GuiClose:
GuiEscape:
	ExitApp 

ButtonSetIcon(Hwnd, sFile, IconSize)  { 
	Static BM_SETIMAGE := 0xF7, IMAGE_ICON := 1, BS_ICON := 0x40 
	hIcon := GetThumbnailOrIcon(sFile, IconSize) 
	Control, Style, +%BS_ICON%, , % "ahk_id" Hwnd 
	PostMessage, BM_SETIMAGE, IMAGE_ICON, hIcon		,, % "ahk_id" Hwnd  
} 
 
GetThumbnailOrIcon(filePath, width, height := 0, iconOnly := false) {
   static IID_IShellItemImageFactory := "{BCC18B79-BA16-442F-80C4-8A59C30C463B}"
        , SIIGBF_BIGGERSIZEOK := 0x00000001
        , SIIGBF_ICONONLY     := 0x00000004
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("Ole32\IIDFromString", "WStr", IID_IShellItemImageFactory, "Ptr", &GUID)
   hr := DllCall("Shell32\SHCreateItemFromParsingName", "WStr", filePath, "Ptr", 0, "Ptr", &GUID, "PtrP", IShellItemImageFactory)
   if (hr != 0)
      Return 0
   flag := SIIGBF_BIGGERSIZEOK, (iconOnly && flag |= SIIGBF_ICONONLY)
   ; IShellItemImageFactory::GetImage
   DllCall(NumGet(NumGet(IShellItemImageFactory+0) + A_PtrSize*3), "Ptr", IShellItemImageFactory, "Int64", height << 32 | width
                                                                                                , "Int", flag, "PtrP", hBitmap, "Int")
   ObjRelease(IShellItemImageFactory)
   Return hBitmap
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Смотри, что функция GetThumbnailOrIcon() возвращает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

Я видел по названию hBitmap. Но в меню работает только по типу HICON, HBITMAP не работает.

Если тут вместо PrivateExtractIcons вставить то что вернёт GetThumbnailOrIcon, то не работает, что то я запутался.

ico = 01.ico

icoINd := 0
align := 4
cx := cy := 32 

Gui, Add, Button, w32 h32 xm hwndhBtn
himl := DllCall("ImageList_Create", "UInt",cx, "UInt",cy, "UInt",0x20, "UInt",1, "UInt",5)
 
SplitPath, ico, , , ext
if (ext = "bmp") {
	hbmp := DllCall("LoadImage", "UInt",0, "Str", ico, "UInt",0, "UInt",cx, "UInt",cy, "UInt",0x10)
	DllCall("ImageList_Add", "UInt",himl, "UInt",hbmp, "UInt",0)
	DllCall("DeleteObject", "UInt", hbmp)
}
else {
	DllCall("PrivateExtractIcons", "Str", ico, "UInt", icoINd, "UInt",cx, "UInt",cy, "UIntP", hicon, "UInt",0, "UInt",1, "UInt",0)
 	DllCall("ImageList_AddIcon", "UInt",himl, "UInt",hicon)
	DllCall("DestroyIcon", "UInt", hicon) 
}

VarSetCapacity(struct, 24)
NumPut(himl, struct, 0, "UInt")
NumPut(align, struct, 20, "UInt")
; BCM_FIRST := 0x1600, BCM_SETIMAGELIST := BCM_FIRST + 0x2
PostMessage, 0x1602, 0, &struct, , ahk_id %hBtn%
Gui, Show 
return 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

serzh82saratov пишет:

что то я запутался.

Да, запутался, это неверно.

serzh82saratov пишет:

Но в меню работает только по типу HICON, HBITMAP не работает.

Надо было просто указать IMAGE_BITMAP.

Тогда как переделать пример из #23, чтобы работало выравнивание (align)?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25 (изменено: serzh82saratov, 2023-05-27 16:58:11)

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

ПС:
Разобрался, работает вместо LoadImage, почему то первые тесты с ней были не удачные.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26 (изменено: serzh82saratov, 2023-06-28 10:25:10)

Re: AHK: Убрать или заменить иконку в верхнем левом углу окна любой прог..

teadrinker пишет:

Так можно:

filePath := "D:\Downloads\Аватар Путь воды_2022_WEB-DLRip-AVC.mkv"
Gui, Add, Pic,, % "HBITMAP:" . GetThumbnailOrIcon(filePath, 48, 48, true)
Gui, Add, Pic, x+0 yp, % "HBITMAP:" . GetThumbnailOrIcon(filePath, 400)
Gui, Show
Return

GuiClose:
GuiEscape:
   ExitApp
   
GetThumbnailOrIcon(filePath, width, height := 0, iconOnly := false) {
   static IID_IShellItemImageFactory := "{BCC18B79-BA16-442F-80C4-8A59C30C463B}"
        , SIIGBF_BIGGERSIZEOK := 0x00000001
        , SIIGBF_ICONONLY     := 0x00000004
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("Ole32\IIDFromString", "WStr", IID_IShellItemImageFactory, "Ptr", &GUID)
   hr := DllCall("Shell32\SHCreateItemFromParsingName", "WStr", filePath, "Ptr", 0, "Ptr", &GUID, "PtrP", IShellItemImageFactory)
   if (hr != 0)
      Return 0
   flag := SIIGBF_BIGGERSIZEOK, (iconOnly && flag |= SIIGBF_ICONONLY)
   ; IShellItemImageFactory::GetImage
   DllCall(NumGet(NumGet(IShellItemImageFactory+0) + A_PtrSize*3), "Ptr", IShellItemImageFactory, "Int64", height << 32 | width
                                                                                                , "Int", flag, "PtrP", hBitmap, "Int")
   ObjRelease(IShellItemImageFactory)
   Return hBitmap
}

А возможно как то сделать, чтобы не было рамки черной вокруг значка, и не было инвертирования цветов?

https://i.imgur.com/cWeKLwO.png

Если использовать иконки в формате ICO, то всё отлично.



Menu, MyMenu, Add,  Мои документы, Return, +Break 
Menu, MyMenu, Icon, Мои документы, % "HBITMAP:" GetThumbnailOrIcon(A_MyDocuments, 512), , 48
Menu, MyMenu, Add,  Startup, Return
Menu, MyMenu, Icon, Startup, % "HBITMAP:" GetThumbnailOrIcon(A_Startup, 512), , 48
Menu, MyMenu, Color, C0C0C0
Menu, MyMenu, Show
Return
Return:
	Return
 
 
GetThumbnailOrIcon(filePath, width, height := 0, iconOnly := false) {
   static IID_IShellItemImageFactory := "{BCC18B79-BA16-442F-80C4-8A59C30C463B}"
        , SIIGBF_BIGGERSIZEOK := 0x00000001
        , SIIGBF_ICONONLY     := 0x00000004
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("Ole32\IIDFromString", "WStr", IID_IShellItemImageFactory, "Ptr", &GUID)
   hr := DllCall("Shell32\SHCreateItemFromParsingName", "WStr", filePath, "Ptr", 0, "Ptr", &GUID, "PtrP", IShellItemImageFactory)
   if (hr != 0)
      Return 0
   flag := SIIGBF_BIGGERSIZEOK, (iconOnly && flag |= SIIGBF_ICONONLY)
   ; IShellItemImageFactory::GetImage
   DllCall(NumGet(NumGet(IShellItemImageFactory+0) + A_PtrSize*3), "Ptr", IShellItemImageFactory, "Int64", height << 32 | width
                                                                                                , "Int", flag, "PtrP", hBitmap, "Int")
   ObjRelease(IShellItemImageFactory)
   Return hBitmap
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui