AutoHotkey v2版本的脚本管理器

AutoHotkey v2版本的脚本管理器

 脚本工具分享

功能特性
– 双击操作:可启动或停止脚本。 
– 右键点击:能暂停或恢复脚本。 
– 中键点击:可挂起或解除挂起脚本。 
– 选定一个脚本后按回车键:可在预先设置的编辑器中打开该脚本进行编辑。 
– 支持一键关闭所有脚本(默认情况下,脚本管理器不会关闭)。 
 
额外优势
– 该工具能够精准显示脚本的当前状态。 
– 它会在独立的列表视图中罗列出设置文件夹内所有未运行的脚本,如此一来,无需前往脚本所在文件夹,就能轻松启动已关闭的脚本。 
– 一旦开始使用此工具,相信在进行多数操作时,便无需再与系统托盘菜单图标进行交互。 
 
设置说明
1. 下载脚本,并设定存储脚本的文件夹路径。 
2. 输入用于编辑脚本的编辑器名称(非完整路径)。 

谢谢!  

#Requires AutoHotkey v2.0
#SingleInstance Force
DetectHiddenWindows(1)

;==============================================================================
;==============================================================================
; 配置区

; 设置脚本目录(按需修改)
Global 脚本目录 := 
[
    ;"示例路径:D:\我的脚本",
    ;"可添加更多目录(取消注释使用)",
]

; 设置脚本编辑器名称(仅程序名,不要完整路径)
Global 编辑器 := "Adventure"

; 设置显示/隐藏界面的热键
F7::切换界面()

; 界面显示设置
界面字体大小 := "S14"
背景颜色 := "212121"
文字颜色 := "cffffff"
按钮字体大小 := "S12 Bold"
按钮字体 := "Verdana"

;==============================================================================
;==============================================================================


; 创建主界面
主界面 := Gui()
主界面.BackColor := 背景颜色     
主界面.SetFont(界面字体大小 " " 文字颜色, "微软雅黑")
主界面.Opt("+Owner")


; 运行中脚本列表
列表_运行中 := 主界面.Add("ListView", "x10 y10 w600 h300 Background000000 " 文字颜色, ["状态", "运行中的脚本", "所在目录", "完整路径"])
列表_运行中.Opt("+Grid")

; 未运行脚本列表
列表_未运行 := 主界面.Add("ListView", "x10 y+20 w600 h300 Background000000 " 文字颜色, ["状态", "未运行的脚本", "所在目录", "完整路径"])
列表_未运行.Opt("+Grid")

; 功能按钮
按钮_运行 := 主界面.Add("Button", "x+10 y20 w90 h40", "运行")
按钮_运行.SetFont(按钮字体大小, 按钮字体)

按钮_停止 := 主界面.Add("Button", "y+10 w90 h40", "停止")
按钮_停止.SetFont(按钮字体大小, 按钮字体)

按钮_暂停 := 主界面.Add("Button", "y+10 w90 h40", "暂停")
按钮_暂停.SetFont(按钮字体大小, 按钮字体)

按钮_挂起 := 主界面.Add("Button", "y+10 w90 h40", "挂起")
按钮_挂起.SetFont(按钮字体大小, 按钮字体)

按钮_编辑 := 主界面.Add("Button", "y+10 w90 h40", "编辑")
按钮_编辑.SetFont(按钮字体大小, 按钮字体)

按钮_刷新 := 主界面.Add("Button", "y+10 w90 h40", "刷新")
按钮_刷新.SetFont(按钮字体大小, 按钮字体)

按钮_终止所有 := 主界面.Add("Button", "y+10 w90 h40", "终止所有")
按钮_终止所有.SetFont(按钮字体大小, 按钮字体)

; 按钮事件绑定
按钮_运行.OnEvent("Click", (*) => 处理按钮事件("运行"))
按钮_停止.OnEvent("Click", (*) => 处理按钮事件("停止"))
按钮_暂停.OnEvent("Click", (*) => 处理按钮事件("暂停"))
按钮_编辑.OnEvent("Click", (*) => 处理按钮事件("编辑")) 
按钮_刷新.OnEvent("Click", (*) => 处理按钮事件("刷新"))
按钮_挂起.OnEvent("Click", (*) => 处理按钮事件("挂起"))
按钮_终止所有.OnEvent("Click", (*) => 处理按钮事件("终止所有"))

主界面.OnEvent("Close", (*) => 主界面.Hide())

; 初始刷新
刷新界面()


; 核心功能函数

处理按钮事件(操作类型) 
{
    ; 全局操作处理
    switch 操作类型 
    {
        case "终止所有":
            关闭所有脚本()
            return
        case "刷新":
            刷新界面()
            return
    }

    ; 获取选中项
    选中行 := 列表_运行中.GetNext()
    当前列表 := 列表_运行中
    if (选中行 = 0) 
    {
        选中行 := 列表_未运行.GetNext()
        当前列表 := 列表_未运行
    }

    if (选中行 = 0) 
    {
        MsgBox("请从任意列表中选择一个脚本。")
        return
    }

    ; 获取脚本信息
    脚本路径 := 当前列表.GetText(选中行, 4)
    脚本名称 := 当前列表.GetText(选中行, 2)
    
    ; 执行对应操作
    switch 操作类型 
    {
        case "运行": 运行脚本(脚本路径)
        case "停止": 停止脚本(脚本名称)
        case "暂停": 暂停脚本(脚本名称)
        case "恢复": 脚本暂停恢复(脚本名称, True)
        case "编辑": 编辑脚本(脚本路径)
        case "挂起": 挂起脚本(脚本路径)
        default: MsgBox("未知操作:" . 操作类型)
    }
}

刷新界面() 
{
    列表_运行中.Delete()
    列表_未运行.Delete()

    for 目录 in 脚本目录 
    {
        SplitPath(目录, &文件夹名)
        Loop Files, 目录 "\*.ahk" 
        {
            if A_LoopFileName = A_scriptname
                continue

            运行状态 := 检查脚本运行状态(A_LoopFilePath)
            状态符号 := 运行状态 ? "✓" : "⏹️"

            if 运行状态 
            {
                详细状态 := 获取脚本状态(A_LoopFileName)
                列表_运行中.Add(, 详细状态, A_LoopFileName, 文件夹名, A_LoopFilePath)
            } 
            else 
            {
                列表_未运行.Add(, 状态符号, A_LoopFileName, 文件夹名, A_LoopFilePath)
            }
        }
    }

    ; 调整列宽
    列表_运行中.ModifyCol(1, "AutoHdr Center")
    列表_运行中.ModifyCol(2, "AutoHdr")
    列表_运行中.ModifyCol(3, "AutoHdr")
    列表_运行中.ModifyCol(4, 0)  ; 隐藏完整路径列
    列表_未运行.ModifyCol(1, "AutoHdr Center")
    列表_未运行.ModifyCol(2, "AutoHdr")
    列表_未运行.ModifyCol(3, "AutoHdr")
    列表_未运行.ModifyCol(4, 0)
}

检查脚本运行状态(脚本路径) 
{
    窗口列表 := WinGetList("AutoHotkey")
    for 窗口句柄 in 窗口列表 
    {
        try
            窗口标题 := WinGetTitle("ahk_id " 窗口句柄)
        catch
            continue

        if InStr(窗口标题, 脚本路径)
            return True
    }
    return False
}

运行脚本(脚本路径) 
{
    Run(脚本路径)
    sleep(400)
    刷新界面()
}

停止脚本(脚本名称) 
{
    if WinExist(脚本名称) 
    {
        WinClose(脚本名称)
        sleep(400)
        刷新界面()
    } 
    else 
    {
        ToolTip("脚本未在运行!")
        sleep(2000)
        Tooltip
    }
}

暂停脚本(脚本名称) 
{
    if 检查脚本运行状态(脚本名称) 
    {
        PostMessage 0x0111, 65306,,, 脚本名称 " - AutoHotkey"
        sleep(400)
        刷新界面()
    } 
    else 
    {
        ToolTip("脚本未在运行!")
        sleep(2000)
        Tooltip
    }
}

切换界面() 
{
    if WinExist("A") = 主界面.Hwnd 
    {
        主界面.Hide()
        SoundBeep(100,200)
    }
    else 
    {
        刷新界面()
        sleep(200)
        SoundBeep(100,200)
        主界面.Show()
    }
}

获取运行中的脚本() 
{
    运行中脚本 := []
    DetectHiddenWindows(true)
    SetTitleMatchMode(2)
    窗口列表 := WinGetList("AutoHotkey")

    for 窗口句柄 in 窗口列表 
    {
        窗口标题 := WinGetTitle("ahk_id " 窗口句柄)
        if (窗口标题 != A_scriptname) 
        {
            运行中脚本.Push({ 名称: 窗口标题, 句柄: 窗口句柄 })
        }
    }

    return 运行中脚本
}

脚本暂停恢复(脚本名称, 恢复状态) 
{
    DetectHiddenWindows(true)
    if 脚本句柄 := WinExist(脚本名称 " ahk_class AutoHotkey") 
    {
        static ID_FILE_PAUSE := 65403
        static WM_ENTERMENULOOP := 0x211
        static WM_EXITMENULOOP := 0x212

        主菜单 := DllCall("GetMenu", "ptr", 脚本句柄)
        文件菜单 := DllCall("GetSubMenu", "ptr", 主菜单, "int", 0)
        菜单状态 := DllCall("GetMenuState", "ptr", 文件菜单, "uint", ID_FILE_PAUSE, "uint", 0)
        暂停状态 := 菜单状态 >> 3 & 1

        DllCall("CloseHandle", "ptr", 文件菜单)
        DllCall("CloseHandle", "ptr", 主菜单)

        if (!恢复状态 != !暂停状态) 
        {
            PostMessage 0x111, ID_FILE_PAUSE,,, 脚本句柄
            PostMessage WM_ENTERMENULOOP,,,, 脚本句柄
            PostMessage WM_EXITMENULOOP,,,, 脚本句柄
        }
    }
}

获取脚本状态(脚本名称) 
{
    DetectHiddenWindows(1)
    状态代码 := 0x5555
    目标句柄 := WinExist(脚本名称)
    
    if (目标句柄) 
    {
        try    
            返回值 := SendMessage(状态代码, 0, 0, , "ahk_id " 目标句柄)
        catch 
        {
            return "▶️" 
        }

        switch 返回值 
        {
            case 4: return "⏸️ 💤"  ; 暂停并挂起
            case 5: return "⏸️"      ; 已暂停
            case 6: return "💤"      ; 已挂起
            case 7: return "▶️"      ; 运行中
            default: return "▶️"
        }
    }
}

编辑脚本(脚本路径) 
{
    if A_IsAdmin 
    {
        if FileExist(脚本路径) 
        {
            Run "edit " . 脚本路径
        } 
        else 
        {
            MsgBox "脚本文件不存在:" . 脚本路径
        }
    } else {
        手动编辑脚本(脚本路径) 
    }
}

手动编辑脚本(脚本路径) 
{
    原检测模式 := A_DetectHiddenWindows
    DetectHiddenWindows(0)
    global 编辑器
    SetTitleMatchMode(2)
  
    if !WinExist(编辑器) 
    {
        启动程序(编辑器)
        WinWait(编辑器)
    }

    WinActivate(编辑器)
    原剪贴板 := ClipboardAll()
    A_Clipboard := 脚本路径
    sleep(200)
    Send("^o")
    WinWait("打开",, 5000)
    
    If !WinExist("打开")
        return

    Send("^v")
    sleep(250)
    Send("{Enter}")
    DetectHiddenWindows(原检测模式)
    A_Clipboard := 原剪贴板
}

挂起脚本(脚本路径) 
{
    DetectHiddenWindows True
    WM_COMMAND := 0x0111
    ID_FILE_SUSPEND := 65404
    try {
        PostMessage WM_COMMAND, ID_FILE_SUSPEND,,, 脚本路径 " ahk_class AutoHotkey"
    }
    Sleep(400)
    刷新界面()
}

关闭所有脚本() 
{
    当前脚本 := StrReplace(A_ScriptName, ".ahk", "")
    用户选择 := MsgBox("确定要终止所有运行中的脚本吗?`n选择是将会关闭所有脚本`n(当前脚本不受影响)", "终止所有脚本", "YN Icon! 262144")
    
    if (用户选择 = "Yes") {
        DetectHiddenWindows(1)
        所有AHK窗口 := WinGetList("AutoHotkey")
        for 窗口句柄 in 所有AHK窗口 {
            if (A_ScriptHwnd != 窗口句柄) {
                try WinClose("ahk_id " . 窗口句柄)
            }
        }
    } 
    sleep(100)
    刷新界面()
    主界面.Show()
}

; 列表事件绑定
列表_运行中.OnEvent("DoubleClick", 列表双击事件)
列表_未运行.OnEvent("DoubleClick", 列表双击事件)
列表_运行中.OnEvent("ContextMenu", 右键菜单事件)
列表_未运行.OnEvent("ContextMenu", 右键菜单事件)

右键菜单事件(列表对象, 行号, *) 
{
    if (行号 > 0) 
    {
        脚本路径 := 列表对象.GetText(行号, 4)
        脚本名称 := 列表对象.GetText(行号, 2)
        SoundBeep(300,150)
        暂停脚本(脚本名称)
    }
}

列表双击事件(列表对象, 行号) 
{
    if (行号 > 0) 
    {
        脚本路径 := 列表对象.GetText(行号, 4)
        脚本名称 := 列表对象.GetText(行号, 2)
        
        if (检查脚本运行状态(脚本路径)) 
        {
            停止脚本(脚本名称)
            SoundBeep(300,150)
        } 
        else 
        {
            运行脚本(脚本路径)
            SoundBeep(300,150)
        }
    }
}

启动程序(程序名称) 
{
    shell对象 := ComObject("Shell.Application")
    应用目录 := shell对象.Namespace("shell:AppsFolder")
    for 应用 in 应用目录.Items 
    {
        if (应用.Name = 程序名称) 
        {
            Run "explorer.exe shell:appsFolder\" 应用.Path
            break
        }
    }
}

#HotIf WinActive(A_scriptname) && !WinActive(编辑器)
MButton::
{
    Send("{LButton}")
    sleep(150)
    SoundBeep(300,150)
    中键点击处理()
}

Enter::
{
    SoundBeep(150,150)
    回车键处理()
}
#HotIf

中键点击处理() 
{
    ControlClick("Button4", A_scriptname, , "Left", 1)
    Send("{LButton}")
}

回车键处理() 
{
    ControlClick("Button5", A_scriptname, , "Left", 1)
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA捐赠
共{{data.count}}人
人已捐赠
其他应用教程案例

2025-03-10-快速全文搜索电脑和手机文件的正文内容

2025-3-10 11:05:44

其他教程

执行选中的AHK代码

2021-4-19 19:37:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索