[AHK2] 窗口置顶管理

发布时间 2023-08-20 11:39:24作者: 落寞的雪

开始


如题,这个脚本是用来设置窗口置顶状态和进行批量管理的。

在实际生活中,窗口置顶还算常用吧~反正我常常烦躁于窗口层级,虽然可以截图置顶,但总归不如直接置顶窗口方便。

于是我早早的便写了类似功能的脚本,只是最近才对其进行功能上的完善和扩展,使使用更人性,更直观。说人话就是更好用了……

话不多说,直接开始正题。

介绍


使用:

  • ^Pause: 切换当前窗口置顶状态。
  • +^Pause:取消所有窗口置顶。

这是暴露出的两个方法,另外还可以获取置顶窗口列表,如果想要的话。

脚本


依旧使用了先前分享的常用的ToolTip脚本哦,作用是显示提示并在几秒后关闭它。


代码

包括静态变量:

  • state -> 存储置顶窗口的id

和三个静态方法:

  • SetTop -> 切换当前窗口置顶状态。
  • GetTopWinList -> 获取置顶窗口列表。
  • CancelAll -> 取消所有置顶窗口。

逻辑并不复杂,只是要注意错误预防和处理,不过我已经做好啦。

class WinTopCtrl {
    static state := Map()

    static SetTop(wid) {
        ; DetectHiddenWindows(1)
        if not WinExist('ahk_id' wid) {
            Tip.ShowTip('该窗口不存在')
            return
        }
        if WinTopCtrl.state.Has(wid) {
            isTop := false
            WinTopCtrl.state.Delete(wid)
        }
        else {
            isTop := true
            WinTopCtrl.state.Set(wid, true)
        }
        WinSetAlwaysOnTop(-1, 'ahk_id' wid)
        title := Trim(WinGetTitle('ahk_id' wid))
        raw := '[ ' (title || WinGetClass('ahk_id' wid)) ' ] '
            . (isTop ? '置顶' : '取消置顶')
            . '了喵~☆'
            . WinTopCtrl.GetTopWinList(wid)
        Tip.ShowTip(raw)
    }

    static GetTopWinList(wid) {
        ; if no top window ,ruturn
        if not this.state.Count
            return ''
        for k in this.state {
            ; skip closed window
            if not WinExist('ahk_id' k)
                continue
            ; skip current window
            if k = wid
                continue
            titleList .= '`n- [ ' WinGetTitle('ahk_id' k) ' ]'
        }
        return IsSet(titleList) && '`n此外置顶还有' titleList || ''
    }

    static CancelAll() {
        if not this.state.Count
            return
        for k in this.state {
            try
                WinSetAlwaysOnTop 0, 'ahk_id' k
            catch
                errInfo := 'Some of the window is closed'
        }
        this.state := Map()
        Tip.ShowTip('取消所有置顶了喵~' (IsSet(errInfo) && '`n但是-->' errInfo || ''))
    }
}

热键

^SC146:: WinTopCtrl.SetTop(WinGetID('A')) ; ^Pause
^+SC146:: WinTopCtrl.CancelAll()