Переключение иконки в AutoHotkey v1
Цитата: Имир от 20.06.2025, 19:42Добрый вечер. Подскажите, пожалуйста, как сделать так, чтобы иконки AutoHotkey переключались в трее в зависимости от состояния скрипта (запущен/остановлен).
AutoHotkey.ini:
Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт Menu, Tray, Icon, Shell32.dll, 131 scriptEnabled := true $RButton:: KeyWait, RButton, T0.5 If (ErrorLevel == 0) Send {RButton} Else { Send ^{vk56sc02f} } return ToggleScript: scriptEnabled := !scriptEnabled if scriptEnabled { Menu, Tray, Rename, Включить скрипт, Отключить скрипт } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт } return ExitScript: ExitApp return
Добрый вечер. Подскажите, пожалуйста, как сделать так, чтобы иконки AutoHotkey переключались в трее в зависимости от состояния скрипта (запущен/остановлен).
AutoHotkey.ini:
Menu, Tray, NoStandard
Menu, Tray, Add, Отключить скрипт, ToggleScript
Menu, Tray, Add, Выход, ExitScript
Menu, Tray, Default, Отключить скрипт
Menu, Tray, Icon, Shell32.dll, 131
scriptEnabled := true
$RButton::
KeyWait, RButton, T0.5
If (ErrorLevel == 0)
Send {RButton}
Else
{
Send ^{vk56sc02f}
}
return
ToggleScript:
scriptEnabled := !scriptEnabled
if scriptEnabled {
Menu, Tray, Rename, Включить скрипт, Отключить скрипт
} else {
Menu, Tray, Rename, Отключить скрипт, Включить скрипт
}
return
ExitScript:
ExitApp
return
Цитата: Mikhail от 21.06.2025, 05:05Имир, Привет.
Исправленный код, так как твой не работал вообще, что включенный работал, что выключенный работал....
Иконки пропишешь свои и нужно будет изменить иконку самого exe файла, открыть в редакторе ресурсов, у меня это RisohEditor, ищешь иконку и заменяешь на свою, это главная иконка которая появляется в трее при запуске.#SingleInstance force Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт scriptEnabled := true Hotkey, $RButton, RButtonHandler, On return RButtonHandler: KeyWait, RButton, T0.5 if (ErrorLevel == 0) Send {RButton} else Send ^{vk56sc02f} return ToggleScript: scriptEnabled := !scriptEnabled if (scriptEnabled) { Menu, Tray, Rename, Включить скрипт, Отключить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\2.ico Hotkey, $RButton, On } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\1.ico Hotkey, $RButton, Off } return ExitScript: ExitApp return
Имир, Привет.
Исправленный код, так как твой не работал вообще, что включенный работал, что выключенный работал....
Иконки пропишешь свои и нужно будет изменить иконку самого exe файла, открыть в редакторе ресурсов, у меня это RisohEditor, ищешь иконку и заменяешь на свою, это главная иконка которая появляется в трее при запуске.
#SingleInstance force
Menu, Tray, NoStandard
Menu, Tray, Add, Отключить скрипт, ToggleScript
Menu, Tray, Add, Выход, ExitScript
Menu, Tray, Default, Отключить скрипт
scriptEnabled := true
Hotkey, $RButton, RButtonHandler, On
return
RButtonHandler:
KeyWait, RButton, T0.5
if (ErrorLevel == 0)
Send {RButton}
else
Send ^{vk56sc02f}
return
ToggleScript:
scriptEnabled := !scriptEnabled
if (scriptEnabled) {
Menu, Tray, Rename, Включить скрипт, Отключить скрипт
Menu, Tray, Icon, C:\Users\Admin\Desktop\2.ico
Hotkey, $RButton, On
} else {
Menu, Tray, Rename, Отключить скрипт, Включить скрипт
Menu, Tray, Icon, C:\Users\Admin\Desktop\1.ico
Hotkey, $RButton, Off
}
return
ExitScript:
ExitApp
return
Цитата: Имир от 01.07.2025, 18:36Извините за долгий ответ, были какие-то проблемы с доступом на сайт.
Спасибо огромнейшее! Добавил код для копирования и получилась классная утилита, для тех, кто постоянно что-то копипастит) Проверьте, пожалуйста, если не сложно! Возможно, что-то стоит переделать/улучшить/доработатьЦитата: Mikhail от 21.06.2025, 05:05Имир, Привет.
Исправленный код, так как твой не работал вообще, что включенный работал, что выключенный работал....
Иконки пропишешь свои и нужно будет изменить иконку самого exe файла, открыть в редакторе ресурсов, у меня это RisohEditor, ищешь иконку и заменяешь на свою, это главная иконка которая появляется в трее при запуске.#SingleInstance forceMenu, Tray, NoStandardMenu, Tray, Add, Отключить скрипт, ToggleScriptMenu, Tray, Add, Выход, ExitScriptMenu, Tray, Default, Отключить скриптscriptEnabled := trueHotkey, $RButton, RButtonHandler, OnreturnRButtonHandler:KeyWait, RButton, T0.5if (ErrorLevel == 0)Send {RButton}elseSend ^{vk56sc02f}returnToggleScript:scriptEnabled := !scriptEnabledif (scriptEnabled) {Menu, Tray, Rename, Включить скрипт, Отключить скриптMenu, Tray, Icon, C:\Users\Admin\Desktop\2.icoHotkey, $RButton, On} else {Menu, Tray, Rename, Отключить скрипт, Включить скриптMenu, Tray, Icon, C:\Users\Admin\Desktop\1.icoHotkey, $RButton, Off}returnExitScript:ExitAppreturn#SingleInstance force Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт scriptEnabled := true Hotkey, $RButton, RButtonHandler, On return RButtonHandler: KeyWait, RButton, T0.5 if (ErrorLevel == 0) Send {RButton} else Send ^{vk56sc02f} return ToggleScript: scriptEnabled := !scriptEnabled if (scriptEnabled) { Menu, Tray, Rename, Включить скрипт, Отключить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\2.ico Hotkey, $RButton, On } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\1.ico Hotkey, $RButton, Off } return ExitScript: ExitApp return#SingleInstance force Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт scriptEnabled := true Hotkey, $RButton, RButtonHandler, On return RButtonHandler: KeyWait, RButton, T0.5 if (ErrorLevel == 0) Send {RButton} else Send ^{vk56sc02f} return ToggleScript: scriptEnabled := !scriptEnabled if (scriptEnabled) { Menu, Tray, Rename, Включить скрипт, Отключить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\2.ico Hotkey, $RButton, On } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\1.ico Hotkey, $RButton, Off } return ExitScript: ExitApp return
Извините за долгий ответ, были какие-то проблемы с доступом на сайт.
Спасибо огромнейшее! Добавил код для копирования и получилась классная утилита, для тех, кто постоянно что-то копипастит) Проверьте, пожалуйста, если не сложно! Возможно, что-то стоит переделать/улучшить/доработать
Цитата: Mikhail от 21.06.2025, 05:05Имир, Привет.
Исправленный код, так как твой не работал вообще, что включенный работал, что выключенный работал....
Иконки пропишешь свои и нужно будет изменить иконку самого exe файла, открыть в редакторе ресурсов, у меня это RisohEditor, ищешь иконку и заменяешь на свою, это главная иконка которая появляется в трее при запуске.#SingleInstance forceMenu, Tray, NoStandardMenu, Tray, Add, Отключить скрипт, ToggleScriptMenu, Tray, Add, Выход, ExitScriptMenu, Tray, Default, Отключить скриптscriptEnabled := trueHotkey, $RButton, RButtonHandler, OnreturnRButtonHandler:KeyWait, RButton, T0.5if (ErrorLevel == 0)Send {RButton}elseSend ^{vk56sc02f}returnToggleScript:scriptEnabled := !scriptEnabledif (scriptEnabled) {Menu, Tray, Rename, Включить скрипт, Отключить скриптMenu, Tray, Icon, C:\Users\Admin\Desktop\2.icoHotkey, $RButton, On} else {Menu, Tray, Rename, Отключить скрипт, Включить скриптMenu, Tray, Icon, C:\Users\Admin\Desktop\1.icoHotkey, $RButton, Off}returnExitScript:ExitAppreturn#SingleInstance force Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт scriptEnabled := true Hotkey, $RButton, RButtonHandler, On return RButtonHandler: KeyWait, RButton, T0.5 if (ErrorLevel == 0) Send {RButton} else Send ^{vk56sc02f} return ToggleScript: scriptEnabled := !scriptEnabled if (scriptEnabled) { Menu, Tray, Rename, Включить скрипт, Отключить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\2.ico Hotkey, $RButton, On } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\1.ico Hotkey, $RButton, Off } return ExitScript: ExitApp return#SingleInstance force Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт scriptEnabled := true Hotkey, $RButton, RButtonHandler, On return RButtonHandler: KeyWait, RButton, T0.5 if (ErrorLevel == 0) Send {RButton} else Send ^{vk56sc02f} return ToggleScript: scriptEnabled := !scriptEnabled if (scriptEnabled) { Menu, Tray, Rename, Включить скрипт, Отключить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\2.ico Hotkey, $RButton, On } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт Menu, Tray, Icon, C:\Users\Admin\Desktop\1.ico Hotkey, $RButton, Off } return ExitScript: ExitApp return
Цитата: Имир от 26.09.2025, 15:12Mikhail, добрый день! Помогите, пожалуйста! Дописал скрипт, чтобы действие бесконечно повторялось пока удерживается кнопка. Задержка между действиями 1000 мс. Но мне нужно чтобы задержка была сперва однократно
1000 мс, а потом бесконечно200 мс. Не знаю, как это реализовать(
P.S. Кстати, сделал, как вы мне и говорили, заменил иконкуAutoHotkeyвRisohEditorна свою. Спасибо большое! Получилась вот такая красота!RButtonHandler: KeyWait, RButton, T0.5 if (ErrorLevel == 0) Send {RButton} else Loop { Send ^{vk56sc02f} Sleep 1000 If !GetKeyState("RButton", "P") break } return
Mikhail, добрый день! Помогите, пожалуйста! Дописал скрипт, чтобы действие бесконечно повторялось пока удерживается кнопка. Задержка между действиями 1000 мс. Но мне нужно чтобы задержка была сперва однократно Скопировано1000 мс, а потом бесконечно Скопировано200 мс. Не знаю, как это реализовать(
P.S. Кстати, сделал, как вы мне и говорили, заменил иконку СкопированоAutoHotkey в СкопированоRisohEditor на свою. Спасибо большое! Получилась вот такая красота!
RButtonHandler:
KeyWait, RButton, T0.5
if (ErrorLevel == 0)
Send {RButton}
else
Loop
{
Send ^{vk56sc02f}
Sleep 1000
If !GetKeyState("RButton", "P")
break
}
return
Цитата: Mikhail от 26.09.2025, 15:28Имир, Привет.
RButton:: KeyWait, RButton, T0.5 if (ErrorLevel == 0) { Send {RButton} } else { first := true Loop { Send ^{vk56sc02f} if (first) { Sleep 1000 first := false } else { Sleep 200 } if !GetKeyState("RButton", "P") break } } return
Имир, Привет.
RButton::
KeyWait, RButton, T0.5
if (ErrorLevel == 0) {
Send {RButton}
} else {
first := true
Loop {
Send ^{vk56sc02f}
if (first) {
Sleep 1000
first := false
} else {
Sleep 200
}
if !GetKeyState("RButton", "P")
break
}
}
return
Цитата: Имир от 26.09.2025, 16:24Mikhail, исправил
RButton::наRButtonHandler:, всё заработало! Огромное спасибо за помощь!
Mikhail, исправил СкопированоRButton:: на СкопированоRButtonHandler:, всё заработало! Огромное спасибо за помощь!
Цитата: Имир от 26.09.2025, 17:33Mikhail, извините, а можно поместить в
exe-файлобе иконки? И как в таком случае должен выглядетьini-файл? Сейчасini-файл, за исключением самого скрипта, у меня выглядит вот так:#SingleInstance force Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт Menu, Tray, Icon, 1.ico scriptEnabled := true -------------------------------------------------------- ToggleScript: scriptEnabled := !scriptEnabled if (scriptEnabled) { Menu, Tray, Rename, Включить скрипт, Отключить скрипт Menu, Tray, Icon, 1.ico } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт Menu, Tray, Icon, 2.ico } return ExitScript: ExitApp return
Mikhail, извините, а можно поместить в Скопированоexe-файл обе иконки? И как в таком случае должен выглядеть Скопированоini-файл? Сейчас Скопированоini-файл, за исключением самого скрипта, у меня выглядит вот так:
#SingleInstance force
Menu, Tray, NoStandard
Menu, Tray, Add, Отключить скрипт, ToggleScript
Menu, Tray, Add, Выход, ExitScript
Menu, Tray, Default, Отключить скрипт
Menu, Tray, Icon, 1.ico
scriptEnabled := true
--------------------------------------------------------
ToggleScript:
scriptEnabled := !scriptEnabled
if (scriptEnabled) {
Menu, Tray, Rename, Включить скрипт, Отключить скрипт
Menu, Tray, Icon, 1.ico
} else {
Menu, Tray, Rename, Отключить скрипт, Включить скрипт
Menu, Tray, Icon, 2.ico
}
return
ExitScript:
ExitApp
return
Цитата: Mikhail от 26.09.2025, 17:52Имир, Да ничего можно не менять, просто в ResourceHacker отредактируй у exe(скомпилированного ahk) файла все иконки под себя и все.
Имир, Да ничего можно не менять, просто в ResourceHacker отредактируй у exe(скомпилированного ahk) файла все иконки под себя и все.
Цитата: Mikhail от 26.09.2025, 18:14А, я понял, ты про то, что ты собрал с иконками и exe файл который запускает ini файл, который на самом деле ahk😅, никак тогда не сделать, все что ты укажешь в ini файле, который на самом деле ahk, твой exe, будет запускать как ini файл, а ini файл не умеет шариться в exe за иконками), а так если это был бы ahk скомпилированный в exe, то, просто заменить на
Menu, Tray, Icon, %A_ScriptFullPath%, 1, цифра в конце, номер иконки в icongroup в exe файле, тогда он будет искать иконку у себя.
А, я понял, ты про то, что ты собрал с иконками и exe файл который запускает ini файл, который на самом деле ahk😅, никак тогда не сделать, все что ты укажешь в ini файле, который на самом деле ahk, твой exe, будет запускать как ini файл, а ini файл не умеет шариться в exe за иконками), а так если это был бы ahk скомпилированный в exe, то, просто заменить на СкопированоMenu, Tray, Icon, %A_ScriptFullPath%, 1, цифра в конце, номер иконки в icongroup в exe файле, тогда он будет искать иконку у себя.
Цитата: Имир от 26.09.2025, 18:47Mikhail, всё, понял теперь)) Спасибо! Ещё по поводу скрипта, заметил, что если быстро отпустить
ПКМпосле выполнения скрипта и снова нажать и удерживать, то скрипт не начнётся с начала, а как бы продолжится. То есть скрипт отработает до первой задержки в1000 мс(Sleep 1000), а после отпусканияПКМи второго нажатия он сразу начнёт выполняться с задержкой200 мс(Sleep 200). Как бы это пофиксить?
Mikhail, всё, понял теперь)) Спасибо! Ещё по поводу скрипта, заметил, что если быстро отпустить СкопированоПКМ после выполнения скрипта и снова нажать и удерживать, то скрипт не начнётся с начала, а как бы продолжится. То есть скрипт отработает до первой задержки в Скопировано1000 мс (Sleep 1000), а после отпускания СкопированоПКМ и второго нажатия он сразу начнёт выполняться с задержкой Скопировано200 мс (Sleep 200). Как бы это пофиксить?
Цитата: Mikhail от 27.09.2025, 03:43Имир, Скрипт должен по идее работать как
RButton::, Gif записал, работает все как нужно.
Если мгновенно отпустить и нажать снова мгновенно, то да, продолжает, скрипт не успел еще завершиться.
Имир, Скрипт должен по идее работать как СкопированоRButton::, Gif записал, работает все как нужно.
Если мгновенно отпустить и нажать снова мгновенно, то да, продолжает, скрипт не успел еще завершиться.
Цитата: Имир от 27.09.2025, 17:54Mikhail, добрый вечер! У меня именно так и работает! Спасибо огромное! Незаменимая вещь для тех, кто часто и очень много работает с текстом! По сути это полностью ваша программа) Весь скрипт сделан вами и вами же доработан) Осталось придумать название и иконку)
Вот, что получилось, если конечно я ничего не накосячил:
[spoiler title="Спойлер"]#SingleInstance force Menu, Tray, NoStandard Menu, Tray, Add, Отключить скрипт, ToggleScript Menu, Tray, Add, Выход, ExitScript Menu, Tray, Default, Отключить скрипт Menu, Tray, Icon, 1.ico scriptEnabled := true RButton:: KeyWait, RButton, T0.5 if (ErrorLevel == 0) { Send {RButton} } else { first := true Loop { Send ^{vk56sc02f} if (first) { Sleep 1000 first := false } else { Sleep 200 } if !GetKeyState("RButton", "P") break } } return ~LButton:: if scriptEnabled { TimeButtonDown = %A_TickCount% Loop { Sleep 10 GetKeyState, LButtonState, LButton, P if LButtonState = U break elapsed = %A_TickCount% elapsed -= %TimeButtonDown% if elapsed > 200 { clip0 := ClipBoardAll MouseGetPos x0, y0 Loop { Sleep 20 GetKeyState keystate, LButton IfEqual keystate, U, { MouseGetPos x, y break } } if (x-x0 > 5 or x-x0 < -5 or y-y0 > 5 или y-y0 < -5) { Send ^{vk43sc02e} ClipWait 1, 1 IfEqual ClipBoard,, SetEnv ClipBoard, %clip0% } return } } } return ToggleScript: scriptEnabled := !scriptEnabled if (scriptEnabled) { Menu, Tray, Rename, Включить скрипт, Отключить скрипт Menu, Tray, Icon, 1.ico } else { Menu, Tray, Rename, Отключить скрипт, Включить скрипт Menu, Tray, Icon, 2.ico } return ExitScript: ExitApp return
[/spoiler]
Mikhail, добрый вечер! У меня именно так и работает! Спасибо огромное! Незаменимая вещь для тех, кто часто и очень много работает с текстом! По сути это полностью ваша программа) Весь скрипт сделан вами и вами же доработан) Осталось придумать название и иконку)
Вот, что получилось, если конечно я ничего не накосячил:
#SingleInstance force
Menu, Tray, NoStandard
Menu, Tray, Add, Отключить скрипт, ToggleScript
Menu, Tray, Add, Выход, ExitScript
Menu, Tray, Default, Отключить скрипт
Menu, Tray, Icon, 1.ico
scriptEnabled := true
RButton::
KeyWait, RButton, T0.5
if (ErrorLevel == 0) {
Send {RButton}
} else {
first := true
Loop {
Send ^{vk56sc02f}
if (first) {
Sleep 1000
first := false
} else {
Sleep 200
}
if !GetKeyState("RButton", "P")
break
}
}
return
~LButton::
if scriptEnabled {
TimeButtonDown = %A_TickCount%
Loop
{
Sleep 10
GetKeyState, LButtonState, LButton, P
if LButtonState = U
break
elapsed = %A_TickCount%
elapsed -= %TimeButtonDown%
if elapsed > 200
{
clip0 := ClipBoardAll
MouseGetPos x0, y0
Loop
{
Sleep 20
GetKeyState keystate, LButton
IfEqual keystate, U, {
MouseGetPos x, y
break
}
}
if (x-x0 > 5 or x-x0 < -5 or y-y0 > 5 или y-y0 < -5)
{
Send ^{vk43sc02e}
ClipWait 1, 1
IfEqual ClipBoard,, SetEnv ClipBoard, %clip0%
}
return
}
}
}
return
ToggleScript:
scriptEnabled := !scriptEnabled
if (scriptEnabled) {
Menu, Tray, Rename, Включить скрипт, Отключить скрипт
Menu, Tray, Icon, 1.ico
} else {
Menu, Tray, Rename, Отключить скрипт, Включить скрипт
Menu, Tray, Icon, 2.ico
}
return
ExitScript:
ExitApp
return
Цитата: Mikhail от 27.09.2025, 18:13Имир, Привет.
Что это у тебя тут за штука), "или", можно сдвиг мышки переделать наif (Abs(x-x0) > 5 or Abs(y-y0) > 5)и копирование в буфер, черезSend ^c
В общем блок сдвига курсора и копирования, можно вот так сделать.if (Abs(x-x0) > 5 or Abs(y-y0) > 5) { Send ^c ClipWait, 1, 1 if (ClipBoard = "") ClipBoard := clip0 } return
Имир, Привет.
Что это у тебя тут за штука), "или", можно сдвиг мышки переделать на Скопированоif (Abs(x-x0) > 5 or Abs(y-y0) > 5) и копирование в буфер, через СкопированоSend ^c
В общем блок сдвига курсора и копирования, можно вот так сделать.
if (Abs(x-x0) > 5 or Abs(y-y0) > 5) {
Send ^c
ClipWait, 1, 1
if (ClipBoard = "")
ClipBoard := clip0
}
return