1 (изменено: Androgen, 2007-01-10 12:27:05)

Тема: Замена значков AutoHotkey на более красивые

AutoHotkey мне понравился сразу. И так же сразу мне не понравились его иконки (значки в трее, на панели задач, значки скриптов). Категорически! Даже как-то язык с трудом поворачивается говорить "значки" про ЭТО. Так что осваивать AutoHotkey я начал с рисования для него других значков . Собственно, я не дизайнер (хотя в фотошопе иногда что-нибудь ковыряю), но даже то, что получилось у меня - лучше того что было (несколько человек юзают мои значки) . Я расскажу как легко можно изменить "значки" AutoHotkey'я на любые другие, например, мои (прилагаются).

Варианта два. Простой (для замены только значков скриптов AHK) и чуть более сложный (для переделки самого AutoHotkey'я).
Сначала простой вариант:
Скачиваете прилагаемый Icons.zip. В нём - папка Icons, а в ней - два значка. Один для скриптов, другой для них же откомпилированных из контекстного меню. Это удобно. Сразу видна разница. Помещаете папку Icons в папку с установленным AutoHotkey'ем. И запускаете прилагаемый reg-файлик (загляните в него, у вас эти пути?). Всё готово. Теперь у скриптов будут другие, более красивые значки.

Один пост - одно прикрепление, поэтому смотрим далее...

Post's attachments

Icons.zip 26.35 kb, 1432 downloads since 2007-01-10 

You don't have the permssions to download the attachments of this post.
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).

2 (изменено: Androgen, 2007-04-14 01:13:45)

Re: Замена значков AutoHotkey на более красивые

Теперь более сложный вариант (но ИМХО оно того стоит):
Скачиваете прилагаемый архивчик AHK_Res.zip. В нём - 5 значков. Ими мы сейчас заменим страшненькие исходные.
Ниже идёт описание того, как это можно сделать руками. А в посте #4 - скрипт для автоматической замены значков.

Для начала нужно разжать AutoHotkey.exe (он пожат UPX'ом). С AutoHotkey поставляется UPX v1.25, но он не подойдет: сам AutoHotkey упакован более поздним UPX'ом. Поэтому качаем (247 kB) версию поновее. Кстати, им можно заменить старую версию (...\AutoHotkey\Compiler\upx.exe) и компилированные скрипты будут сжиматься чуть лучше.
Итак, архив с UPX'ом скачали-распаковали. Теперь копируем файл AutoHotkey.exe в папку с UPX'ом (так проще), и выполняем команду на разжатие AutoHotkey:
upx -d AutoHotkey.exe
Теперь разжатый AutoHotkey.exe можно редактировать. Открываем его в ResHacker'е (если у вас его почему-то нет, то настоятельно рекомендую обзавестись этой чудесной утилитой: хотя проект уже сто лет как закрыт, им можно делать то, чего не могут его более современные и маститые собратья, например, PE Explorer). Итак, открыли, переходим в секцию "Icon Group". Именно здесь мы и будем заменять значки. Открываем группу 159. Там лежит главный значок AutoHotkey. Ставим курсор на ресурс 1033, и выбираем из контекстного меню "Replace Resource". Нажимаем кнопку "Open file with new icon..." и указываем значок AHK.159.ico из архивчика №2. Нажимаем кнопку "Replace". Теперь проделываем то же самое для групп 160, 206, 207, 208 (указывая для них значки с соответствующим номером). Группы 228, 229 – оставляем, как есть. Теперь: "File"->"Save". Всё готово. Можно заменять полученным AutoHotkey.exe исходный. А можно сжать его (как и было), чтобы размер был поменьше. Для этого выполняем команду:
upx --best --compress-icons=0 AutoHotkey.exe
Теперь всё готово окончательно. Заменяем исходный AutoHotkey.exe и наслаждаемся.
Может показаться, что это слишком долго и нудно, однако все процедуры (при некотором навыке и рассудительной неторопливости) занимают меньше минуты, поэтому переделать вновь вышедшую версию AutoHotkey (обновляющегося очень регулярно) не составит труда. И глаз будет радоваться, а скрипты литься как песня .

Примечание 1: Значки имеют все обычные форматы.
Примечание 2: в архивчик №2 не включён значок для откомпилированных скриптов, поэтому, если вы, как и я, полагаете, что это удобно, то качайте оба архивчика.

Для прояснения некоторых деталей, можно ещё почитать эту статейку.

Если вы хотите менять значки внутри откомпилированных скриптов, то читаем далее...

Post's attachments

AHK_Res.zip 32.02 kb, 1015 downloads since 2007-01-10 

You don't have the permssions to download the attachments of this post.
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).

3 (изменено: Androgen, 2007-04-14 01:11:36)

Re: Замена значков AutoHotkey на более красивые

По просьбе The gray Cardinal'а заменил ссылку на топик, где мы с Ludens обсуждаем эту тему, на текст ниже:

Откомпилированный AHK-скрипт (в виде exe-файла) может содержать только один значок - тот, который будет виден в Windows Explorer'e. При желании его можно показывать и в трее, указав в коде скрипта:

Menu Tray, Icon, %A_ScriptFullPath%

А вот что делать, если хочется динамически менять значки в трее во время работы скрипта?
Можно поступить так:

Вариант первый (очевидный):
Поместить каждый из используемых значков в отдельный ico-файл. И вызывать их обычным образом.
Недостаток: вместе со скриптом нужно носить эти отдельные значки.

Вариант второй (столь же очевидный): собрать все те значки, которые планируется использовать в скрипте, в одну DLL. (Это делается какой-нибудь заточенной под это прогой, например, IconWorkshop). И обращаться из скрипта к значку по её номеру в DLL.
Недостаток: вместе со скриптом нужно носить эту dll-шку, а это немногим лучше, чем носить отдельные значки.

Вариант третий (очевидный, но не столь) : использовать команду FileInstall. Она при компиляции поместит указанные значки в экзешник. А при запуске этого экзешника распакует их в указанную папку. После чего ими уже можно пользоваться примерно так:

FileInstall, D:\MyIcons\UnZip.ico, %A_Temp%\UnZip.ico

Недостаток: временные файлы из папки TEMP могут быть удалены (сторонней прогой, например) прямо в процессе выполнения скрипта. Тогда скрипт обломается загрузить нужный значок. Это нужно учитывать в скрипте. Заодно нужно не забыть убрать за собой мусор: OnExit

Вариант четвертый (самый геморный, но, в некоторых случаях, наиболее удобный):
Открыть файл ...AutoHotkey\Compiler\AutoHotkeySC.bin, например, ResHacker'ом и навтыкать туда нужные значки ("Action"->"Add a new Resource..."). Тогда эти значки будут в откомпилированном скрипте. И обращаться к ним можно обычным образом (по номеру в группе).
Недостаток: нужна некоторая сноровка, чтобы ещё до компиляции прикинуть какой номер будет у значка в откомпилированном скрипте.

Ценное добавление от Ludens:
Собственно, значки туда можно даже не добавлять, а просто заменять уже имеющиеся: их там целых семь штук, все семеро компилятор все равно в обязательном порядке помещает в финальный .exe-файл, хотя в отлаженном скрипте эти значки, как правило, вообще не нужны. Поэтому можно заменить их хоть все (так, как я описывал выше, прим. Androgen) и обращаться из скрипта к любой из них:

Menu Tray, Icon, %A_ScriptFullPath%, N

где N -- порядковый номер от от 1 до 7.
Этих семи мест, на мой вкус, вполне хватает даже для небольшой анимации в трее. Способ, конечно, не самый перфектный, но, покуда нет другого, можно держать по отдельному экземпляру AutoHotkeySC.bin для каждого проекта. 
Кстати, это позволяет вставлять в итоговый exe-файл не только специальные иконки, но и специальные данные для его Properties (тех, что видны из Windows Explorer) - имя производителя, номер версии и т. п. Эти вещи тоже невозможно задать штатными средствами AHK, но их можно поменять в AutoHotkeySC.bin.

А вообще, Крис уже давно обещает решить эту проблемку, но пока - увы...

Дополнено 14.04.2007
А вот и не "увы". Теперь помещать значки в уже откомпилированный скрипт и прописывать в него информацию о версии можно проще простого. Чел под именем Talon сделал скрипт с GUI для этого. Скрипт делает всё то, что описано здесь (в посте #3), но не через ковыряние руками, а через удобный интерфейс. Можно сохранять и загружать различные проекты буквально парой кликов. Очень удобно. Рекомендую. Взять можно здесь. Для работы скрипта требуется ResHacker.

Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).

4

Re: Замена значков AutoHotkey на более красивые

Оказалось, что ResHacker может работать из командной строки (где были мои глаза?). Вооружившись этим знанием, я накатал скриптец, который меняет значки в самом AutoHotkey.exe, как это описано в посте #2. Скрипт нужно положить рядом со значками из архива AHK_Res.zip (см. пост #2), или значки положить в подпапку относительно скрипта (у меня это папка "Icons", но, разумеется, имя можно задать любое). Для работы скрипта требуется ResHacker и UPX (ссылка есть в посте #2).
Вот этот скрипт (он прилагается отдельным архивчиком):

;*******************************************************************************
; AutoHotkey Version:    1.0.46.06+
; Автор:                Androgen Belkin
; Имя скрипта:            NiceIcon4AHK.ahk (v.1.0)
;*******************************************************************************
; Скрипт заменяет значки в файле AutoHotkey.exe на указанные вами.
; Значки могут лежать рядом со скриптом или в указанной подпапке.
;*******************************************************************************
;~ #NoTrayIcon   ; не отображать значок скрипта в трее
#NoEnv        ; запрещаем имена переменных как у переменных окружения

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
ResHacker_Path = d:\Program_2\ResHack\ResHacker.exe
UPX_Path = d:\Program_2\AutoHotkey\Compiler\upx.exe
IconDir = Icons ; имя подпапки со значками (относительно скрипта)
IconForReplace = 159|160|206|207|208 ; перечень заменяемых значков
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========

IfNotExist, %ResHacker_Path%
{
    MsgBox, ,Внимание,
    ( LTrim
    Не задан или задан неверно путь ResHacker.exe:
    "%ResHacker_Path%"
    Скрипт прерывает работу.
    )
    ExitApp ; конец скрипта
}
IfNotExist, %UPX_Path%
{
    MsgBox, ,Внимание,
    ( LTrim
    Не задан или задан неверно путь upx.exe:
    "%UPX_Path%"
    Скрипт прерывает работу.
    )
    ExitApp ; конец скрипта
}
If NOT A_AhkPath ; не найден AutoHotkey.exe
{
    MsgBox, 16, Внимание,
    ( LTrim
    Не могу найти AutoHotkey.exe
    Скрипт прерывает работу.
    )
    ExitApp ; конец скрипта
}
SplitPath, A_AhkPath,, AhkDir, AhkExt, AhkExeName ; получаем имя AutoHotkey.exe (а вдруг переименовали)
Temp_AHK = %AhkDir%\%AhkExeName%_(NEW).%AhkExt% ; задаём имя временного файла, с которым будем оперировать

UPX_Log = %A_Temp%\UPX_Log.txt ; лог для проверки возможности распаковки AutoHotkey.exe
RunWait, %comspec% /c ""%UPX_Path%" -t "%A_AhkPath%" >"%UPX_Log%"",, Hide ; тестируем AutoHotkey.exe
Loop, read, %UPX_Log% ; читаем лог теста
{
    IfInString, A_LoopReadLine, testing %A_AhkPath% [OK] ; если тест прошел нормально, то...
        Test_OK := True ; выставить флаг
}
If NOT Test_OK ; если тест прошёл неудачно
{
    MsgBox, 16, Внимание,
    ( LTrim
    Для распаковки AutoHotkey.exe
    Нужен более новый UPX.exe
    Скрипт прерывает работу.
    )
    ExitApp ; конец скрипта
}

FileDelete, %Temp_AHK% ; удаляем уже возможно имеющийся временный файл
RunWait, %UPX_Path% -d %A_AhkPath% -o %Temp_AHK%,, Hide ; разжимаем AutoHotkey.exe
If ErrorLevel = 2
{
    MsgBox, 16, Внимание,
    ( LTrim
    Не удалось разжать AutoHotkey.exe,
    т.к. он уже разжат.
    Скрипт прерывает работу.
    )
    ExitApp ; конец скрипта
}
Loop, parse, IconForReplace, | ; парсим список заменяемых значков
{
    IfExist, AHK.%A_LoopField%.ico ; если значок рядом со скриптом
        RunWait, %ResHacker_Path% -addoverwrite %Temp_AHK%`, %Temp_AHK%`, AHK.%A_LoopField%.ico`, icon`, %A_LoopField%`,
    Else
        IfExist, %IconDir%\AHK.%A_LoopField%.ico ; если значок в назначенной подпапке
            RunWait, %ResHacker_Path% -addoverwrite %Temp_AHK%`, %Temp_AHK%`, %IconDir%\AHK.%A_LoopField%.ico`, icon`, %A_LoopField%`,
}

FileDelete, %UPX_Log% ; удаляем лог
RunWait, %UPX_Path% --best --compress-icons=0 %Temp_AHK%,, Hide ; сжимаем AutoHotkey.exe

AHK_BackUp = %AhkDir%\%AhkExeName%_(OLD).%AhkExt% ; имя откатного AutoHotkey.exe

MsgBox, 4, Замена прошла успешно!,
( LTrim
Файл с новыми значками сохранён с именем:
%Temp_AHK%

Хотите переименовать его в:
%A_AhkPath% ?

Если вы выберете ДА, то все запущенные скрипты будут закрыты.
Прежний %AhkExeName% будет сохранён с именем:
%AHK_BackUp%

)
IfMsgBox, Yes
{
    FileCopy, %A_AhkPath%, %AHK_BackUp%, 1 ; сохраняем прежний AutoHotkey.exe
    TMP_Script = %A_Temp%\TMP_Script.ahk
    FileDelete, %TMP_Script% ; удаляем временный скрипт (на всякий)
    FileAppend, ; пишем временный скрипт
    ( LTrim Comments
        DetectHiddenWindows, On ; искать в скрытых окнах
        WinGet, Array_id, list, ahk_class %AhkExeName% ; получить в массив список всех окон класса AutoHotkey
        Loop, `%Array_id`% ; пройтись по всему массиву окон
        {
            WinGet, CurPid, PID, `% "ahk_id" Array_id`%A_Index`% ; получить PID обрабатываемого окна
            If ( CurPid = DllCall( "GetCurrentProcessId" ) ) ; если процесс принадлежит текущему скрипту
                Continue ; не трогаем его
            WinClose, `% "ahk_id" Array_id`%A_Index`%
        }
        FileMove, %Temp_AHK%, %A_AhkPath%, 1 ; заменить AutoHotkey.exe новым
        MsgBox, 0, Поздравляю!, Теперь %AhkExeName%.%AhkExt% с новыми значками.
        FileDelete, %TMP_Script% ; удаляем временный скрипт (самого себя)
    ), %TMP_Script%
    Run, "%AHK_BackUp%" "%TMP_Script%" ; запускаем временный скрипт
}
Post's attachments

NiceIcon4AHK.zip 2 kb, 847 downloads since 2007-04-14 

You don't have the permssions to download the attachments of this post.
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).