[专栏]积木AHK,一个简单的可定制的ahk编辑工具

不懂英文,编程难。用ahk自带的SCiteahk版编辑器,调试也麻烦。做界面工具更是英文。更新全靠作者一个人。 现在的社会,一个人的力量毕竞是有限的。想独立完成一款有用处的工作,是很不容易的。而这款积木AHK。作者只需要花时间完善框架部分,使得更符合非专业编程人员的习惯。其它功能都是用户和AHK爱好者可以自由发挥,甚至自己修改使得更符合自己的习惯。

工具的最终目标:

1、非专业编程人员亦可快速上手制作一些小功能,满足日常使用。

2、有一定编程基础的非专业编程人员,可以速查常用命令,函数,做到事半功倍的效果。

3、专业编程高手,可以自己定制分享个人版的参数面板[右下角],帮助别人的同时,也能用着文便些 。

非成品,先上图,发源码,大家看下有没有继续下去的必要。

[专栏]积木AHK,一个简单的可定制的ahk编辑工具 [专栏]积木AHK,一个简单的可定制的ahk编辑工具 [专栏]积木AHK,一个简单的可定制的ahk编辑工具

 

源码:

#NoEnv
#Warn,,OutputDebug
#SingleInstance Force
FileInstall,SciLexer.dll, %A_ScriptDir%\SciLexer.dll,1
SCI_edit:= DllCall("LoadLibrary", "Str", "SciLexer.dll", "Ptr")  ; 避免了在循环中每次都需要使用 DllCall() 装载库.
SetWorkingDir %A_ScriptDir%
#Include %A_ScriptDir%\lib\Toolbar.ahk
global 屏幕宽,屏幕高,主窗口宽,主窗口高,主窗口句柄
global 当前参数面板,默认参数面板,面板坐标x,面板坐标y,面板宽,面板高
;获取当前显示器的可用分辨率,存于变量 屏幕信息
SysGet, 屏幕信息, MonitorWorkArea
屏幕宽:=屏幕信息Right-屏幕信息left
屏幕高:=屏幕信息down-屏幕信息top
面板高:=260
;========免注册调用大漠============
;iPath := A_ahkpath . "\AHKdm\dm.dll"  
;WhichButton := DllCall("AHKdm\DmReg.dll\SetDllPathW",  "Str", iPath, "Int", 0)
;MsgBox % WhichButton
;dm :=  ComObjCreate("dm.dmsoft")
;ver := dm.Ver()
;=========================免注册失败?


Gui main:New, +hWndhmainGui +Labelmain ;+Resize
主窗口句柄:=hmainGui
;------------------创建窗口的状态栏--------------------
Gui Add, StatusBar, x0 y680 w屏幕宽 h22, Status Bar
;----------------------添加一个菜单栏--------------------------
Menu MenuHandler, Add, 打开(&O)`tCtrl+O, MenuHandler
Menu MenuHandler, Add, 保存(&S)`tCtrl+S, MenuHandler
Menu MenuHandler, Add, 另存为(&A)`tCtrl+Shift+S, MenuHandler
Menu MenuHandler, Add, 编码, MenuHandler
Menu MenuHandler,add
Menu MenuHandler,add
Menu MenuHandler,add,退出(&X)`t,MenuHandler
Menu MenuBar, Add, 文件(&F), :MenuHandler
;-----------------
Menu EditMenu, Add, 复制(&C)`tCtrl+C, MenuHandler
Menu EditMenu, Add, 剪切(&X)`tCtrl+X, MenuHandler
Menu EditMenu, Add, 粘贴(&V)`tCtrl+V, MenuHandler
Menu EditMenu, Add, 撤销(&U)`tCtrl+Z, MenuHandler
Menu EditMenu, Add, 重做(&R)`tCtrl+Y, MenuHandler
Menu MenuBar, Add, 编辑(&E), :EditMenu
;-----------------
Menu ViewMenu, Add, 复制(&C)`tCtrl+C, MenuHandler
Menu ViewMenu, Add, 剪切(&X)`tCtrl+X, MenuHandler
Menu ViewMenu, Add, 粘贴(&V)`tCtrl+V, MenuHandler
Menu ViewMenu, Add, 撤销(&U)`tCtrl+Z, MenuHandler
Menu ViewMenu, Add, 重做(&R)`tCtrl+Y, MenuHandler
Menu MenuBar, Add, 查看(&E), :ViewMenu
;-----------------
Menu CompileMenu, Add, 运行(&R)`tF5, MenuHandler
Menu CompileMenu, Add, 调试(&D)`tF7, MenuHandler
Menu CompileMenu, Add, 编译(&C)`tCtrl+F7, MenuHandler
Menu CompileMenu, Add, 备用(&U)`tCtrl+Z, MenuHandler
Menu CompileMenu, Add, 备用(&R)`tCtrl+Y, MenuHandler
Menu MenuBar, Add,编译(&O), :CompileMenu
;-----------------
Menu OptionMenu, Add, 配置SCI(&C)`tCtrl+C, MenuHandler
Menu OptionMenu, Add, 代码样式选择(&X)`tCtrl+X, MenuHandler
Menu OptionMenu, Add, 自定义快捷键(&V)`tCtrl+V, MenuHandler
Menu OptionMenu, Add, 撤销(&U)`tCtrl+Z, MenuHandler
Menu OptionMenu, Add, 重做(&R)`tCtrl+Y, MenuHandler
Menu MenuBar, Add, 选项(&O), :OptionMenu
;-----------------
Menu ToolMenu, Add, 窗口信息查看(&I)`t, MenuHandler
Menu ToolMenu, Add, 快速脚本界面(&W)`t, MenuHandler
Menu ToolMenu, Add, 代码格式化(&G)`t, MenuHandler
Menu ToolMenu, Add, 正则辅助测试(&Z)`t, MenuHandler
Menu ToolMenu, Add, 快速插入片段(&P)`t, MenuHandler
Menu ToolMenu, Add, 插件接口查看(&V)`t, MenuHandler
Menu ToolMenu, Add, SCI配置工具(&S)`t, MenuHandler
Menu ToolMenu, Add, 自定义工具栏(&T)`t, MenuHandler
Menu ToolMenu, Add, 库文件介绍(&L)`t, MenuHandler
Menu MenuBar, Add, 工具(&T), :ToolMenu
;-----------------
Menu HelpMenu, Add, 帮助(&H)`tF1, MenuHandler
Menu HelpMenu, Add, 赞助注册(&C)`t, MenuHandler
Menu MenuBar, Add, 帮助(&H), :HelpMenu
Gui Menu, MenuBar
;-----------------------代码编辑栏-----------------------------
;Gui Add, Edit, x270 y50 w760 h392, #NoEnv`n#Warn,, OutputDebug`n#SingleInstance Force`nSetWorkingDir `%A_ScriptDir`%
gui add,Custom,ClassScintilla x270 y50 w1000 h420 hwndhSci_edit ;添加 Scintilla 控件. 注意必须加载 SciLexer.dll 库后才能添加此控件
;面板切换按钮区-----------
	Gui Add, Button, x249 y500 w22 h60 ,调试输出
	Gui Add, Button, x249 y560 w22 h60,参数选择
	Gui Add, Button, x249 y620 w22 h60,代码示例
;-----------------------代码块快捷命令区------------------------
Gui Add, GroupBox, x248 y45 Section w22 h620
Gui add,Picture, xp yp  AltSubmit,代码背景.bmp
Gui Add, Button, hwnd_left xp+2 yp+8 w18 h18 +BackgroundTrans +0x0080 +0x0040
BT1Options:= [ {BC: "代码背景.bmp", TC: "000000", 3D: 9, G: 1}] ;普通状态
BT1Options[2] := {BC: "代码背景.bmp", TC: "000000", 3D: 9, G: 1} ;鼠标悬停
BT1Options[3] := {BC: "代码背景.bmp", TC: "000000", 3D: 0, G: 0} ;3鼠标按下
CreateImageButton(_left,BT1Options)

Gui Add, Button, xp yp+20 w18 h18 BackgroundTrans
Gui Add, Button, xp yp+20 w18 h18 BackgroundTrans
Gui Add, Button, xp yp+20 w18 h18 BackgroundTrans
Gui Add, Button, xp yp+20 w18 h18 BackgroundTrans
;-------------------------左侧选择命令区-----------------------
Gui Add, Tab2, +hWndtiaoshi vtabts x8 y50 w240 h706 AltSubmit  +Buttons +0x280, 选择命令|项目管理|全局变量
	Gui Tab, 1
		Gui Add, TreeView, x32 y58 w210 h690 vtvcmd gcmts
	Gui Tab, 2
		Gui Add, ListView, x32 y58 w210 h690, ListView
	gui tab
	
		;------------------------下侧命令参数区------------------------
		;-----------下侧:调试:cmd插件---------------------------
		;Gui Add, ActiveX, x267 y450 w750 h198, Shell.Explorer

;===============-显示窗口-===============
Gui main:Show, w1280 h780, 积木AHK

;------------创建工具栏-------------
GuiAddToolbar(主窗口句柄)
OnMessage(0x003,"更新参数面板位置") ;0x0003 WM_MOVE 窗口移动自动调整面板位置
;OnMessage(0x006,"面板是否激活置顶") ;WM_ACTIVATE	6	#6	一个窗口被激活或失去激活状态
;WM_ACTIVATEAPP	28	#1c	发此消息给应用程序哪个窗口是激活的,哪个是非激活的

#Include %A_ScriptDir%\lib\lib.ahk

		;=====================程序主体部分===============
		;---程序初始化
		;生成配置文件()
载入配置文件()  ;此处是读取目录下的文件生成命令区TV控件的数据

;Run, Target [, WorkingDir, Max|Min|Hide|UseErrorLevel, OutputVarPID]
;AutoHotkey.exe [Switches] [Script Filename] [Script Parameters] ;%面板宽% %面板高%
窗口坐标更新()
Run,autohotkey.exe /force `"%A_ScriptDir%`"\命令\默认面板.ahk %面板坐标x% %面板坐标y% %面板宽% %面板高%,%A_AhkPath%,, 默认参数面板
当前参数面板:=默认参数面板



	

		;——————————————————————————————————
		;=====================程序主体部分结束==================


		;———————————————以下是函数、标签部分——————————————
return
MenuHandler:
return

mainSize:
AutoXYWH("wh", hSci_edit)
AutoXYWH("h0.75", tiaoshi,"tvcmd")

更新参数面板位置()
return



;触发了命令选择中树形列表项的标签
cmts:
;SendMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout]
	if (A_GuiEvent=="S") {
		TV_GetText(选中的项目文本,A_EventInfo )
		父项目id:=TV_GetParent(A_EventInfo )
		if (父项目id!=0){
			tV_GetText(父项目文本,父项目id)
			Process,Close,%当前参数面板%
			窗口坐标更新()
			Run,autohotkey.exe /force `"%A_ScriptDir%`"\命令\%父项目文本%\%选中的项目文本%.ahk %面板坐标x% %面板坐标y% %面板宽% %面板高%,%A_AhkPath%,, 当前参数面板
			;MsgBox, % 设置父窗口()
			;gui,main:+Owner  ;parent
			return
		}
	}
return

mainEscape:

return

mainClose:
	DetectHiddenWindows On ; 允许探测脚本中隐藏的主窗口。
	SetTitleMatchMode 2
	;PostMessage, 0x111, 65307,,,内置变量.ahk - AutoHotkey ; 退出
	Process,Close,%当前参数面板%
	DllCall("FreeLibrary", "Ptr", hSci_edit)  ; 为了释放内存, 在使用 DLL 后需要进行卸载
	ExitApp
return



;===================下面是函数区==================
; 工具栏按钮生成函数

GuiAddToolbar(hWnd) {
	ImageList := IL_Create(7)
	IL_Add(ImageList, "shell32.dll", 16)
	IL_Add(ImageList, "shell32.dll", 96)
	IL_Add(ImageList, "shell32.dll", 28)
	IL_Add(ImageList, "shell32.dll", 24)
	IL_Add(ImageList, "shell32.dll", 174)
	IL_Add(ImageList, "shell32.dll", 138)
	IL_Add(ImageList, "shell32.dll", 142)
	hToolbar := Toolbar_Add(hWnd, "OnToolbar", "flat list ToolTips", ImageList)
	Buttons =
	(LTrim
		我的电脑
		计算器
		关闭电脑
		帮助关于
		整理代码
		运行
		调试
	)
	Toolbar_Insert(hToolbar, Buttons)
}

OnToolbar(hWnd, Event, Text, Pos, Id) {
	if (Event = "Hot") {
		return
	}
}


;根据目录及相关文件生成配置文件
生成配置文件(){
	;第一步,遍历同目录的[命令]文件夹下的文件夹,得到配置文件cmd.ini的字段
	loop, Files, %A_WorkingDir%\命令\*, D
	{
		IniWrite,%A_Space%,cmd.ini,%A_LoopFileName%
	}
}

载入配置文件(){
	Gui,TreeView,tvcmd
        ;常用函数或命令,样式为字体加粗
		cyml:=TV_Add("常用命令",,"Bold")
	loop, Files, %A_WorkingDir%\常用命令\*.ahk, F
	{
		TV_Add(A_LoopFileName,cyml,"Blod Expand") ;常用函数或命令,样式为字体加粗,展开
	}
	loop, Files, %A_WorkingDir%\命令\*, D
	{
        ;新建父项目,样式为字体加粗
		TV_Add(A_LoopFileName,,"Bold")
	}
    ;含子目录式循环读取所有文件
    loop, Files, %A_WorkingDir%\命令\*, R 
	{
		StringTrimRight, 写入项, A_LoopFileName, 4
        ;SplitPath, A_LoopFileDir, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive
        Loop, Parse, A_LoopFileDir , "\"
            目录名:=A_LoopField
        if (目录名!="命令"){
            ItemID = 0  ; 这样使得首次循环从树的顶部开始搜索.
            conut:=TV_GetCount()
            Loop,%conut%
                {
                ItemID := TV_GetNext(ItemID)  ; 把 "Full" 替换为 "Checked" 来找出所有含复选标记的项目.
                    if (ItemID){
                        TV_GetText(ItemText, ItemID)
                        if (ItemText==目录名)
                        TV_Add(写入项,ItemID)
                    }
                }   
    }
	}
}

窗口坐标更新(){
local 代码控件x坐标,代码控件y坐标,代码控件宽,代码控件高
WinGetPos, 面板坐标x, 面板坐标y,主窗口宽,主窗口高,ahk_id %主窗口句柄%
ControlGetPos , 代码控件x坐标, 代码控件y坐标, 代码控件宽, 代码控件高, ,ahk_id %hSci_edit%
面板坐标x:=面板坐标x+代码控件x坐标
面板坐标y:=面板坐标y+代码控件y坐标+代码控件高+2
面板宽:=代码控件宽
}

更新参数面板位置(){
窗口坐标更新()
WinMove,ahk_pid %当前参数面板%,,%面板坐标x%,%面板坐标y%
}

;调用系统api使参数面板成为主窗口的子窗口---------------------------------------------------------????????????
设置父窗口(父句柄="",子句柄=""){

;Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long 
 ;SetParent Form1.hWnd, Form2.hWnd
 if (父句柄=="" or 子句柄==""){
	父句柄:=主窗口句柄
	子句柄:=当前参数面板
}	

是否成功:=DllCall("user32.dll\SetParent","int",%子句柄%,"int",%父句柄%)
return 是否成功
}

面板是否激活置顶(wParam, lParam, msg, hwnd){
ToolTip,% "W参数:" Wparam " l参数:" lParam " 消息:" msg " 句柄:" hwnd
;IfWinActive,ahk_id %主窗口句柄%
if (wParam>0) ;等于2窗口被鼠标激活,等于1为其它方式激活。 为0失去激活
{
	ToolTip,"参数面板正在被置顶"
	;WinMove,ahk_pid %当前参数面板%
	;winset,AlwaysOnTop,On,ahk_id %当前参数面板%
	winset,Top,,ahk_id %当前参数面板%
}else{
	winset,AlwaysOnTop, Off,ahk_id %当前参数面板%
}
}
转短路径(原路径){
local 短路径
Loop, Parse, 原路径, "\" ;转换为短路径
	{
		if (StrLen(A_LoopField)>8){
			路径:=Substr(A_LoopField,1,6) "~1\"
		}else{
			路径:=A_LoopField "\"
	}
		短路径:=短路径 路径
}
return 短路径
}

客户转屏幕坐标(r,客户坐标x="275",客户坐标y="470"){
local x,y
WinGetPos, x, y,,,ahk_id %主窗口句柄%
x:=x+客户坐标x
y:=y+客户坐标y
if (r=="x")
return x
if (r=="y")
return y
}

附件下载地址https://pan.baidu.com/s/1XyAyXVy2O6TFY48nx2n1FQ

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

AutoHotKey系列教程中级教程第三节第五课:函数对象

2018-8-29 13:52:35

其他

[专栏]超级热键

2018-8-30 22:16:06

4 条回复 A文章作者 M管理员
  1. 似水流年

    我觉得这个非常好 为什么 我复制所有的代码后不能运行呢?

  2. hhhe

    没有做下去了吗,很想用呢

个人中心
购物车
优惠劵
有新私信 私信列表
搜索