minimize/restore 通过热键切换 Gui 的问题

Issues with minimize/restore toggle for Gui via Hotkey

我正在为我的工作区开发一个基于 Gui 的工具,以提供简单的文本粘贴和 WinMinimize/WinRestore 功能。我面临的问题是 minimize/restore 切换功能。

我目前使用的代码详述如下:

;                               Functions
; }-----------------------------------------------------------------------{
GuiToggle()
{
    Sleep, 50
    if WinActive("ServiceDeskAssist")
    {
        Gui, -AlwaysOnTop
        WinMinimize, ServiceDeskAssist
        WinWaitNotActive, ServiceDeskAssist
    }
    else
    {
        WinRestore, ServiceDeskAssist
        WinActivate, ServiceDeskAssist
        WinWaitActive, ServiceDeskAssist
        Gui, +AlwaysOnTop
    }
Sleep, 50
}

;                                Hotkeys
; }-----------------------------------------------------------------------{
^z::GuiToggle()

这个想法是根据 Gui 的当前状态切换到 minimize/restore,但是如果 Gui 存在但仍然可见(即 +AlwaysOnTop)它不是 "Active" 所以它将被恢复而不是最小化。 有什么办法可以纠正这个功能吗?

除非ServiceDeskAssist是一个super-global变量,否则if WinActive(ServiceDeskAssist)是错误的。
WinMinimize, ServiceDeskAssistServiceDeskAssist 用作文字,而不是字符串(我认为您打算为 IF 语句执行此操作)
WinRestore 不会自动激活

;                               Functions
; }-----------------------------------------------------------------------{
GuiToggle()
{
    Sleep, 50
    if WinActive("ServiceDeskAssist")
    {
        Gui, -AlwaysOnTop
        WinMinimize, ServiceDeskAssist
        WinWaitNotActive, ServiceDeskAssist
    }
    else
    {
        WinRestore, ServiceDeskAssist
        WinActivate, ServiceDeskAssist
        WinWaitActive, ServiceDeskAssist
        Gui, +AlwaysOnTop
    }
    Sleep, 50
}
;                                Hotkeys
; }-----------------------------------------------------------------------{
^z::GuiToggle()

此外,为什么不将 window 的标题传递给函数?这样就变成了 re-usable

;                               Functions
; }-----------------------------------------------------------------------{
GuiToggle(winTitle)
{
    Sleep, 50
    if WinActive(winTitle)
    {
        Gui, -AlwaysOnTop
        WinMinimize, % winTitle
        WinWaitNotActive, % winTitle
    }
    else
    {
        WinRestore, % winTitle
        WinActivate, % winTitle
        WinWaitActive, % winTitle
        Gui, +AlwaysOnTop
    }
    Sleep, 50
}
;                                Hotkeys
; }-----------------------------------------------------------------------{
^z::GuiToggle("ahk_class Notepad")

好的,看来 WinGet - MinMax 是前进的方向。 以下代码运行顺利:

;                               Functions
; }-----------------------------------------------------------------------{
GuiToggle()
{
    Sleep, 50
    WinGet, WinState, MinMax, ServiceDeskAssist
    If(WinState==0||WinState==1)
    {
        Gui, -AlwaysOnTop
        WinMinimize, ServiceDeskAssist
        WinWaitNotActive, ServiceDeskAssist
    }
    else if(WinState==-1)
    {
        WinRestore, ServiceDeskAssist
        WinActivate, ServiceDeskAssist
        WinWaitActive, ServiceDeskAssist
        Gui, +AlwaysOnTop
    }
Sleep, 50
}

Toggle(a)
{
    Sleep, 50
    WinGet, WinState, MinMax, % a
    If(WinState==0||WinState==1)
    {
        WinMinimize, % a
        WinWaitNotActive, % a
    }
    else if(WinState==-1)
    {
        WinRestore, % a
        WinActivate, % a
        WinWaitActive, % a
    }
Sleep, 50
}

;                                Hotkeys
; }-----------------------------------------------------------------------{

^x::ExitApp

^z::GuiToggle()