Трей
Цитата: Mikhail от 10.10.2025, 06:01Имир, Времени пока нет, углубленно посмотреть, но пока нашел куски, соединил.
Ctrl+Alt+M сворачивает и в иконки в трее, при ПКМ по ней, внизу будут свернутые приложения, тыкаем и разворачивается.
#NoEnv #SingleInstance Ignore #Persistent global HiddenWins := {} ; Ctrl+Alt+M — свернуть окно в трей ^!m:: WinGet, h_WinID, ID, A if (!h_WinID) return WinGet, exePath, ProcessPath, ahk_id %h_WinID% WinGet, h_App, ProcessName, ahk_id %h_WinID% WinGetTitle, h_Title, ahk_id %h_WinID% WinMinimize, ahk_id %h_WinID% Sleep, 100 WinHide, ahk_id %h_WinID% menuName := "Restore_" h_WinID Menu, Tray, Add, %menuName%, RestoreWin Menu, Tray, Icon, %menuName%, %exePath%, 1 HiddenWins[menuName] := h_WinID return RestoreWin: menuName := A_ThisMenuItem h_WinID := HiddenWins[menuName] if (h_WinID) { WinShow, ahk_id %h_WinID% WinActivate, ahk_id %h_WinID% Menu, Tray, Delete, %menuName% HiddenWins.Delete(menuName) } return
Имир, Времени пока нет, углубленно посмотреть, но пока нашел куски, соединил.
Ctrl+Alt+M сворачивает и в иконки в трее, при ПКМ по ней, внизу будут свернутые приложения, тыкаем и разворачивается.
#NoEnv
#SingleInstance Ignore
#Persistent
global HiddenWins := {}
; Ctrl+Alt+M — свернуть окно в трей
^!m::
WinGet, h_WinID, ID, A
if (!h_WinID)
return
WinGet, exePath, ProcessPath, ahk_id %h_WinID%
WinGet, h_App, ProcessName, ahk_id %h_WinID%
WinGetTitle, h_Title, ahk_id %h_WinID%
WinMinimize, ahk_id %h_WinID%
Sleep, 100
WinHide, ahk_id %h_WinID%
menuName := "Restore_" h_WinID
Menu, Tray, Add, %menuName%, RestoreWin
Menu, Tray, Icon, %menuName%, %exePath%, 1
HiddenWins[menuName] := h_WinID
return
RestoreWin:
menuName := A_ThisMenuItem
h_WinID := HiddenWins[menuName]
if (h_WinID) {
WinShow, ahk_id %h_WinID%
WinActivate, ahk_id %h_WinID%
Menu, Tray, Delete, %menuName%
HiddenWins.Delete(menuName)
}
return
Цитата: Имир от 10.10.2025, 06:36Mikhail, спасибо огромное! Работает! Попробую дальше сам разобраться в этом запутанном коде. Хочу сделать так, чтобы скрипт создавал отдельную иконку заданного окна в трее при его запуске, и чтобы можно было свернуть и развернуть окно по нажатию на эту иконку. То есть чтобы иконка не исчезала при разворачивании окна, а чтобы была возможность свернуть/развернуть окно по однократному нажатию на иконку в трее.
Mikhail, спасибо огромное! Работает! Попробую дальше сам разобраться в этом запутанном коде. Хочу сделать так, чтобы скрипт создавал отдельную иконку заданного окна в трее при его запуске, и чтобы можно было свернуть и развернуть окно по нажатию на эту иконку. То есть чтобы иконка не исчезала при разворачивании окна, а чтобы была возможность свернуть/развернуть окно по однократному нажатию на иконку в трее.
Цитата: Имир от 10.10.2025, 10:51Mikhail, нашёл вот такой скрипт. Конечно не совсем то, что мне нужно. Этот скрипт прячет окно в никуда. А мне нужно, чтобы создавался значок окна в трее. Пока что не разобрался, как это сделать
#Persistent ; Делает скрипт постоянным, чтобы он мог ждать нажатия клавиш SetTimer, CheckWindows, 2000 ; Проверяем окна каждую 2000 миллисекунд return CheckWindows: ; Находим все окна с заголовком "Имя окна" WinGet, windowList, List, Имя окна Loop, %windowList% { WinHide, ahk_id %windowList1% } return
Mikhail, нашёл вот такой скрипт. Конечно не совсем то, что мне нужно. Этот скрипт прячет окно в никуда. А мне нужно, чтобы создавался значок окна в трее. Пока что не разобрался, как это сделать
#Persistent ; Делает скрипт постоянным, чтобы он мог ждать нажатия клавиш
SetTimer, CheckWindows, 2000 ; Проверяем окна каждую 2000 миллисекунд
return
CheckWindows:
; Находим все окна с заголовком "Имя окна"
WinGet, windowList, List, Имя окна
Loop, %windowList%
{
WinHide, ahk_id %windowList1%
}
return
Цитата: Имир от 12.10.2025, 19:55Mikhail, добрый вечер! Мои мучения не возымели успеха) Так и не смог найти команду, которая создаёт отдельную иконку свёрнутого окна в трее((( Если вас не затруднит, подскажите, пожалуйста, как это сделать? Буду крайне признателен!
Mikhail, добрый вечер! Мои мучения не возымели успеха) Так и не смог найти команду, которая создаёт отдельную иконку свёрнутого окна в трее((( Если вас не затруднит, подскажите, пожалуйста, как это сделать? Буду крайне признателен!
Цитата: Mikhail от 13.10.2025, 02:07Имир, Привет.
Там нет команды конкретной которая делает имеено отдельную иконку под приложение конкретное. Иконка для приложения создается из ahk, крадет у exe иконку и превращается в трей иконку и т.д., это достаточно трудно), там 1 экземпляр Ahk, запускает.создает другой ahk, тот сворачивается, крадет иконку...
Вот это часть, которая создает иконку, получается ID и т.д приложения.NOTIFYICONDATA nid = { sizeof(NOTIFYICONDATA) }; nid.hWnd = hMainWindow; nid.uID = 1; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_TRAYICON; nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); strcpy(nid.szTip, "Свернутое окно"); Shell_NotifyIcon(NIM_ADD, &nid);Разворачивания приложения:
ShowWindow(hwnd, SW_SHOW); Shell_NotifyIcon(NIM_DELETE, &nid);То же самое, скрывает:
ShowWindow(hwnd, SW_HIDE);
Пока не придумал, как это ве соединить)
Имир, Привет.
Там нет команды конкретной которая делает имеено отдельную иконку под приложение конкретное. Иконка для приложения создается из ahk, крадет у exe иконку и превращается в трей иконку и т.д., это достаточно трудно), там 1 экземпляр Ahk, запускает.создает другой ahk, тот сворачивается, крадет иконку...
Вот это часть, которая создает иконку, получается ID и т.д приложения.
NOTIFYICONDATA nid = { sizeof(NOTIFYICONDATA) };
nid.hWnd = hMainWindow;
nid.uID = 1;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_TRAYICON;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
strcpy(nid.szTip, "Свернутое окно");
Shell_NotifyIcon(NIM_ADD, &nid);
Разворачивания приложения:
ShowWindow(hwnd, SW_SHOW); Shell_NotifyIcon(NIM_DELETE, &nid);
То же самое, скрывает: СкопированоShowWindow(hwnd, SW_HIDE);
Пока не придумал, как это ве соединить)
Цитата: Имир от 17.10.2025, 06:49Mikhail, Доброе утро! Спасибо за помощь! Пока сделал скрипт, который просто создаёт иконку окна в трее. Помогите, пожалуйста:
1. Как сделать, чтобы появлялась отдельная иконка окна, а не менялась иконка скрипта
2. Как сделать, чтобы скрипт сворачивал и разворачивал окно по однократному нажатию на трей-иконку
3. Как сделать, чтобы иконка исчезала из трея при закрытии окна#Persistent SetTimer, CheckWindows, 2000 ; Проверяем окна каждую 2000 миллисекунд return CheckWindows: ; Находим все окна с заголовком "Имя окна" WinGet, windowList, List, Имя окна Loop, %windowList% { ; Добавляем в трей иконку этого окна Menu, Tray, Icon, explorer.exe,0, 1 } Return
Mikhail, Доброе утро! Спасибо за помощь! Пока сделал скрипт, который просто создаёт иконку окна в трее. Помогите, пожалуйста:
1. Как сделать, чтобы появлялась отдельная иконка окна, а не менялась иконка скрипта
2. Как сделать, чтобы скрипт сворачивал и разворачивал окно по однократному нажатию на трей-иконку
3. Как сделать, чтобы иконка исчезала из трея при закрытии окна
#Persistent
SetTimer, CheckWindows, 2000 ; Проверяем окна каждую 2000 миллисекунд
return
CheckWindows:
; Находим все окна с заголовком "Имя окна"
WinGet, windowList, List, Имя окна
Loop, %windowList%
{
; Добавляем в трей иконку этого окна
Menu, Tray, Icon, explorer.exe,0, 1
}
Return
Цитата: Mikhail от 18.10.2025, 04:50Имир, Привет.
Проще использовать полный набор от Min2Tray😅, зачем тебе отдельно выковыривать, геморроя столько...
Имир, Привет.
Проще использовать полный набор от Min2Tray😅, зачем тебе отдельно выковыривать, геморроя столько...
Цитата: Имир от 18.10.2025, 11:55Mikhail, В
Min2Trayслишком много лишнего, настройки хранит она в системном реестре, удобной и понятной её не назовёшь. За неимением альтернатив, придётся пользоваться ей. Но можно и попытаться что-нибудь придумать.
Пока сделал вот такой скрипт: при появлении окна он меняет иконку, а при нажатииf1переключает видимый режим на невидимый и наоборот.
Хочу сделать, чтобы вместоf1можно было просто нажать на иконку в трее. Не подскажете, как это сделать?WinWait, Имя окна Loop Menu, Tray, Icon, explorer.exe,0 Return f1:: If (Toggle = 0) { WinHide, Имя окна Toggle := 1 } Else { WinShow, Имя окна Toggle := 0 } Return
Mikhail, В Min2Tray слишком много лишнего, настройки хранит она в системном реестре, удобной и понятной её не назовёшь. За неимением альтернатив, придётся пользоваться ей. Но можно и попытаться что-нибудь придумать.
Пока сделал вот такой скрипт: при появлении окна он меняет иконку, а при нажатии f1 переключает видимый режим на невидимый и наоборот.
Хочу сделать, чтобы вместо f1 можно было просто нажать на иконку в трее. Не подскажете, как это сделать?
WinWait, Имя окна
Loop
Menu, Tray, Icon, explorer.exe,0
Return
f1::
If (Toggle = 0) {
WinHide, Имя окна
Toggle := 1
} Else {
WinShow, Имя окна
Toggle := 0
}
Return
Цитата: Имир от 21.10.2025, 22:59Mikhail, доброй ночи! Создал скрипт для сворачивания/разворачивания окна в трей при однократном клике по иконке. Также создал скрипт, который отображает иконку в трее, только когда открыто нужное окно. Если соединить эти два скрипта, то первый скрипт теряет смысл, так как иконка исчезает при сворачивании окна в трей. Получается, что
AutoHotkeyне видит разницы между сворачиванием окна в трей и его закрытием? Подскажите, пожалуйста, можно ли сделать так, чтобыAutoHotkeyудалял иконку, только когда окно закрыто, а не свёрнуто в трей?#Persistent #SingleInstance force WinTitle := "Имя окна" Menu, Tray, NoStandard Menu, Tray, Add, Hide/Show Menu, Tray, Default, Hide/Show Menu, Tray, Add, Exit Menu, Tray, Click, 1 Hide/Show: IfWinExist, %WinTitle% WinHide, %WinTitle% else WinShow, %WinTitle% return Exit: ExitApp#Persistent #SingleInstance force #NoTrayIcon WinTitle := "Имя окна" Loop { WinWait, %WinTitle% Menu, Tray, Icon WinWaitClose, %WinTitle% Menu, Tray, NoIcon } return
Mikhail, доброй ночи! Создал скрипт для сворачивания/разворачивания окна в трей при однократном клике по иконке. Также создал скрипт, который отображает иконку в трее, только когда открыто нужное окно. Если соединить эти два скрипта, то первый скрипт теряет смысл, так как иконка исчезает при сворачивании окна в трей. Получается, что СкопированоAutoHotkey не видит разницы между сворачиванием окна в трей и его закрытием? Подскажите, пожалуйста, можно ли сделать так, чтобы СкопированоAutoHotkey удалял иконку, только когда окно закрыто, а не свёрнуто в трей?
#Persistent #SingleInstance force WinTitle := "Имя окна" Menu, Tray, NoStandard Menu, Tray, Add, Hide/Show Menu, Tray, Default, Hide/Show Menu, Tray, Add, Exit Menu, Tray, Click, 1 Hide/Show: IfWinExist, %WinTitle% WinHide, %WinTitle% else WinShow, %WinTitle% return Exit: ExitApp
#Persistent
#SingleInstance force
#NoTrayIcon
WinTitle := "Имя окна"
Loop {
WinWait, %WinTitle%
Menu, Tray, Icon
WinWaitClose, %WinTitle%
Menu, Tray, NoIcon
} return
Цитата: Mikhail от 22.10.2025, 02:10Имир, Привет.
А исчезает потому что используешь winwait, то есть появление окна, окна нет и иконки тоже соответственно, надо по процессу искать, по ID.
NoTrayIcon не убирай, так и должно быть, в трее значок будет отображаться, если есть это окно в процессах, то есть в начале скрипта можно добавить запуск приложения тебе нужного, а в поле Winwait добавить имя окна через SPY у ahk.#Persistent #SingleInstance force #NoTrayIcon SetTitleMatchMode, 2 DetectHiddenWindows, On WinTitle := "Безымянный – Блокнот" Loop { WinWait, %WinTitle% hwnd := WinExist(WinTitle) if !hwnd continue WinGet, pid, PID, ahk_id %hwnd% Menu, Tray, NoStandard Menu, Tray, Add, Hide/Show Menu, Tray, Default, Hide/Show Menu, Tray, Add, Exit Menu, Tray, Click, 1 Menu, Tray, Icon Process, WaitClose, %pid% Menu, Tray, NoIcon } return Hide/Show: if WinExist(WinTitle) { if DllCall("IsWindowVisible","ptr",WinExist(WinTitle)) { WinHide, %WinTitle% } else { WinShow, %WinTitle% WinRestore, %WinTitle% WinActivate, %WinTitle% } } return Exit: ExitApp
Имир, Привет.
А исчезает потому что используешь winwait, то есть появление окна, окна нет и иконки тоже соответственно, надо по процессу искать, по ID.
NoTrayIcon не убирай, так и должно быть, в трее значок будет отображаться, если есть это окно в процессах, то есть в начале скрипта можно добавить запуск приложения тебе нужного, а в поле Winwait добавить имя окна через SPY у ahk.
#Persistent
#SingleInstance force
#NoTrayIcon
SetTitleMatchMode, 2
DetectHiddenWindows, On
WinTitle := "Безымянный – Блокнот"
Loop {
WinWait, %WinTitle%
hwnd := WinExist(WinTitle)
if !hwnd
continue
WinGet, pid, PID, ahk_id %hwnd%
Menu, Tray, NoStandard
Menu, Tray, Add, Hide/Show
Menu, Tray, Default, Hide/Show
Menu, Tray, Add, Exit
Menu, Tray, Click, 1
Menu, Tray, Icon
Process, WaitClose, %pid%
Menu, Tray, NoIcon
}
return
Hide/Show:
if WinExist(WinTitle) {
if DllCall("IsWindowVisible","ptr",WinExist(WinTitle)) {
WinHide, %WinTitle%
} else {
WinShow, %WinTitle%
WinRestore, %WinTitle%
WinActivate, %WinTitle%
}
}
return
Exit:
ExitApp
Цитата: Имир от 22.10.2025, 07:15Mikhail, спасибо большое! А можно добавить поддержку ini-файла, чтобы можно было редактировать
WinTitle :=""?
Mikhail, спасибо большое! А можно добавить поддержку ini-файла, чтобы можно было редактировать СкопированоWinTitle := Скопировано""?
Цитата: Mikhail от 22.10.2025, 07:30Имир, Можно, config.ini создай рядом и заполни его так:
[Settings] WinTitle=ahk_class NotepadTray:
#Persistent #SingleInstance force #NoTrayIcon SetTitleMatchMode, 2 DetectHiddenWindows, On IniRead, WinTitle, %A_ScriptDir%\config.ini, Settings, WinTitle, Loop { WinWait, %WinTitle% hwnd := WinExist(WinTitle) if !hwnd continue WinGet, pid, PID, ahk_id %hwnd% Menu, Tray, NoStandard Menu, Tray, Add, Hide/Show Menu, Tray, Default, Hide/Show Menu, Tray, Add, Exit Menu, Tray, Click, 1 Menu, Tray, Icon Process, WaitClose, %pid% Menu, Tray, NoIcon } return Hide/Show: if WinExist(WinTitle) { if DllCall("IsWindowVisible","ptr",WinExist(WinTitle)) { WinHide, %WinTitle% } else { WinShow, %WinTitle% WinRestore, %WinTitle% WinActivate, %WinTitle% } } return Exit: ExitApp
Имир, Можно, config.ini создай рядом и заполни его так:
[Settings] WinTitle=ahk_class Notepad
Tray:
#Persistent
#SingleInstance force
#NoTrayIcon
SetTitleMatchMode, 2
DetectHiddenWindows, On
IniRead, WinTitle, %A_ScriptDir%\config.ini, Settings, WinTitle,
Loop {
WinWait, %WinTitle%
hwnd := WinExist(WinTitle)
if !hwnd
continue
WinGet, pid, PID, ahk_id %hwnd%
Menu, Tray, NoStandard
Menu, Tray, Add, Hide/Show
Menu, Tray, Default, Hide/Show
Menu, Tray, Add, Exit
Menu, Tray, Click, 1
Menu, Tray, Icon
Process, WaitClose, %pid%
Menu, Tray, NoIcon
}
return
Hide/Show:
if WinExist(WinTitle) {
if DllCall("IsWindowVisible","ptr",WinExist(WinTitle)) {
WinHide, %WinTitle%
} else {
WinShow, %WinTitle%
WinRestore, %WinTitle%
WinActivate, %WinTitle%
}
}
return
Exit:
ExitApp
Цитата: Mikhail от 22.10.2025, 08:11Имир, ну spy открой и там будет либо окно, либо как выше у меня ahk_class Notepad и т.д.
Имир, ну spy открой и там будет либо окно, либо как выше у меня ahk_class Notepad и т.д.