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