从 windows 托盘打开程序

open program from windows Tray

我制作了一个脚本,可以简单地打开或激活特定的应用程序。
它运行良好,但我有一个问题,当应用程序最小化到 windows 托盘时。 热键激活 Else 语句部分,因此它会创建同一应用程序的另一个实例。

!a::
If WinExist("ahk_exe Orzeszek Timer.exe") 
{
   WinActivate, ahk_exe Orzeszek Timer.exe
}
Else {
   Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
}
Return

我需要有关脚本的帮助以触发 IF 语句部分,以防应用出现在系统托盘中。

非常感谢)

试试这个

!a::
Process, Exist, Orzeszek Timer.exe
If (Errorlevel != 0) ; is running
{
    WinGet, WinState, MinMax, ahk_exe Orzeszek Timer.exe
    If (WinState = "") ; is minimized to tray
        SendInput, #bo{Enter} ; Win+b activates the tray, o marks the icon of Orzeszek Timer
    else
        WinActivate, ahk_exe Orzeszek Timer.exe
}
else  ; is NOT running
    Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
return

如果程序有自己的热键来恢复 window,请使用该热键而不是 #bo{Enter}。

编辑:

如果SendInput, #bo{Enter}恢复程序太快,在发送键之间加一个sleep:

...
    If (WinState = "") ; is minimized to tray
    {           
        SendInput, #b ; Win+b activates the tray
        ; WinWaitActive, ahk_class Shell_TrayWnd
        Sleep, 300
        SendInput, o ; o marks the icon of Orzeszek Timer. Try first of all manually which letter marks the icon
        Sleep, 300
        SendInput, {Enter}
    }
...

编辑 2:

我下载了那个小型便携式应用程序,它可以在我的系统上运行:

!a::
Process, Exist, Orzeszek Timer.exe
If (Errorlevel != 0)    ; is running
{
    WinGet, WinState, MinMax, ahk_exe Orzeszek Timer.exe
    If (WinState = "") ; is minimized to tray
        ; SendInput, #bot{Enter}  ; OR: 
        SendInput, #b{Enter}{Up}ot{Enter}
}
else    ; is NOT running
    Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
WinWait,  Orzeszek Timer,, 10
If (!ErrorLevel)
{
    WinActivate, Orzeszek Timer
    WinWaitActive Orzeszek Timer,, 5
    If (!ErrorLevel)
        MouseMove, 150, 80, 0
}
return

编辑 3:

如果您没有启用设置中的选项 "Always show all icons in the notification area",请尝试替换

SendInput, #bot{Enter}

SendInput, #b{Enter}{Up}ot{Enter}

user3419297 非常感谢您的脚本,它运行良好。我修改了一点点打开应用程序。

!a::
Process, Exist, Orzeszek Timer.exe
If (Errorlevel != 0) ; is running
{
    WinGet, WinState, MinMax, ahk_exe Orzeszek Timer.exe
    If (WinState = "") { 
      SendInput, #bo{Right}{Enter}
      Sleep, 500
      CoordMode, Mouse, Window
      MouseMove, 150, 80, 0
    }
    else
        WinActivate, ahk_exe Orzeszek Timer.exe
}
else  ; is NOT running
    Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
return

脚本依赖于应用程序只有一个小缺点放在第一位
在 windows 托盘列表中。
当然,我总是可以重新定义 {Right x} 位置,但是有没有更有效的方法来自动在托盘中找到应用程序位置?

终于成功了!脚本中唯一缺少的部分是编辑 3 中指出的 {Up} 键,以便系统托盘变得可搜索。所以现在我可以毫无问题地找到确切的密钥。在我的例子中是

            SendInput, #b{Enter}{Up}tt
            Sleep, 100
            SendInput, {Enter}

真不知道该怎么感谢你。你帮了我很多)