Вы должны войти, чтобы создавать сообщения и темы.

Трей

◄Страница 2 из 4► 4

Имир, Времени пока нет, углубленно посмотреть, но пока нашел куски, соединил.

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

 

Лайкнул Имир
Имир
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Mikhail, спасибо огромное! Работает! Попробую дальше сам разобраться в этом запутанном коде. Хочу сделать так, чтобы скрипт создавал отдельную иконку заданного окна в трее при его запуске, и чтобы можно было свернуть и развернуть окно по нажатию на эту иконку. То есть чтобы иконка не исчезала при разворачивании окна, а чтобы была возможность свернуть/развернуть окно по однократному нажатию на иконку в трее.

Mikhail, нашёл вот такой скрипт. Конечно не совсем то, что мне нужно. Этот скрипт прячет окно в никуда. А мне нужно, чтобы создавался значок окна в трее. Пока что не разобрался, как это сделать

#Persistent ; Делает скрипт постоянным, чтобы он мог ждать нажатия клавиш
SetTimer, CheckWindows, 2000 ; Проверяем окна каждую 2000 миллисекунд
return

CheckWindows:
    ; Находим все окна с заголовком "Имя окна"
    WinGet, windowList, List, Имя окна 
    Loop, %windowList%
    {
        WinHide, ahk_id %windowList1%
    }
return

 

Mikhail, добрый вечер! Мои мучения не возымели успеха) Так и не смог найти команду, которая создаёт отдельную иконку свёрнутого окна в трее((( Если вас не затруднит, подскажите, пожалуйста, как это сделать? Буду крайне признателен!

Имир, Привет.
Там нет команды конкретной которая делает имеено отдельную иконку под приложение конкретное. Иконка для приложения создается из 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);
Пока не придумал, как это ве соединить)

Лайкнул Имир
Имир
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Mikhail, Доброе утро! Спасибо за помощь! Пока сделал скрипт, который просто создаёт иконку окна в трее. Помогите, пожалуйста:
1. Как сделать, чтобы появлялась отдельная иконка окна, а не менялась иконка скрипта
2. Как сделать, чтобы скрипт сворачивал и разворачивал окно по однократному нажатию на трей-иконку
3. Как сделать, чтобы иконка исчезала из трея при закрытии окна

#Persistent
SetTimer, CheckWindows, 2000 ; Проверяем окна каждую 2000 миллисекунд
return
CheckWindows:
    ; Находим все окна с заголовком "Имя окна"
    WinGet, windowList, List, Имя окна 
    Loop, %windowList%
    {
    ; Добавляем в трей иконку этого окна
    Menu, Tray, Icon, explorer.exe,0, 1
    }
    Return

 

Имир, Привет.
Проще использовать полный набор от Min2Tray😅, зачем тебе отдельно выковыривать, геморроя столько...

Лайкнул Имир
Имир
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

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

 

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

 

Имир, Привет.
А исчезает потому что используешь 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
Лайкнул Имир
Имир
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Mikhail, спасибо большое! А можно добавить поддержку  ini-файла, чтобы можно было редактировать СкопированоWinTitle := Скопировано""?

Имир, Можно, 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, спасибо! А как должны выглядеть команды, если я хочу указать просто имя окна?

Имир, ну spy открой и там будет либо окно, либо как выше у меня ahk_class Notepad и т.д.

«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн
◄Страница 2 из 4► 4