1

Тема: AHK: Как скрыть окно в трей

Надо скрыть окно почтовика Mozilla Thunderbird в трей.

Вариант

SetTitleMatchMode, 2
;Run, notepad.exe
;WinWait, Блокнот
;Sleep, 1000
WinHide, Thunderbird ; use the window found above
;Sleep, 10000
;WinShow, Блокнот
exit

так оно совсем скрывается и более не показывается, а вот как в трей - не понятно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

2

Re: AHK: Как скрыть окно в трей

sSize:=A_PtrSize=4 ? A_IsUnicode ? 956:508:976
NumPut(VarSetCapacity(NOTIFYICONDATA, sSize, 0), NOTIFYICONDATA, 0)
OnMessage(AHK_NOTIFYICON:=0x401, "WndProc"), WM_LBUTTONUP:=0x202

Global NOTIFYICONDATA, AHK_NOTIFYICON, WM_LBUTTONUP, winId, isUsed, hIcon

#If !isUsed
>^LButton::
   isUsed:=True
   WinGet, procPath, ProcessPath, % "ahk_id"winId:=WinActive("A")
   WinGetTitle, winTitle, % "ahk_id"winId
   WinHide, % "ahk_id"winId
   hIcon:=DllCall("shell32\ExtractAssociatedIcon"(A_IsUnicode ? "W":"A"), "Ptr", 0
                                                                        , "Str", procPath
                                                                        , "UShortP", 0
                                                                        , "Ptr")
   TrayIcon(A_ScriptHwnd, 1, AHK_NOTIFYICON, hIcon, winTitle, 0)
   Return

WndProc(wParam, lParam, uMsg, hWnd)
{
   If (uMsg=AHK_NOTIFYICON And lParam=WM_LBUTTONUP)
   {
      WinShow, % "ahk_id"winId
      WinActivate, % "ahk_id"winId
      TrayIcon(A_ScriptHwnd, 1, AHK_NOTIFYICON)
      DllCall("DestroyIcon", "Ptr", hIcon)
      winId:=isUsed:=False
   }
}

TrayIcon(hWnd, uID, uCbMsg:=0, hIcon:=0, szTip:="", dwMsg:=2)
{
   NumPut(hWnd  , NOTIFYICONDATA,  A_PtrSize=4 ?  4: 8)
   NumPut(uID   , NOTIFYICONDATA,  A_PtrSize=4 ?  8:16)
   NumPut(1|2|4 , NOTIFYICONDATA,  A_PtrSize=4 ? 12:20)
   NumPut(uCbMsg, NOTIFYICONDATA,  A_PtrSize=4 ? 16:24)
   NumPut(hIcon , NOTIFYICONDATA,  A_PtrSize=4 ? 20:32)
   StrPut(szTip ,&NOTIFYICONDATA +(A_PtrSize=4 ? 24:40), 141, A_IsUnicode ? "UTF-16":"")
   NumPut(3     , NOTIFYICONDATA,  A_PtrSize=4 ? A_IsUnicode ? 800:416:816)
   DllCall("shell32\Shell_NotifyIcon"(A_IsUnicode ? "W":"A"), "Int", dwMsg
                                                            , "Ptr", &NOTIFYICONDATA)
}

3 (изменено: Indomito, 2013-01-09 13:31:20)

Re: AHK: Как скрыть окно в трей

Ммм... это самый простой метод?
Просто у меня в почтовике есть кнопка для скрытия на JS

/*Initialization Code*/

this.tooltipText = "Left    => Свернуть Mozilla Thunderbird \nMiddle => Выйти из Mozilla Thunderbird \nRight   => Перезагрузить Mozilla Thunderbird";

this.onclick = function(event) {
    if(event.button == 0) {
// Действие при клике ЛКМ
//window.minimize();
startProcess("C:\\AHK\\AllSystemOS\\hide.exe",[""]);
    }
    else if(event.button == 1) {
// Действие при клике СКМ
goQuitApplication();
    }
    else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
// Действие при клике ПКМ без модификаторов
  var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
                             .getService(Components.interfaces.nsIAppStartup);
  appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);

    }
};
this.oncontextmenu = function(event) {
    if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Блокируем контекстное меню при клике ПКМ без модификаторов
        event.preventDefault();
        event.stopPropagation();
    }
};


function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Файл не найден", path); 
};

Раньше было достаточно window.minimize(); теперь запускаю startProcess("C:\\AHK\\AllSystemOS\\hide.exe",[""]);

Я честное слово не очень понял твой скрипт, т.е. мне то по сути нужно написать код который уберёт в трей только почтовик по нажатию на кнопку, код которой я привёл.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4

Re: AHK: Как скрыть окно в трей

Тогда можно проще: по горячей клавише спрятать окно почтовика, а в трее показать значок (icon), взятый из самого почтовика.

5 (изменено: Indomito, 2013-01-09 13:58:00)

Re: AHK: Как скрыть окно в трей

ypppu пишет:

Тогда можно проще: по горячей клавише спрятать окно почтовика,...

это я сделал, для это на JS  была написана программа, т.е. программа для кнопки скрытия. 

ypppu пишет:

...а в трее показать значок (icon), взятый из самого почтовика.

а как это не пойму. Я ведь завершаю программу после скрытия,  так откуда значок появиться?

Я имел ввиду скрыть в трей саму программу (почтовик)...  или я ход мыслей не понимаю ваших.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

6

Re: AHK: Как скрыть окно в трей

Я имел ввиду скрыть в трей саму программу (почтовик).

Я это и имею в виду, только средствами AutoHotkey.

7 (изменено: Indomito, 2013-01-09 14:06:45)

Re: AHK: Как скрыть окно в трей

Так... есть скрипт.

SetTitleMatchMode, 2
WinHide, Thunderbird ; use the window found above
exit

что в нём надо поправить то?

Точнее, вместо скрытия послать почтовик в трей.

P.S. Просто в коде из поста №2 я ничего не понимаю.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

8

Re: AHK: Как скрыть окно в трей

Indomito, «скрыть программу в трэй» невозможно. В принципе. Можно сделать окно приложения скрытым, а в трэе создать иконку и «навесить» на щелчок по нему обработку.

9

Re: AHK: Как скрыть окно в трей

Ясно.

У меня есть два дополнения которые скрывают в трей, но одно при старте, а другое показывает уведомления о новых сообщениях в трее и между ними возник конфликт. Так что я оставлю одно, а скрытие сделаю через AHK.

Думаю, что проблема решена, правда частично, но решена.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

10

Re: AHK: Как скрыть окно в трей

Вот пример, по F8 "сворачивается в трей", по щелчку в трее "разворачивается".

#SingleInstance, Force
Menu, Tray, Icon, Shell32.dll, 174        ;путь к нужному значку
Menu, Tray, NoIcon
Menu, Tray, NoStandard
Menu, Tray, Add, Развернуть, sub001
Menu, Tray, Default, Развернуть
Menu, tray, click, 1
Return

F8::    ;нужная горячая клавиша
WinHide, Thunderbird
Menu, Tray, Icon
Return

sub001:
WinShow, Thunderbird
Menu, Tray, NoIcon
Return

Вообще в справке есть AutoHotkey: свёртка приложений в трей.

11 (изменено: Indomito, 2013-01-09 15:39:24)

Re: AHK: Как скрыть окно в трей

Это немного не то... мне нужна одна отработка, а не "висящий" скрипт... именно в этом то и проблема.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

12

Re: AHK: Как скрыть окно в трей

А зачем? И если он будет "висеть", только когда окно "свёрнуто", это решает проблему?

13

Re: AHK: Как скрыть окно в трей

У меня есть два дополнения которые скрывают в трей, но одно при старте, а другое показывает уведомления о новых сообщениях в трее и между ними возник конфликт. Так что я оставлю одно, а скрытие сделаю через AHK.

Посмотрите на их код и объедините.

Ясно.

Это немного не то... мне нужна одна отработка, а не "висящий" скрипт... именно в этом то и проблема.

Значит, не ясно. Кто будет отрабатывать иконку в трэе по завершении работы скрипта?

14

Re: AHK: Как скрыть окно в трей

ypppu пишет:

А зачем?

т.к. при новых сообщениях в трее появляется свой значок(другой), а этот не нужен.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

15

Re: AHK: Как скрыть окно в трей

Indomito пишет:

Надо скрыть окно почтовика Mozilla Thunderbird в трей.

Вообще-то есть куча дополнений к нему, которые делают это.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Как скрыть окно в трей

teadrinker пишет:

Вообще-то есть куча дополнений к нему, которые делают это.

после последних обновлений они стали работать не корректно, пока не нашёл дополнение, которое устраивает меня полностью.

Но задачу я решил с помощью AHK.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

17 (изменено: Indomito, 2013-01-12 23:28:24)

Re: AHK: Как скрыть окно в трей

Да, не решил - видимо надо подумать или же использовать советы данные мне выше, по постам.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

18

Re: AHK: Как скрыть окно в трей

Расскажите подробно. Я так и не понял, что за конфликт возникает.

19

Re: AHK: Как скрыть окно в трей

ypppu пишет:

Расскажите подробно. Я так и не понял, что за конфликт возникает.

я написал такой скрипт

SetTitleMatchMode, 2
ToolTip Закрываем - Прячем
loop
    {
        if WinExist("Thunderbird"){
            WinHide
            Sleep, 100
            ToolTip
        } else {
                exit
            }
    }

но он работает весьма не корректно, т.е. в трее появляется куча иконок от Mozilla Thunderbird - по одной на каждое скрытие + он показывается, если стартует полноэкранное приложение, например любая игра.

Я  понимаю, что скрипт криво написан, но более ничего умного мне в голову не пришло.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

20

Re: AHK: Как скрыть окно в трей

он показывается, если стартует полноэкранное приложение

КТо - он?
Вообще, с первого взгляда не понятно, каким образом вообще появляются иконки в трее. Данный скрипт проверяет существование окна почтовика, и если оно есть, прячет последнее найденное окно.

21

Re: AHK: Как скрыть окно в трей

ypppu пишет:

КТо - он?

Mozilla Thunderbird 

Вообще, с первого взгляда не понятно, каким образом вообще появляются иконки в трее.

дополнениями Mozilla Thunderbird

Данный скрипт проверяет существование окна почтовика, и если оно есть, прячет последнее найденное окно.

всё верно... но где то я накосячил.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

22

Re: AHK: Как скрыть окно в трей

Собрав кусочки, попробую перефразировать Ваш вопрос.

Требуется скрипт для сворачивания в трей приложения Mozilla Thunderbird.
Дополнение к Mozilla Thunderbird не устраивает, потому что его окна показываются при запуске любого полноэкранного приложения.
Скрипт на JS не устраивает, поскольку не исчезают лишние иконки в трее.
Скрипт на AutoHotkey не подходит, поскольку не хочется иметь лишнее постоянно запущенное приложение.

23

Re: AHK: Как скрыть окно в трей

ypppu пишет:

Собрав кусочки, попробую перефразировать Ваш вопрос.

и так...

№1

Требуется скрипт для сворачивания в трей приложения Mozilla Thunderbird.

верно.

№2

Дополнение к Mozilla Thunderbird не устраивает, потому что его окна показываются при запуске любого полноэкранного приложения.

они подходили раньше, но сейчас они очень часто оставляют Mozilla Thunderbird в Панели Задач, т.е. просто сворачивают и всё. Раньше убирали в трей.

№3

Скрипт на JS не устраивает, поскольку не исчезают лишние иконки в трее.

он не устраивает по № 2

№4

Скрипт на AutoHotkey не подходит, поскольку не хочется иметь лишнее постоянно запущенное приложение.

подходит, но он не сможет показывать в трее приход новых сообщений, точнее я не знаю как это сделать.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

24

Re: AHK: Как скрыть окно в трей

А когда приходит новое письмо, у окна Mozilla Thunderbird изменяется заголовок? Такое наблюдается в браузере при использовании сервиса mail.ru.

25

Re: AHK: Как скрыть окно в трей

Не, трее меняется вид и тип иконки и я вижу что есть новые сообщения.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

26

Re: AHK: Как скрыть окно в трей

Вроде решил проблему с закрытием и появлением дубликатов трее, а так же раскрытием окна при запуске полноэкранного приложения.
Заменил WinHide на WinClose в скрипте из поста №19

Протестировал - ошибок не обнаружил.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

27

Re: AHK: Как скрыть окно в трей

Окончательно решил проблему, вот что получилось, может быть кому то пригодиться

Sleep, 500
ToolTip
loop 10
  {
    SetTitleMatchMode, 2
    if WinExist("Thunderbird"){
        ToolTip
        fnWinTray()
        WinMinimize
        WinClose
        Sleep, 100
        ToolTip
    }
}        
return

fnWinTray(){
    Send, {F9 Down}
    KeyWait, % A_ThisHotkey
    Send, {F9 Up}
return 
}

WinClose надо убрать если нет дополнений для помещения в трей при закрытии окна ТВ

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download