Code: Select all
Pause::Pause
^!s::Suspend
^!r::Reload
^+q::ExitApp
!l::ListLines
!v::ListVars
!k::KeyHistory
功能展示 主要功能一目了然,在选中脚本后点右边的按钮执行相应的操作。原理在「脚本主窗口的妙用」中说过,由于通过隐藏窗口检测,所以不论脚本是否使用自定义图标、是否隐藏托盘图标等都不会影响操作。
使用说明及注意事项
- 若运行时提示错误,请下载安装最新的 AutoHotkey 版本。
- 在操作脚本前,建议先刷新,程序在操作前不会去判断脚本是否存在或处于哪种状态(可能从外部被修改了)。
- 尽管可以检测到编译后的脚本,但某些功能不起作用。
同类的工具
经朋友提醒,才知道碰车了。前期的搜集工作做的还不够充分,重复造轮子。
Lexikos 的 AHKControl 调试功能相同,可调节的选项较多,它这里使用菜单的形式,欢迎大家选择。
Scriptcontrol 1.2 功能较简化,若用于调试可能不够方便。
扩展说明
这个工具很小,不到 200 行代码,总体而言较为紧凑。思路明确,我想较容易理解和扩展(比起同类工具这点算优势吧),欢迎大家根据自己的需求添加代码。
Code: Select all
/*
http://ahkscript.org/boards/viewtopic.php?f=28&t=4721
Script Name: ScriptManager.ahk
Version: 0.1.00.12
Author: amnesiac
若无法运行,请下载安装最新的 AutoHotkey 版本。
这是测试版,不保证所有功能都能正常使用,请自负风险。
在操作脚本前,建议先刷新,程序在操作前不会去自动判断脚本是否存在或处于哪种状态(可能从外部被修改了)。
*/
#NoEnv
SetTitleMatchMode 2
DetectHiddenWindows On
SetWorkingDir, %A_ScriptDir%
Menu, Tray, Icon, Shell32.dll, 81
WM_COMMAND := 0x111
; 下面这些消息号提取自 AutoHotkey_L 源代码。
ID_FILE_RELOADSCRIPT := 65400
ID_FILE_EDITSCRIPT := 65401
ID_FILE_PAUSE := 65403
ID_FILE_SUSPEND := 65404
ID_FILE_EXIT := 65405
ID_VIEW_LINES := 65406
ID_VIEW_VARIABLES := 65407
ID_VIEW_HOTKEYS := 65408
ThisWndName := "脚本调试辅助器"
ThisVersion := "0.1.00.12"
ThisAuthor := "amnesiac"
MyAhkVersion := "AutoHotkey " (A_IsUnicode ? "Unicode" : "ANSI") " " ((A_PtrSize = 4) ? "32-bit" : "64-bit" ) " " A_AhkVersion
gosub, CreateGUI
gosub, RefreshList
gosub, UpdateSB
return
CreateGUI:
Gui +LastFound
Gui, Font, s10
Gui, Add, GroupBox, x452 ym w100 h180 , 查看
Gui, Add, Button, x462 y20 w80 r1 gOperateScript vID_FILE_EDITSCRIPT, 编辑(&E)
Gui, Add, Button, x462 y60 w80 r1 gOperateScript vID_VIEW_LINES, 历史(&L)
Gui, Add, Button, x462 y100 w80 r1 gOperateScript vID_VIEW_VARIABLES, 变量(&V)
Gui, Add, Button, x462 y140 w80 r1 gOperateScript vID_VIEW_HOTKEYS, 热键(&K)
Gui, Add, GroupBox, x452 y190 w100 h180 , 操作
Gui, Add, Button, x462 y210 w80 r1 gOperateScript vID_FILE_PAUSE, 暂停(&P)
Gui, Add, Button, x462 y250 w80 r1 gOperateScript vID_FILE_SUSPEND, 挂起(&S)
Gui, Add, Button, x462 y290 w80 r1 gOperateScript vID_FILE_RELOADSCRIPT, 重启(&R)
Gui, Add, Button, x462 y330 w80 r1 gOperateScript vID_FILE_EXIT, 退出(&X)
Gui, Add, ListView, xm ym+10 w430 +R20 AltSubmit gThisLVSub HwndThisLVHwnd, 窗口句柄|脚本名|暂停|挂起|脚本路径
Gui, Add, Button, x62 y400 w80 r1 gSelectAll, 全选(&A)
Gui, Add, Button, x162 y400 w80 r1 gInvertSelection, 反选
Gui, Add, Button, x262 y400 w80 r1 gSelectNone, 不选
Gui, Add, Button, x362 y400 w80 r1 gRefreshList, 刷新
Gui, Add, Button, x462 y400 w80 r1 gAboutScriptManager, 关于
Gui, Add, StatusBar
SB_SetParts(120, 120)
SB_SetText(MyAhkVersion, 3)
Gui, Show, AutoSize, %ThisWndName% %ThisVersion% by %ThisAuthor%
return
GuiClose:
ExitApp
OperateScript:
RowNumber := 0
Loop, % LV_GetCount("Selected")
{
RowNumber := LV_GetNext(RowNumber)
if !RowNumber
break
LV_GetText(CurrentWnd, RowNumber, 1)
CurrentCommand := %A_GuiControl%
PostMessage, %WM_COMMAND%, %CurrentCommand%,,, ahk_id %CurrentWnd%
}
if (A_GuiControl = "ID_FILE_RELOADSCRIPT")
Sleep, 500
gosub, RefreshList
gosub, UpdateSB
return
SelectAll:
LV_Modify(0, "Select")
gosub, UpdateSB
return
InvertSelection:
Loop % LV_GetCount()
{
wParam := A_Index - 1
SendMessage, 0x102C, %wParam%, 0x2,, ahk_id %ThisLVHwnd%
if ErrorLevel
LV_Modify(A_Index, "-Select")
else
LV_Modify(A_Index, "Select")
}
gosub, UpdateSB
return
SelectNone:
LV_Modify(0, "-Select") ; 取消选择所有。
gosub, UpdateSB
return
RefreshList:
LV_Delete()
WinGet, AHKWinList, List, ahk_class AutoHotkey
Loop, %AHKWinList%
{
AHKWinHWND := AHKWinList%A_Index%
WinGetTitle, AHKWinTitle, ahk_id %AHKWinHWND%
ScriptPathName := RegExReplace(AHKWinTitle, " - AutoHotkey v[\d.]+?$")
SplitPath, ScriptPathName, ScriptName, ScriptDir
LV_Add("", AHKWinHWND, ScriptName, IsPaused(AHKWinHWND), IsSuspended(AHKWinHWND), ScriptDir)
}
LV_ModifyCol(1, "Integer Sort")
LV_ModifyCol()
gosub, UpdateSB
return
AboutScriptManager:
MsgBox, 4160, 关于, 感谢使用,在使用过程中遇到问题或有相关建议请至官方论坛反馈。`n官方论坛网址(中文版在下方):http://ahkscript.org/boards/
return
ThisLVSub:
UpdateSB:
RowNumber := SeletedNum := 0
Loop, % LV_GetCount("Selected")
{
RowNumber := LV_GetNext(RowNumber)
if !RowNumber
break
SeletedNum++
}
SB_SetText("已选脚本数:" SeletedNum, 1)
SB_SetText("总脚本数:" LV_GetCount(), 2)
return
; SKAN: http://www.autohotkey.com/board/topic/30277-/#entry192925
; Lexikos: http://www.autohotkey.com/forum/viewtopic.php?p=142697#142697
IsPaused(hWnd) {
static MF_CHECKED := 0x8
static WM_ENTERMENULOOP := 0x211
static WM_EXITMENULOOP := 0x212
SendMessage, WM_ENTERMENULOOP,,,, ahk_id %hWnd%
SendMessage, WM_EXITMENULOOP, ,,, ahk_id %hWnd%
hMenu := DllCall("GetMenu", "uint", hWnd)
hMenu := DllCall("GetSubMenu", "uint", hMenu, "int", 0)
return (DllCall("GetMenuState", "uint", hMenu, "uint", 4, "uint", 0x400) & MF_CHECKED) && true
}
IsSuspended(hWnd) {
static MF_CHECKED := 0x8
hMenu := DllCall("GetMenu", "uint", hWnd)
hMenu := DllCall("GetSubMenu", "uint", hMenu, "int", 0)
return !!(DllCall("GetMenuState", "uint", hMenu, "uint", 5, "uint", 0x400) & MF_CHECKED)
}
我曾介绍过编辑器、窗口控件检测工具等,而 AutoHotkey 脚本管理器也是 AutoHotkey 工具链中的一环(换句话说我可能会把这个工具往管理器方向扩展),如果你有经常使用的工具希望加入其中,请到官方论坛提起建议并补充相关说明。
参考过的脚本
在写之前曾收集过下列脚本,这里一并致谢(按时间先后顺序排列):
统一管理AHK脚本
AHK Script Manager – AHK 脚本管理器
Script Manager
Axem - AutoHotKey Scripts Manager
autohotkey-script-manager 一款用于管理常用ahk脚本运行的桌面工具
我最初想写的是管理器,写到现在的功能后发现,主要和调试有关,所以改为「调试辅助器」。
再补充一个:AutoHotkey-ToolKit