Тема: AHK: Изменение иконки окна GUI на панели задач (не в трее)
Вот таким образом изменяется иконка в трее, но на панели задач остаётся стандартная зелёная H, возможно ли её тоже изменить?
Menu, Tray, Icon, D:\hdd.ico
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Вот таким образом изменяется иконка в трее, но на панели задач остаётся стандартная зелёная H, возможно ли её тоже изменить?
Menu, Tray, Icon, D:\hdd.ico
IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_SMALL := 0
iconFile := "D:\hdd.ico"
Menu, Tray, Icon, % iconFile
hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)
Gui, +LastFound
SendMessage, WM_SETICON, ICON_SMALL, hIcon
Gui, Show, w300 h200
OnExit(Func("DestroyIcon").Bind(hIcon))
Return
DestroyIcon(hIcon) {
DllCall("DestroyIcon", Ptr, hIcon)
}
teadrinker
А у Вас работает? У меня этот код не запускается с ошибкой в пятой строке:
hIcon := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)
Обновите AHK, это новый синтаксис.
teadrinker
Вы правы, вот только изменились 2 иконки, в трее и слева сверху на рамке окна. На панели же задач стандартная H.
Проверил на Windows XP. Если сначала сменить иконку, а затем создать окно GUI, то новая иконка будет и на заголовке окна, и в панели задач. Но чтобы её изменить, придётся прибегнуть к команде GUI, Destroy.
У меня на Windows 7 работает. Ещё так можно попробовать:
IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_SMALL := 0, ICON_BIG := 1
iconFile := "D:\hdd.ico"
Menu, Tray, Icon, % iconFile
hIcon16 := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)
hIcon32 := LoadPicture(iconFile, "w32 h-1", IMAGE_ICON)
Gui, +LastFound
SendMessage, WM_SETICON, ICON_SMALL, hIcon16
SendMessage, WM_SETICON, ICON_BIG , hIcon32
Gui, Show, w300 h200
OnExit(Func("DestroyIcon").Bind(hIcon16, hIcon32))
Return
DestroyIcon(hIcon16, hIcon32) {
DllCall("DestroyIcon", Ptr, hIcon16)
DllCall("DestroyIcon", Ptr, hIcon32)
}
Если сначала сменить иконку, а затем создать окно GUI
Это как? У кого иконку менять, если окно не создано?
teadrinker
К сожалению, не работает, возможно, проблема на моей стороне, т.к. использую разные твики, в том числе 7+ Taskbar Tweaker.
Ещё так:
IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_SMALL := 0, ICON_BIG := 1
iconFile := "D:\hdd.ico"
Menu, Tray, Icon, % iconFile
hIcon16 := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)
hIcon32 := LoadPicture(iconFile, "w32 h-1", IMAGE_ICON)
Gui, +LastFound
SendMessage, WM_SETICON, ICON_SMALL, hIcon16,, ahk_id %A_ScriptHwnd%
SendMessage, WM_SETICON, ICON_BIG , hIcon32
Gui, Show, w300 h200
OnExit(Func("DestroyIcon").Bind(hIcon16, hIcon32))
Return
DestroyIcon(hIcon16, hIcon32) {
DllCall("DestroyIcon", Ptr, hIcon16)
DllCall("DestroyIcon", Ptr, hIcon32)
}
Тогда у всех окон скрипта будут такие иконки.
teadrinker
Забавно, включил в 7+ Taskbar Tweaker функцию показывать метки, и иконка появилась. Т.е. дело не в твикере, а иконки видны только на широких кнопках, причём с любым из Ваших кодов. Может быть, в 7 немного другая логика панели задач.
Ещё вариант:
IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_SMALL := 0, ICON_BIG := 1
iconFile := "D:\hdd.ico"
Menu, Tray, Icon, % iconFile
hIcon16 := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)
hIcon32 := LoadPicture(iconFile, "w32 h-1", IMAGE_ICON)
SendMessage, WM_SETICON, ICON_SMALL, hIcon16,, ahk_id %A_ScriptHwnd%
SendMessage, WM_SETICON, ICON_BIG , hIcon32,, ahk_id %A_ScriptHwnd%
Gui, Show, w300 h200
OnExit(Func("DestroyIcon").Bind(hIcon16, hIcon32))
Return
DestroyIcon(hIcon16, hIcon32) {
DllCall("DestroyIcon", Ptr, hIcon16)
DllCall("DestroyIcon", Ptr, hIcon32)
}
А лучше так:
IMAGE_ICON := 1, WM_SETICON := 0x80, ICON_SMALL := 0, ICON_BIG := 1
iconFile := "D:\hdd.ico"
Menu, Tray, Icon, % iconFile
hIcon16 := LoadPicture(iconFile, "w16 h-1", IMAGE_ICON)
hIcon32 := LoadPicture(iconFile, "w32 h-1", IMAGE_ICON)
DllCall("SendMessage", Ptr, A_ScriptHwnd, UInt, WM_SETICON, Ptr, ICON_SMALL, Ptr, hIcon16)
DllCall("SendMessage", Ptr, A_ScriptHwnd, UInt, WM_SETICON, Ptr, ICON_BIG, Ptr, hIcon32)
Gui, Show, w300 h200
OnExit(Func("DestroyIcon").Bind(hIcon16, hIcon32))
Return
DestroyIcon(hIcon16, hIcon32) {
DllCall("DestroyIcon", Ptr, hIcon16)
DllCall("DestroyIcon", Ptr, hIcon32)
}
teadrinker
Точно так же, когда виден лейбл (метка), тогда видна и иконка.
Я припоминаю, такое поведение видел когда-то на 8, когда пытался менять иконки. Поэтому AutoHotkey не виноват. Возможно мои какие-то твики/настройки являются причиной или такое поведение на 8.1 стандартно, просто нужен ещё пользователь с 8.1.
По идее, нормальное поведение, когда на панели задач та же иконка, что и в окне. Возможно, проблема в том, что скрипт не скомпилирован, ради интереса можете попробовать скомпилировать, указав иконку в качестве главной.
teadrinker
В 8.1, похоже, на панели задач она выставляет иконку от родительского .exe, я помню, пытался бороться с этим.
В 7+ Taskbar Tweaker есть функция "Изменить ID приложения" на "Random Group", т.е. панель задач не будет считать это приложение частью C:\Program Files\AutoHotkey\AutoHotkey.exe, так вот, оно меняет и иконку на "маленькой" кнопке. Но только до следующего запуска.
Возможно, проблема в том, что скрипт не скомпилирован, ради интереса можете попробовать скомпилировать, указав иконку в качестве главной.
Скомпилировал, иконка видна, и в опции "Изменить ID приложения", видно, что кнопка принадлежит этому новому exe. И открыл для себя кое-что новое, т.е. такие exe скрипты могут работать как полностью портативные приложения, без установленного AutoHotKey? И я давно хотел способ различать скрипты в диспетчере задач.
Это как? У кого иконку менять, если окно не создано?
Если в трее изменить иконку, то созданное после этого окно GUI и кнопка на панели задач так же будут с новой иконкой.
Скомпилировал, иконка видна
В скомпилированном скрипте уже не нужно всё описанное выше, достаточно просто создать окно, иконка будет, которая указана при компилировании.
такие exe скрипты могут работать как полностью портативные приложения, без установленного AutoHotKey?
Точно.
И я давно хотел способ различать скрипты в диспетчере задач.
Смотрите столбец «Командная строка».
Если в трее изменить иконку, то созданное после этого окно GUI и кнопка на панели задач так же будут с новой иконкой.
Не знал, но у меня в коде выше и так иконка в трее меняется до создания окна.
teadrinker
Да, точно, скомпилировал другие. Портативность это вообще отлично, ведь, с помощью AHK, каких только утилит можно наделать. А есть подводные камни, при запуске 10-15 портативных скриптов, хуже производительность и т.д.? Спасибо, командную строку то я упустил ибо чтобы увидеть адреса, нужно диспетчер сильно расширить.
А есть подводные камни, при запуске 10-15 портативных скриптов, хуже производительность и т.д.?
Не сталкивался, лишь бы оперативной памяти хватило.
teadrinker
Спасибо, буду использовать.
Чтобы не создавать новую тему, спрошу здесь, а возможно ли в скомпилированный .exe закинуть иконку, используемую в GUI?
В exe-файлах можно менять иконки с помощью инструментов для работы с ресурсами (ResHacker или Restorator например). Можно и программно, конечно.
teadrinker
Дело немного в другом, в скрипте в GUI используется изображение (Gui, Add, Picture,, D:\hdd.ico), вот хотелось бы его упаковать в сам exe или нельзя так?
Честно говоря, не совсем понял, в чём проблема. Любую иконку можно упаковать в exe.
Иконка, да, но я о изображении, которое показывается в окне GUI. Т.е. если я его удаляю, в GUI останется просто ссылка D:\Загрузки\disk2.ico
Вот например:
Gui, Add, Text,, Диск (W:) в работе
Gui, Show, Restore w450 h300
Gui, Add, Picture, x0 y0 h350 w450, D:\Загрузки\disk2.ico
return ; Окончание секции авто-выполнения. Скрипт ожидает каких-нибудь действий пользователя.
GuiClose:
ExitApp
В смысле, вопрос в том, можно ли показывать иконку из exe, как картинку?
Нет, вопрос в том, можно ли упаковать дополнительные ресурсы (в данном случае изображение) в exe, чтобы была полноценная портативность. Хотя ответ на Ваш вопрос тоже бы хотелось услышать.
Так я же уже отвечал, что можно. На мой вопрос — тоже можно.
А как? Я думал в самом коде нужно прописать вместо D:\Загрузки\disk2.ico, какой-то переменный путь? Или ResHacker-ом добавить?
Для начала, я никак не могу понять, о каком изображении идёт речь, об иконке, или каком-то другом типе. В каждом случае образ действий будет разный, с иконкой проще.
Иконка, добавляемая в файл, имеет порядковый номер, нужно его заранее прикинуть и прописать в коде, потом уже добавить ResHacker'ом.
Например, в AutoHotkey.exe есть в ресурсах пять файлов с иконками. Чтобы показать любую из них в качестве картинки, нужно просто указать её номер:
Gui, Add, Pic, Icon1, % A_AhkPath
Gui, Show, w200 h100
Если мы добавим туда ещё иконку, её номер будет 6.
Я думал в самом коде нужно прописать вместо D:\Загрузки\disk2.ico
Путь в данном случае будет A_ScriptFullPath — путь к файлу самого скрипта.
teadrinker
Спасибо, я не учёл, что для разных типов графики есть отличия, попробую поэкспериментировать.
Также есть команда FileInstall, при использовании которой во время компиляции добавляется в ресурсы указанный файл, а при запуске скомпилированного файла распаковывается из ресурсов в указанную директорию.
teadrinker
Спасибо, это то, что нужно, действительно удобней так.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться