├── run.vbs
├── Extensions
├── test.ahk
├── print.ahk
├── GetModuleFileNameEx.ahk
├── ShowClass.ahk
├── GetLink.ahk
├── CreateDirByName.ahk
├── Extensions.ahk
├── brace.ahk
└── qrcode.ahk
├── MenuZ.ini
├── README.md
├── History.txt
├── Icons
├── 7z.ico
├── baidu.ico
├── menuz.ico
├── default.ico
├── google.ico
├── setting.ico
└── youdao.ico
├── Apps
└── 7zip
│ └── 7za.exe
├── config
├── command.ini
└── programlist.ini
├── Script
├── Sample.ahk
└── ReturnSample.ahk
├── MZCommand.ahk
├── ActMan.ahk
├── MZGUI.ahk
└── MenuZ.ahk
/run.vbs:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/run.vbs
--------------------------------------------------------------------------------
/Extensions/test.ahk:
--------------------------------------------------------------------------------
1 | test()
2 | {
3 | Msgbox % ItemString
4 | }
5 |
--------------------------------------------------------------------------------
/MenuZ.ini:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/MenuZ.ini
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/README.md
--------------------------------------------------------------------------------
/History.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/History.txt
--------------------------------------------------------------------------------
/Icons/7z.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Icons/7z.ico
--------------------------------------------------------------------------------
/Icons/baidu.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Icons/baidu.ico
--------------------------------------------------------------------------------
/Icons/menuz.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Icons/menuz.ico
--------------------------------------------------------------------------------
/Apps/7zip/7za.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Apps/7zip/7za.exe
--------------------------------------------------------------------------------
/Icons/default.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Icons/default.ico
--------------------------------------------------------------------------------
/Icons/google.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Icons/google.ico
--------------------------------------------------------------------------------
/Icons/setting.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Icons/setting.ico
--------------------------------------------------------------------------------
/Icons/youdao.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Icons/youdao.ico
--------------------------------------------------------------------------------
/config/command.ini:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/config/command.ini
--------------------------------------------------------------------------------
/Extensions/print.ahk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Extensions/print.ahk
--------------------------------------------------------------------------------
/config/programlist.ini:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/config/programlist.ini
--------------------------------------------------------------------------------
/Extensions/GetModuleFileNameEx.ahk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/linxinhong/menuz/HEAD/Extensions/GetModuleFileNameEx.ahk
--------------------------------------------------------------------------------
/Extensions/ShowClass.ahk:
--------------------------------------------------------------------------------
1 | ; 使用GUI显示当前窗口
2 | ShowClass()
3 | {
4 | WinGetClass,Class,AHK_ID %SaveID%
5 | Gui,ShowClass:Destroy
6 | GUi,ShowClass:Font,s11
7 | Gui,ShowClass:Add,Edit,w300 h50,%Class%
8 | GUi,ShowClass:Show,,当前窗口Class
9 | }
10 |
--------------------------------------------------------------------------------
/Extensions/GetLink.ahk:
--------------------------------------------------------------------------------
1 | GetLink()
2 | {
3 | Select := ReturnTypeString(SaveString)
4 | If RegExMatch(Select.Type,"i)^\.lnk")
5 | {
6 | Link := Select.String
7 | FileGetShortcut,%link%,file
8 | Return File
9 | }
10 | Return
11 | }
12 |
--------------------------------------------------------------------------------
/Extensions/CreateDirByName.ahk:
--------------------------------------------------------------------------------
1 | CreateDirByName()
2 | {
3 | Select := ReturnTypeString(SaveString)
4 | If RegExMatch(Select.Type,"i)^\.")
5 | {
6 | path := Select.String
7 | Splitpath,path,,OutDir,,OutNameNoExt
8 | newDir := OutDir "\" OutNameNoExt
9 | FileCreateDir,%newDir%
10 | }
11 | If RegExMatch(Select.Type,"i)^Folder$")
12 | {
13 | newDir := Select.String "_1"
14 | FileCreateDir,%newDir%
15 | }
16 | Return
17 | }
18 |
--------------------------------------------------------------------------------
/Script/Sample.ahk:
--------------------------------------------------------------------------------
1 | ; 正常AHK脚本示例,以下为Msgbox显示传给本脚本的参数
2 | ; {ahk:Script\sample.ahk}
3 | ; 会被替换为 "A_AHKPath" "script\sample.ahk"
4 | ; 如我电脑里的Autohotkey.exe路径为C:\Autohotkey.exe
5 | ; 则替换为 "C:\Autohotkey.exe" "Script\sample.ahk"
6 | ; 1、简化写ahk脚本的方法
7 | ; 不需要在菜单里用 "%a_ahkpath%" "c:\xxxx\xxxxxx.ahk" 这样冗长的写法
8 | ; 只需要 {ahk:xxxx.ahk} 就行
9 | ; 2、以后MZ会做成便携版,所以这种方式很有必要
10 |
11 | If 0 > 0
12 | {
13 | Loop,%0%
14 | {
15 | Param := %A_Index%
16 | Msgbox % Param
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Extensions/Extensions.ahk:
--------------------------------------------------------------------------------
1 | #include %A_ScriptDir%\Extensions\GetLink.ahk
2 | #include %A_ScriptDir%\Extensions\CreateDirByName.ahk
3 | #include %A_ScriptDir%\Extensions\qrcode.ahk
4 | #include %A_ScriptDir%\Extensions\ShowClass.ahk
5 | #include %A_ScriptDir%\Extensions\brace.ahk
6 | #include %A_ScriptDir%\Extensions\print.ahk
7 | #include %A_ScriptDir%\Extensions\GetModuleFileNameEx.ahk
8 | #include %A_ScriptDir%\Extensions\test.ahk
9 | /*
10 | [ExtensionsTime]
11 | brace=20130601161146
12 | CreateDirByName=20130601161146
13 | GetLink=20130601161146
14 | GetModuleFileNameEx=20130524112730
15 | print=20130601161146
16 | qrcode=20130601161146
17 | ShowClass=20130601161146
18 | test=20130601161146
19 | */
20 |
--------------------------------------------------------------------------------
/Script/ReturnSample.ahk:
--------------------------------------------------------------------------------
1 | ; 利用 Send_WM_COPYDATA() 函数,可以将内容回传给MenuZ.ahk
2 | ; 当有一个菜单内容为 {ahk:return:Script\Returnsample.ahk} 时
3 | ; 会直接运行对应的 Script\Returnsample.ahk ,然后等待脚本利用Send_WM_COPYDATA函数返回内容(只能是字符串)
4 | ; 以下函数示例为返回 "cmd" 替换菜单内容里的 {ahk:return:Script\Returnsample.ahk}
5 | ; 注!!!有返回值的脚本,建议不持续运行
6 | Msgbox 此示例将会返回cmd
7 | Send_WM_COPYDATA("cmd")
8 |
9 |
10 | Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle="MenuZ.ahk ahk_class AutoHotkey")
11 | {
12 | VarSetCapacity(CopyDataStruct, 3*A_PtrSize, 0)
13 | SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1)
14 | NumPut(SizeInBytes, CopyDataStruct, A_PtrSize)
15 | NumPut(&StringToSend, CopyDataStruct, 2*A_PtrSize)
16 | Prev_DetectHiddenWindows := A_DetectHiddenWindows
17 | Prev_TitleMatchMode := A_TitleMatchMode
18 | DetectHiddenWindows On
19 | SetTitleMatchMode 2
20 | SendMessage, 0x4a, 0, &CopyDataStruct,, %TargetScriptTitle%
21 | DetectHiddenWindows %Prev_DetectHiddenWindows%
22 | SetTitleMatchMode %Prev_TitleMatchMode%
23 | return ErrorLevel
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/Extensions/brace.ahk:
--------------------------------------------------------------------------------
1 |
2 | ;出处 http://www.autohotkey.com/board/topic/71363-script-formatting-script/
3 |
4 | ; 整理排版用的 .
5 |
6 | ;使用方法 整理花括号 ={func:brace}
7 | brace()
8 | {
9 |
10 | i = 0
11 | ListeNeu:=
12 | ; 获取当前选择的内容
13 | Select := ReturnTypeString(SaveString)
14 | String := Select.String
15 | ; 获取当前选择的内容完毕
16 | loop,Parse,String,`n
17 | {
18 | IfInString, A_Loopfield,`{
19 | {
20 | i := i + 1
21 | Tabs = ;
22 | loop, % i - 1
23 | {
24 | Tabs = %Tabs%`;.`;
25 | }
26 | Result := Trim(A_Loopfield)
27 | ListeNeu = %ListeNeu%%Tabs%%Result%`n
28 | Tabs = ;
29 | loop, % i
30 | {
31 | Tabs = %Tabs%`;.`;
32 | }
33 | continue
34 | }
35 | IfInString, A_Loopfield,`}
36 | {
37 | i := i - 1
38 | Tabs = ;
39 | loop, % i
40 | {
41 | Tabs = %Tabs%`;.`;
42 | }
43 | }
44 | Result := Trim(A_Loopfield)
45 | ListeNeu = %ListeNeu%%Tabs%%Result%`n
46 | }
47 | StringReplace, ListeNeu, ListeNeu, `;.`;,%A_TAB%,All
48 | Clipboard := ListeNeu
49 | Send,^v
50 | }
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/Extensions/qrcode.ahk:
--------------------------------------------------------------------------------
1 | qrcode()
2 | {
3 | ; 获取类型
4 | Type := GetType(SaveString)
5 | ; 判断当前为文本
6 | If Not RegExMatch(Type,"i)^\.")
7 | {
8 | m := "^" ToMatch(Type) "\|"
9 | string := Regexreplace(Regexreplace(SaveString,m),"""|\\","\$0")
10 | qrcode := A_ScriptDir "\apps\qrcode.exe"
11 | option1 := " -o "
12 | option2 := " -s 5 -l H "
13 | if Fileexist(qrcode)
14 | {
15 | png := A_Temp "\qrcode.png"
16 | FileDelete,%png%
17 | Run,%qrcode%%option1%`"%png%`"%option2%`"%String%`"
18 | Loop
19 | {
20 | If Fileexist(png)
21 | {
22 | Gui,LoadImg:Destroy
23 | Gui,LoadImg:Add,Picture,,%png%
24 | GUi,LoadImg:Add,Text,yn hide
25 | Gui,LoadImg:Add,Button ,w60 h30 x+4 y+10 gLoadImgSve,保存(&S)
26 | Gui,LoadImg:Add,Button ,w60 h30 y+40 gLoadImgCnl,关闭(&C)
27 | Gui,LoadImg:Show
28 | Break
29 | }
30 | sleep,100
31 | }
32 | }
33 | }
34 | return
35 | }
36 | LoadImgSve:
37 | LoadImgSve()
38 | return
39 | LoadImgSve()
40 | {
41 | pngPath := A_Temp "\qrcode.png"
42 | Fileselectfile,newpath,S8,%A_Desktop%,保存二维码,*.png
43 | newpath .= ".png"
44 | Filecopy,%pngPath%,%newpath%,1
45 | If Not ErrorLevel
46 | Gui,LoadImg:Destroy
47 | }
48 | LoadImgCnl:
49 | Gui,LoadImg:Destroy
50 | return
51 |
--------------------------------------------------------------------------------
/MZCommand.ahk:
--------------------------------------------------------------------------------
1 | #SingleInstance,Force
2 | #NoTrayIcon
3 | DetectHiddenWindows On
4 | SetTitleMatchMode 2
5 | Global ParamString := Object()
6 | If 0 > 0
7 | {
8 | Idx := 0
9 | Loop,%0%
10 | {
11 | Param := %A_Index%
12 | If A_Index = 1
13 | {
14 | MZC_Mode(Param)
15 | If RegExMatch(param,"i)/m")
16 | {
17 | IsMode := True ;Mode
18 | Continue
19 | }
20 | If RegExMatch(param,"i)/d")
21 | {
22 | IsDebugGUI := True ;Debug
23 | Continue
24 | }
25 | }
26 | idx++
27 | ParamString[idx] := param
28 | }
29 | ParamString[0] := idx
30 | If IsMode
31 | MZC_Mode(ParamString[1])
32 | If IsDebugGUI
33 | MZC_DebugGUI()
34 | }
35 | MZC_Mode(Mode)
36 | {
37 | If RegExMatch(Mode,"^\{[^\{\}]*\}$")
38 | {
39 | SendMZC := "MZCommand:" Mode
40 | Send_WM_COPYDATA(SendMZC)
41 | exit
42 | }
43 | }
44 | MZC_DebugGUI()
45 | {
46 | Count := ParamString[0]
47 | Loop,%Count%
48 | DebugString .= ParamString[A_Index]
49 | SendMZC := "MZCommand:DebugGUI:" DebugString
50 | Send_WM_COPYDATA(SendMZC)
51 | exit
52 | }
53 | Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle="MenuZ.ahk ahk_class AutoHotkey")
54 | {
55 | VarSetCapacity(CopyDataStruct, 3*A_PtrSize, 0)
56 | SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1)
57 | NumPut(SizeInBytes, CopyDataStruct, A_PtrSize)
58 | NumPut(&StringToSend, CopyDataStruct, 2*A_PtrSize)
59 | Prev_DetectHiddenWindows := A_DetectHiddenWindows
60 | Prev_TitleMatchMode := A_TitleMatchMode
61 | DetectHiddenWindows On
62 | SetTitleMatchMode 2
63 | SendMessage, 0x4a, 0, &CopyDataStruct,, %TargetScriptTitle%
64 | DetectHiddenWindows %Prev_DetectHiddenWindows%
65 | SetTitleMatchMode %Prev_TitleMatchMode%
66 | return ErrorLevel
67 | }
68 |
--------------------------------------------------------------------------------
/ActMan.ahk:
--------------------------------------------------------------------------------
1 | #SingleInstance,Force
2 | #NoTrayIcon
3 | ;FileEncoding,UTF-8
4 | Setworkingdir,A_ScriptDir
5 | Coordmode,Tooltip,Screen
6 | Global ParamString := Object()
7 | Global IsReload := False
8 | ; 读取参数{{{1
9 | If 0 > 0
10 | {
11 | Idx := 0
12 | Loop,%0%
13 | {
14 | param := %A_Index%
15 | If A_Index = 1
16 | {
17 | If RegExMatch(param,"i)/a")
18 | {
19 | IsAdd := True ;安装MZA
20 | Continue
21 | }
22 | If RegExMatch(param,"i)/s")
23 | {
24 | IsSilent:= True ;安装MZA(静默,无显示)
25 | Continue
26 | }
27 | If RegExMatch(param,"i)/u")
28 | {
29 | IsUninstall:= True ;卸载某MZA包 用空格分开
30 | Continue
31 | }
32 | If RegExMatch(param,"i)/r")
33 | {
34 | ;遇到这个开关,重启MenuZ.ahk脚本时,会传参数过去,使MenuZ马上进行一次选择
35 | IsReload := True
36 | Continue
37 | }
38 | If RegExMatch(param,"i)/l")
39 | {
40 | IsList := True
41 | Continue
42 | }
43 | }
44 | idx++
45 | ParamString[idx] := param
46 | }
47 | IsParam := True
48 | ParamString[0] := idx
49 | }
50 | ; 执行判断和功能 {{{1
51 | If IsParam
52 | {
53 | If IsAdd
54 | MZA_Add(ParamString)
55 | Else If IsSilent
56 | MZA_Add(ParamString,1)
57 | Else If IsUninstall
58 | MZA_Del(ParamString)
59 | Else If IsList
60 | {
61 | MZA_List()
62 | Return
63 | }
64 | }
65 | CheckExtension()
66 | Return
67 | ; CheckExtension() {{{1
68 | ;============= ActMan扩展管理 ==============;
69 | CheckExtension()
70 | {
71 | ExtensionsAHK := A_ScriptDir "\Extensions\Extensions.ahk"
72 | If Not FileExist(ExtensionsAHK)
73 | FileAppend,,%ExtensionsAHK%
74 | FileRead,Extensions,%ExtensionsAHK%
75 | ; 验证Extensions里Include的插件是否存在
76 | Loop,Parse,Extensions,`n,`r
77 | {
78 | If Not RegExMatch(A_LoopField,"i)^#include")
79 | Continue
80 | If FileExist(RegExReplace(A_LoopField,"i)^#include\s%A_ScriptDir%\\"))
81 | {
82 | Match := "\t" ToMatch(SubStr(A_LoopField,35)) "\t"
83 | If Not RegExMatch(ExtensionsNames,Match)
84 | NewExtensions .= A_LoopField "`r`n"
85 | ExtensionsNames .= A_Tab Substr(A_LoopField,35) A_Tab
86 | }
87 | }
88 | ; 清理无用#include
89 | Filedelete,%ExtensionsAHK%
90 | FileAppend,%NewExtensions%,%ExtensionsAHK%
91 | ; 查询是否有新插件加入
92 | Loop,%A_ScriptDir%\Extensions\*.ahk
93 | {
94 | If RegExMatch(A_LoopFileName,"i)^Extensions\.ahk$")
95 | Continue
96 | Else
97 | {
98 | Match := "\t" ToMatch(A_LoopFileName) "\t"
99 | If Not RegExMatch(ExtensionsNames,Match)
100 | FileAppend,#include `%A_ScriptDir`%\Extensions\%A_LoopFileName%`n , %ExtensionsAHK%
101 | }
102 | }
103 | ; 保存修改时间
104 | SaveTime := "/*`r`n[ExtensionsTime]`r`n"
105 | Loop,%A_ScriptDir%\Extensions\*.ahk
106 | {
107 | If RegExMatch(A_LoopFileName,"i)^Extensions.ahk$")
108 | Continue
109 | FileGetTime,ExtensionsTime,%A_LoopFileFullPath%,M
110 | SaveTime .= RegExReplace(A_LoopFileName,"i)\.ahk$") "=" ExtensionsTime "`r`n"
111 | }
112 | SaveTime .= "*/`r`n"
113 | FileAppend,%SaveTime%,%ExtensionsAHK%
114 | FileRead,Extensions,%ExtensionsAHK%
115 | If IsReload
116 | {
117 | RunMode := ParamString[1]
118 | Run %A_AhkPath% "%A_ScriptDir%\MenuZ.ahk" "%RunMode%"
119 | }
120 | Else
121 | Run %A_AhkPath% "%A_ScriptDir%\MenuZ.ahk"
122 | ExitApp
123 | }
124 | ;=============== MZA 管理部分 ===============;
125 | ; MZA_Add(Param,Mode=0) {{{1
126 | MZA_Add(Param,Mode=0)
127 | {
128 | MZA_Temp := A_Temp "\MenuZapp\"
129 | 7za := A_ScriptDir "\apps\7zip\7za.exe"
130 | Count := Param[0]
131 | Loop,%Count%
132 | {
133 | ThisFile := Param[A_Index]
134 | If FileExist(ThisFile) And RegExMatch(ThisFile,"i)\.mza$")
135 | {
136 | Splitpath,ThisFile,,,,MZA_Name
137 | MZA_WorkDir := MZA_Temp MZA_Name
138 | Mousegetpos,x,y
139 | Fileremovedir,%MZA_WorkDir%,1
140 | Runwait %7za% x "%ThisFile%" -o"%MZA_WorkDir%" -tzip -r ,,Hide UseErrorLevel
141 | If ErrorLevel
142 | {
143 | Msgbox %MZA_Name% 解压失败
144 | Continue
145 | }
146 | Loop,%MZA_WorkDir%\*.*,1,1
147 | {
148 | FileTree .= A_LoopFileFullPath "`n"
149 | If RegExMatch(A_LoopFileName,"i)^installapps.ini$")
150 | InstallAppsINI := A_LoopFileFullPath
151 | }
152 | Splitpath,InstallAppsINI,,InstallAppsDir
153 | MatchAppsDir := ToMatch(InstallAppsDir)
154 | Idx := 0
155 | Loop,Parse,FileTree,`n
156 | {
157 | If Strlen(A_LoopField) = 0
158 | Continue
159 | FilePath := RegExReplace(RegExReplace(A_LoopField,MatchAppsDir),"^\\")
160 | If Strlen(FilePath) = 0
161 | Continue
162 | if InStr(FileExist(A_LoopField),"D")
163 | FilePath .= "\"
164 | If RegExMatch(FilePath,"i)^((apps\\)|(icons\\)|(config\\)|(Extensions\\)|(InstallApps.INI))$")
165 | Continue
166 | idx++
167 | Iniwrite,%FilePath%,%InstallAppsINI%,FileTree,%idx%
168 | }
169 | Iniwrite,%idx%,%InstallAppsINI%,FileTree,0
170 | FileTree := ""
171 | If Mode
172 | GotoInstall(InstallAppsDir)
173 | Else
174 | ShowMZAInfo(InstallAppsDir)
175 | }
176 | }
177 | ;Fileremovedir,%MZA_Temp%,1
178 | }
179 | ; GotoInstall(Dir) {{{2
180 | GotoInstall(Dir)
181 | {
182 | MenuZINI := A_ScriptDir "\MenuZ.ini"
183 | MenuZINIBak := A_ScriptDir "\MenuZ_Bak.ini"
184 | FileCopy,%MenuZINI%,%MenuZINIBak%,1
185 | FileCopyDir,%Dir%,%A_ScriptDir%,1
186 | InstallAppINI:= A_ScriptDir "\installapps.ini"
187 | Loop,8
188 | {
189 | If FileExist(InstallAppINI)
190 | Break
191 | Sleep,250
192 | }
193 | INIContent := IniReadValue(InstallAppINI)
194 | MZA_Name := IniReadValue(InstallAppINI,"Apps","Name")
195 | MZA_Author := IniReadValue(InstallAppINI,"Apps","Author")
196 | MZA_Dir := A_ScriptDir "\Apps\MZA"
197 | Loop,Parse,INIContent,`n,`r
198 | {
199 | If RegExMatch(A_LoopField,"i)^(apps)|(dest)|(filetree)$")
200 | Continue
201 | Section := A_LoopField
202 | IniItems := IniReadValue(InstallAppINI,A_LoopField)
203 | Loop,Parse,IniItems,`n,`r
204 | {
205 | If RegExMatch(A_LoopField,"=")
206 | Key := Substr(A_LoopField,1,RegExMatch(A_LoopField,"=")-1)
207 | Else
208 | Key := A_LoopField
209 | Value := IniReadValue(InstallAppINI,Section,key)
210 | IniWrite,%Value%,%MenuZINI%,%Section%,%Key%
211 | }
212 | }
213 | If Not InStr(FileExist(MZA_Dir),"D")
214 | Filecreatedir,%MZA_Dir%
215 | If RegExMatch(MZA_Author,"i)^Array$")
216 | Return
217 | Filemove,%InstallAppINI%,%MZA_Dir%\%MZA_Name%.ini,1
218 | }
219 | ; ShowMZAInfo(Dir) {{{2
220 | ShowMZAInfo(Dir)
221 | {
222 | InstallAppINI := Dir "\installapps.ini"
223 | Installapp_name := IniReadValue(InstallAppINI,"apps","name")
224 | Installapp_Author := IniReadValue(InstallAppINI,"apps","Author")
225 | urlname := IniReadValue(InstallAppINI,"apps","urlname")
226 | urllink := IniReadValue(InstallAppINI,"apps","urladdr")
227 | Dest := IniReadValue(InstallAppINI,"Dest")
228 | Installapp_url := "" urlname ""
229 | Gui,Installapp:New
230 | GUi,Installapp:+hwndInstallid
231 | Gui,Installapp:Add,Text,x5 y10 w50 h20,插件名:
232 | Gui,Installapp:Add,Text,x60 y10 w400 h20,%Installapp_name%
233 | Gui,Installapp:Add,Text,x5 y40 w50 h20,打 包:
234 | Gui,Installapp:Add,Text,x60 y40 w400 h20 ,%Installapp_Author%
235 | Gui,Installapp:Add,Text,x5 y70 w50 h20,链 接:
236 | Gui,Installapp:Add,Link,x60 y70 w400 h20 ,%Installapp_URL%
237 | Gui,Installapp:Add,Edit,x5 y100 w390 h100 readonly,%Dest%
238 | Gui,Installapp:Add,Button,x200 y210 w70 gInstallMZA,添加(&Y)
239 | Gui,Installapp:Add,Button,x290 y210 w70 gGuiClose,取消(&X)
240 | GUi,Show,w400 h245,MenuZ App
241 | Loop ; Block 脚本,等侍决定
242 | {
243 | IfWinExist,AHK_Id %Installid%
244 | Sleep,100
245 | Else
246 | Break
247 | }
248 | Return
249 | InstallMZA:
250 | GoSub,GUIClose
251 | GotoInstall(Dir)
252 | Return
253 | GuiClose:
254 | Gui,Destroy
255 | Return
256 | }
257 | ; MZA_Del(Param) {{{1
258 | MZA_Del(Param)
259 | {
260 | Count := Param[0]
261 | Loop,%Count%
262 | {
263 | ThisMZA := param[A_Index]
264 | UnInstallINI := A_ScriptDir "\Apps\MZA\" ThisMZA ".ini"
265 | If FileExist(UnInstallINI)
266 | {
267 | DeleteFileCount := IniReadValue(UnInstallINI,"FileTree","0",0)
268 | DeleteFileMsg := ""
269 | Loop,%DeleteFileCount%
270 | DeleteFileMsg .= IniReadValue(UnInstallINI,"FileTree",A_Index) "`n"
271 | Msgbox,4,删除MZA, % "为免出错,MenuZ.ini中的配置内容请自行删除`n请确认要删除的内容`n" DeleteFileMsg
272 | IfMsgbox No
273 | Continue
274 | }
275 | Else
276 | Msgbox % "MZA """ ThisMZA """ 已经删除或不存在"
277 | Loop,%DeleteFileCount%
278 | {
279 | DeleteFile := IniReadValue(UnInstallINI,"FileTree",A_Index)
280 | If InStr(FileExist(DeleteFile),"D")
281 | FileRemoveDir,%DeleteFile%,1
282 | If FileExist(DeleteFile)
283 | Filedelete,%DeleteFile%
284 | }
285 | Filedelete,%UnInstallINI%
286 | }
287 | }
288 | ; MZA_List() {{{1
289 | MZA_List()
290 | {
291 | MZAListDir := A_ScriptDir "\Apps\MZA\*.ini"
292 | Gui,List:Destroy
293 | Gui,List:Default
294 | Gui,List:Add,ListView,h200 w300,插件
295 | Gui,List:Add,Button,h24 w60 x170 y210 gUnInstallThis,卸载(&U)
296 | Gui,List:Add,Button,h24 w60 x250 y210 gListDestroy,取消(&C)
297 | Loop,%MZAListDir%,0
298 | {
299 | MZA_Name := Substr(A_LoopFileName,1,Strlen(A_LoopFileName)-4)
300 | LV_Add("vis",MZA_Name)
301 | }
302 | Gui,List:Show
303 | Return
304 | UnInstallThis:
305 | ControlGet,Line,List,Count Focused,SysListView321,A
306 | LV_GetText(MZA_Name,Line)
307 | LV_Delete(Line)
308 | lparam := Object()
309 | lparam[0] := 1
310 | lparam[1] := MZA_Name
311 | MZA_Del(lparam)
312 | Return
313 | ListDestroy:
314 | Gui,List:Destroy
315 | Return
316 | }
317 | ; ToMatch(str) {{{1
318 | ToMatch(str)
319 | {
320 | str := RegExReplace(str,"\+|\?|\.|\*|\{|\}|\(|\)|\||\^|\$|\[|\]|\\","\$0")
321 | Return RegExReplace(str,"\s","\s")
322 | }
323 | ; IniReadValue(INIFile,Section="",Key="",Default="") {{{1
324 | IniReadValue(INIFile,Section="",Key="",Default="")
325 | {
326 | IniRead,Value,%INIFile%,%Section%,%Key%
327 | If Value = ERROR
328 | {
329 | If Strlen(Default)
330 | Iniwrite,%Default%,%INIFile%,%Section%,%Key%
331 | Return Default
332 | }
333 | Else
334 | Return Value
335 | }
336 |
337 |
--------------------------------------------------------------------------------
/MZGUI.ahk:
--------------------------------------------------------------------------------
1 | #SingleInstance,Force
2 | Global INI
3 | Global Controls := Object()
4 | Global Options := Object()
5 | Global SaveMenu := Object()
6 | ; Main {{{1
7 | ; GUI_LoadINI {{{2
8 | If 0 > 0
9 | {
10 | INI = %1%
11 | If (Not FileExist(INI)) OR (Not RegExMatch(INI,"i)\.ini$"))
12 | INI := A_ScriptDir "\MenuZ.ini"
13 | }
14 | Else
15 | INI := A_ScriptDir "\MenuZ.ini"
16 | ;Msgbox % INI
17 |
18 | ; GUI_Create {{{2
19 | GUI,New,+HwndConfigGUI
20 | GUI,+Delimiter`n
21 | GUI,Font,s9
22 | GUI,Add,Button,x20 y560 w80 h30,配置文件(&E)
23 | GUI,Add,Button,x250 y560 w80 h30,帮助(&H)
24 | GUI,Add,Button,x350 y560 w80 h30,应用(&O)
25 | GUI,Add,Button,x450 y560 w80 h30,关闭(&C)
26 | GUI,Add,Tab2,x10 y10 w532 h535 +Theme -Background ,菜单配置`n设置`n关于
27 | GUI,Tab,1
28 | GUI,Add,Text,x25 y48,INI(&I)
29 | INI_List := CBB_GetINIList()
30 | GUI,Add,ComboBox,x75 y45 h20 w405 R20 choose1 vGUI_INI gCBB_ChangeINI,%INI_List%
31 | GUI,Add,Button,x490 y44 h20 w35 ,&1...
32 | INI_Section := CBB_GetINISection(INI)
33 | GUI,Add,Text,x25 y78,段名(&D)
34 | GUI,Add,ComboBox,x75 y75 h20 w405 R20 choose1 vGUI_Section gCBB_ChangeSection,%INI_Section%
35 | GUI,Add,Button,x490 y74 h20 w35 ,&2...
36 | GUI,Font,s10
37 | GUI,Add,TreeView,x25 y110 w500 h250 vGUI_TreeView
38 | Options["GTV"] := True
39 | CBB_ChangeSection()
40 | GUI,Font,s9
41 | GUI,Add,Text,x25 y373 ,类型搜索(&S)
42 | GUI,Add,Edit,x100 y370 w220 h22 vGUI_Search gEdit_Search
43 | GUI,Add,Checkbox,x330 y370 h20 vCheckBox_HideComment,隐藏备注(&J)
44 | GUI,Add,Checkbox,x430 y370 h20 w95 gConfigMode vCheckBox_ConfigMode,骨灰模式(&G)
45 | GUI,Add,Text,x25 y403,菜单名称(&N)
46 | GUI,Add,Edit,x100 y400 h20 w220,
47 | GUI,Add,Text,x330 y404,热键(&K)
48 | GUI,Add,ComboBox,x380 y400 w40
49 | GUI,Add,Button,x430 y400 h20 w95 gDebugGUI,调试器(&B)
50 | GUI,Add,Text,x25 y431 vText_File,程序文件(&F)
51 | GUI,Add,Edit,x100 y428 h20 w380 vEdit_File,
52 | GUI,Add,Button,x490 y428 h20 w35 vButton_File,&3...
53 | GUI,Add,Text,x25 y459 vText_Param,参 数(&A)
54 | GUI,Add,Edit,x100 y456 h20 w380 vEdit_Param,
55 | GUI,Add,Button,x490 y456 h20 w35 vButton_Param,&4...
56 | GUI,Add,Text,x25 y487 vText_Icon,图 标(&Q)
57 | GUI,Add,Edit,x100 y484 h20 w380 vEdit_Icon,
58 | GUI,Add,Button,x490 y484 h20 w35 vButton_Icon,&5...
59 | GUI,Add,Text,x25 y515 vText_Switch,特殊开关(&T)
60 | GUI,Add,Edit,x100 y512 h20 w380 vEdit_Switch,
61 | GUI,Add,Button,x490 y512 h20 w35 vButton_Switch,&6...
62 | GUI,Add,Edit,x25 y428 h105 w500 hidden vEdit_MenuContent
63 | GUI,Show,h600,MenuZ 配置
64 | Return
65 | GuiClose:
66 | ExitApp
67 | ; Global Label {{{1
68 | ConfigMode:
69 | ConfigMode()
70 | return
71 | ; ConfigMode() {{{2
72 | ConfigMode()
73 | {
74 | GuiControlGet,Mode,,CheckBox_ConfigMode
75 | If Mode
76 | {
77 | GuiControl,Hide,Text_File
78 | GuiControl,Hide,Edit_File
79 | GuiControl,Hide,Button_File
80 | GuiControl,Hide,Text_Param
81 | GuiControl,Hide,Edit_Param
82 | GuiControl,Hide,Button_Param
83 | GuiControl,Hide,Text_Icon
84 | GuiControl,Hide,Edit_Icon
85 | GuiControl,Hide,Button_Icon
86 | GuiControl,Hide,Text_Switch
87 | GuiControl,Hide,Edit_Switch
88 | GuiControl,Hide,Button_Switch
89 | GuiControl,Show,Edit_MenuContent
90 | }
91 | Else
92 | {
93 | GuiControl,Show,Text_File
94 | GuiControl,Show,Edit_File
95 | GuiControl,Show,Button_File
96 | GuiControl,Show,Text_Param
97 | GuiControl,Show,Edit_Param
98 | GuiControl,Show,Button_Param
99 | GuiControl,Show,Text_Icon
100 | GuiControl,Show,Edit_Icon
101 | GuiControl,Show,Button_Icon
102 | GuiControl,Show,Text_Switch
103 | GuiControl,Show,Edit_Switch
104 | GuiControl,Show,Button_Switch
105 | GuiControl,Hide,Edit_MenuContent
106 | }
107 | }
108 | DebugGUI:
109 | DebugGUI()
110 | Return
111 | ; DebugGUI() {{{2
112 | DebugGUI()
113 | {
114 | ThisMenuContent := "{file:path}"
115 | SendMZC := "MZCommand:DebugGUI:" ThisMenuContent
116 | Send_WM_COPYDATA(SendMZC)
117 | }
118 | ; Edit {{{1
119 | Edit_Search:
120 | Edit_Search()
121 | Return
122 | ; Edit_Search() {{{2
123 | Edit_Search()
124 | {
125 | ControlGetText,NewINI,Edit1,A
126 | ControlGetText,NewSections,Edit3,A
127 | If Strlen(NewSections) = 0
128 | {
129 | ControlGetText,NewSections,Edit2,A
130 | MenuString := ReadMenuByType(NewINI,NewSections,1,True)
131 | }
132 | Else
133 | {
134 | If IsMainINI(NewINI)
135 | {
136 | If RegExmatch(NewSections,"i)^config$")
137 | OR RegExMatch(NewSections,"i)^hotkey$")
138 | OR RegExMatch(NewSections,"i)^env$")
139 | OR RegExMatch(NewSections,"i)^TextType$")
140 | Return
141 | If RegExMatch(NewSections,"i)^Any$")
142 | OR RegExMatch(NewSections,"i)^AnyFile$")
143 | OR RegExMatch(NewSections,"i)^AnyText$")
144 | OR RegExMatch(NewSections,"i)^AnyClass$")
145 | OR RegExMatch(NewSections,"i)^Drive$")
146 | OR RegExMatch(NewSections,"i)^Folder$")
147 | OR RegExMatch(NewSections,"i)^MultiFiles$")
148 | OR RegExMatch(NewSections,"i)^NoExt$")
149 | MenuString := ReadMenuByType(NewINI,NewSections,1,True)
150 | Else
151 | MenuString := ReadMenuByType(NewINI,NewSections,1)
152 | }
153 | Else
154 | MenuString := ReadMenuByType(NewINI,NewSections,1,True)
155 | }
156 | GTV_AddByItems(MenuString)
157 | }
158 | ; CBB ComboBox {{{1
159 | CBB_ChangeINI:
160 | CBB_ChangeINI()
161 | Return
162 | ; CBB_ChangeINI() {{{2
163 | CBB_ChangeINI()
164 | {
165 | GuiControlGet,NewINI,,GUI_INI
166 | NewSections := "`n" CBB_GetINISection(NewINI)
167 | GuiControl,, GUI_Section, %NewSections%
168 | GuiControl,Choose, GUI_Section, 1
169 | CBB_ChangeSection()
170 | }
171 | CBB_ChangeSection:
172 | CBB_ChangeSection()
173 | Return
174 | ; CBB_ChangeSection() {{{2
175 | CBB_ChangeSection()
176 | {
177 | GuiControlGet,NewINI,,GUI_INI
178 | GuiControlGet,NewSections,,GUI_Section
179 | If Options["GTV"]
180 | {
181 | MenuString := ReadMenuByType(NewINI,NewSections,1,True)
182 | Return
183 | GTV_AddByItems(MenuString)
184 | }
185 | Else
186 | Return
187 | }
188 | ; CBB_GetINIList() {{{2
189 | CBB_GetINIList()
190 | {
191 | ALLINI := "MenuZ.ini`n"
192 | ConfigDir := A_ScriptDir "\Config"
193 | If FileExist(ConfigDir)
194 | {
195 | Loop,%ConfigDir%\*.*,0,1
196 | {
197 | If RegExMatch(A_LoopFileName,"i)^auto\.ini$")
198 | Continue
199 | If RegExMatch(A_LoopFileName,"i)\.ini$")
200 | ALLINI .= "Config\" A_LoopFileName "`n"
201 | }
202 | }
203 | Return ALLINI
204 | }
205 |
206 | ; CBB_GetINISection(INIfile) {{{2
207 | CBB_GetINISection(INIfile)
208 | {
209 | Sections := IniReadValue(INIfile)
210 | Loop,Parse,Sections,`n,`r
211 | {
212 | If IsMainINI(INIfile)
213 | {
214 | If RegExmatch(A_LoopField,"i)^config$")
215 | OR RegExMatch(A_LoopField,"i)^hotkey$")
216 | OR RegExMatch(A_LoopField,"i)^env$")
217 | OR RegExMatch(A_LoopField,"i)^TextType$")
218 | Continue
219 | If RegExMatch(A_LoopField,"i)^Any$")
220 | OR RegExMatch(A_LoopField,"i)^AnyFile$")
221 | OR RegExMatch(A_LoopField,"i)^AnyText$")
222 | OR RegExMatch(A_LoopField,"i)^AnyClass$")
223 | OR RegExMatch(A_LoopField,"i)^Drive$")
224 | OR RegExMatch(A_LoopField,"i)^Folder$")
225 | OR RegExMatch(A_LoopField,"i)^MultiFiles$")
226 | OR RegExMatch(A_LoopField,"i)^NoExt$")
227 | Private .= A_LoopField "`n"
228 | Else
229 | LoopSections .= A_LoopField "`n"
230 | }
231 | Else
232 | LoopSections .= A_LoopField "`n"
233 | }
234 | Sort,LoopSections,CL
235 | ReturnSections := Private LoopSections
236 | Return ReturnSections
237 | }
238 | ; GTV GuiTreeView {{{1
239 | ; GTV_AddByItems(MenuString) {{{2
240 | GTV_AddByItems(MenuString)
241 | {
242 |
243 | }
244 | ; GTV_GetIDByText(Text) {{{2
245 | GTV_GetIDByText(Text)
246 | {
247 | MatchText := "i)^" ToMatch(Text) "$"
248 | ItemID := 0
249 | Loop
250 | {
251 | ItemID := Tv_GetNext(ItemID,"Full")
252 | If Not ItemID
253 | Break
254 | TV_GetText(ItemText,ItemID)
255 | If RegExMatch(ItemText,MatchText)
256 | Return ItemID
257 | }
258 | Return
259 | }
260 | ; Tools {{{1
261 | ; IniReadValue(INIFile,Section="",Key="",Default="") {{{2
262 | IniReadValue(INIFile,Section="",Key="",Default="")
263 | {
264 | ;DebugCount++
265 | ;Tooltip % DebugCount
266 | ErrorLevel := False
267 | IniRead,Value,%INIFile%,%Section%,%Key%
268 | If Value = ERROR
269 | {
270 | ErrorLevel := True
271 | If Strlen(Default)
272 | Iniwrite,%Default%,%INIFile%,%Section%,%Key%
273 | Return Default
274 | }
275 | Else
276 | Return Value
277 | }
278 | ; IsMainINI(INIfile) {{{2
279 | IsMainINI(INIfile)
280 | {
281 | If RegExMatch(INI,ToMatch(INIfile))
282 | Return True
283 | Else
284 | Return False
285 | }
286 | ; ReplaceVar(str) {{{2
287 | ReplaceVar(str)
288 | {
289 |
290 | Pos := 1
291 | Loop
292 | {
293 | ;Tooltip % DebugCount
294 | ;DebugCount++
295 | Pos := RegExMatch(str,"i)%[^%]*%",UserVar,Pos)
296 | If Pos
297 | {
298 | var := SubStr(UserVar,2,Strlen(UserVar)-2)
299 | If Strlen(var) = 0
300 | Break
301 | Env := IniReadValue(INI,"Env",Var)
302 | IF Not ErrorLevel
303 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
304 | Else If RegExMatch(var,"i)^apps$") ; MZ内置变量
305 | {
306 | Env := A_ScriptDir "\apps"
307 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
308 | }
309 | Else If RegExMatch(var,"i)^Script$") ; MZ内置变量
310 | {
311 | Env := A_ScriptDir "\Script"
312 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
313 | }
314 | Else If RegExMatch(var,"i)^config$")
315 | {
316 | Env := A_ScriptDir "\config"
317 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
318 | }
319 | Else If RegExMatch(var,"i)^Extensions$")
320 | {
321 | Env := A_ScriptDir "\Extensions"
322 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
323 | }
324 | Else If RegExMatch(var,"i)^icons$")
325 | {
326 | Env := A_ScriptDir "\icons"
327 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
328 | }
329 | Else If RegExMatch(var,"i)^Scriptdir$")
330 | {
331 | Env := A_ScriptDir
332 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
333 | }
334 | Else
335 | {
336 | AHK_BIEnv := A_Tab "A_WorkingDir" A_Tab "A_ScriptDir" A_Tab "A_ScriptName" A_Tab "A_ScriptFullPath" A_Tab "A_ScriptHwnd" A_Tab "A_LineNumber" A_Tab "A_LineFile" A_Tab "A_ThisFunc" A_Tab "A_ThisLabel" A_Tab "A_AhkVersion" A_Tab "A_AhkPath" A_Tab "A_IsUnicode" A_Tab "A_IsCompiled" A_Tab "A_ExitReason" A_Tab "A_YYYY" A_Tab "A_MM" A_Tab "A_DD" A_Tab "A_MMMM" A_Tab "A_MMM" A_Tab "A_DDDD" A_Tab "A_DDD" A_Tab "A_WDay" A_Tab "A_YDay" A_Tab "A_YWeek" A_Tab "A_Hour" A_Tab "A_Min" A_Tab "A_Sec" A_Tab "A_MSec" A_Tab "A_Now" A_Tab "A_NowUTC" A_Tab "A_TickCount" A_Tab "A_IsSuspended" A_Tab "A_IsPaused" A_Tab "A_IsCritical" A_Tab "A_BatchLines" A_Tab "A_TitleMatchMode" A_Tab "A_TitleMatchModeSpeed" A_Tab "A_DetectHiddenWindows" A_Tab "A_DetectHiddenText" A_Tab "A_AutoTrim" A_Tab "A_StringCaseSense" A_Tab "A_FileEncoding" A_Tab "A_FormatInteger" A_Tab "A_FormatFloat" A_Tab "A_KeyDelay" A_Tab "A_WinDelay" A_Tab "A_ControlDelay" A_Tab "A_MouseDelay" A_Tab "A_DefaultMouseSpeed" A_Tab "A_RegView" A_Tab "A_IconHidden" A_Tab "A_IconTip" A_Tab "A_IconFile" A_Tab "A_IconNumber" A_Tab "A_TimeIdle" A_Tab "A_TimeIdlePhysical" A_Tab "A_Gui" A_Tab "A_GuiControl" A_Tab "A_GuiWidth" A_Tab "A_GuiHeight" A_Tab "A_GuiX" A_Tab "A_GuiY" A_Tab "A_GuiEvent" A_Tab "A_EventInfo" A_Tab "A_ThisHotkey" A_Tab "A_PriorHotkey" A_Tab "A_PriorKey" A_Tab "A_TimeSinceThisHotkey" A_Tab "A_TimeSincePriorHotkey" A_Tab "A_Temp" A_Tab "A_OSType" A_Tab "A_OSVersion" A_Tab "A_Is64bitOS" A_Tab "A_PtrSize" A_Tab "A_Language" A_Tab "A_ComputerName" A_Tab "A_UserName" A_Tab "A_WinDir" A_Tab "A_ProgramFiles" A_Tab "A_AppData" A_Tab "A_AppDataCommon" A_Tab "A_Desktop" A_Tab "A_DesktopCommon" A_Tab "A_StartMenu" A_Tab "A_StartMenuCommon" A_Tab "A_Programs" A_Tab "A_ProgramsCommon" A_Tab "A_Startup" A_Tab "A_StartupCommon" A_Tab "A_MyDocuments" A_Tab "A_IsAdmin" A_Tab "A_ScreenWidth" A_Tab "A_ScreenHeight" A_Tab "A_IPAddress1" A_Tab "A_IPAddress2" A_Tab "A_IPAddress3" A_Tab "A_IPAddress4" A_Tab "A_Cursor" A_Tab "A_CaretX" A_Tab "A_CaretY" A_Tab
337 | SystemEnv := A_Tab "ALLUSERSPROFILE" A_Tab "APPDATA" A_Tab "CD" A_Tab "CMDCMDLINE" A_Tab "CMDEXTVERSION" A_Tab "COMPUTERNAME" A_Tab "COMSPEC" A_Tab "DATE" A_Tab "ERRORLEVEL" A_Tab "HOMEDRIVE" A_Tab "HOMEPATH" A_Tab "HOMESHARE" A_Tab "LOGONSERVER" A_Tab "NUMBER_OF_PROCESSORS" A_Tab "OS" A_Tab "PATH" A_Tab "PATHEXT" A_Tab "PROCESSOR_ARCHITECTURE" A_Tab "PROCESSOR_IDENTFIER" A_Tab "PROCESSOR_LEVEL" A_Tab "PROCESSOR_REVISION" A_Tab "PROMPT" A_Tab "RANDOM" A_Tab "SYSTEMDRIVE" A_Tab "SYSTEMROOT" A_Tab "TEMP" A_Tab "TIME" A_Tab "USERDOMAIN" A_Tab "USERNAME" A_Tab "USERPROFILE" A_Tab "WINDIR" A_Tab
338 | MatchVar := "i)\t" ToMatch(Var) "\t"
339 | If RegExMatch(AHK_BIEnv,MatchVar) ; AHK内置变量
340 | {
341 | Env := %Var%
342 | Str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
343 | }
344 | Else If RegExMatch(SystemEnv,MatchVar) ; 系统变量
345 | {
346 | EnvGet,Env,%var%
347 | Str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
348 | }
349 | Else
350 | Env := UserVar
351 | }
352 | }
353 | Else
354 | Break
355 | Pos += Strlen(Env)
356 | }
357 | Return str
358 | }
359 | ; ToMatch(str) {{{2
360 | ; 正则表达式转义
361 | ToMatch(str)
362 | {
363 | str := RegExReplace(str,"\+|\?|\.|\*|\{|\}|\(|\)|\||\^|\$|\[|\]|\\","\$0")
364 | Return RegExReplace(str,"\s","\s")
365 | }
366 | ; ToReplace(str) {{{2
367 | ToReplace(str)
368 | {
369 | If RegExMatch(str,"\$")
370 | return Regexreplace(str,"\$","$$$$")
371 | Else
372 | Return str
373 | }
374 | ; ReadMenuByType(INIFile,Type,TVLevel,OnlyType=False) {{{2
375 | ReadMenuByType(INIFile,Type,TVLevel,OnlyType=False)
376 | {
377 |
378 | }
379 | ; Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle="MenuZ.ahk ahk_class AutoHotkey") {{{2
380 | Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle="MenuZ.ahk ahk_class AutoHotkey")
381 | {
382 | VarSetCapacity(CopyDataStruct, 3*A_PtrSize, 0)
383 | SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1)
384 | NumPut(SizeInBytes, CopyDataStruct, A_PtrSize)
385 | NumPut(&StringToSend, CopyDataStruct, 2*A_PtrSize)
386 | Prev_DetectHiddenWindows := A_DetectHiddenWindows
387 | Prev_TitleMatchMode := A_TitleMatchMode
388 | DetectHiddenWindows On
389 | SetTitleMatchMode 2
390 | SendMessage, 0x4a, 0, &CopyDataStruct,, %TargetScriptTitle%
391 | DetectHiddenWindows %Prev_DetectHiddenWindows%
392 | SetTitleMatchMode %Prev_TitleMatchMode%
393 | return ErrorLevel
394 | }
395 |
--------------------------------------------------------------------------------
/MenuZ.ahk:
--------------------------------------------------------------------------------
1 | ; Version : 0.1
2 | ; 感谢万能的AHK
3 | ; 感谢Candy(万年书妖)的理念,才有MenuZ的出现。MenuZ是由Candy演化而来的。
4 | ; 感谢Sunwind和jian.w的大力支持和推动。
5 | ; 感谢小古、璀璨dē陽光、Evil、没什么大不了、汐潮等网友的意见和建议
6 | ; Init {{{1
7 | #NoEnv
8 | #SingleInstance,Force
9 |
10 | Setworkingdir,%A_ScriptDir%
11 | SetKeyDelay,-1
12 | Setbatchlines,-1
13 | ;Msgbox % A_BatchLines
14 | Scriptdir := A_ScriptDir
15 | Coordmode,Menu,Screen
16 | Coordmode,Mouse,Screen
17 | ;Fileencoding,UTF-8
18 | Global INI := ScriptDir "\menuz.ini" ; 配置文件
19 | Global ALLINI ; 每次读取INI时,会对ALLINI的文件列表进行遍历读取,默认只有INI
20 | Global TempINI := INI ; 临时调用的INI
21 | Global EditINI := INI ; 临时调用的INI
22 | Global ReadingINI
23 | Global SaveString ;全局变量SaveString,在哪里都可以被读取
24 | Global SaveClip ;全局变量SaveClip,保存剪切板原始数据
25 | Global SaveID ;保存当前选择的AHK_ID
26 | Global SaveCtrl ;保存当前选择的Ctrl
27 | Global SaveType
28 | Global ItemString ;保存执行的菜单内容
29 | Global IconState
30 | Global WorkingDir
31 | Global RunOnce := False
32 | Global RunMode := ""
33 | Global RunMode := ""
34 | Global ExecMode := ""
35 | Global AhkReturn := ""
36 | Global MenuZPos := Object()
37 | Global MenuZItem := Object()
38 | Global MenuZTextType := Object()
39 | Global MenuZSubMenu := Object()
40 | Global SystemEnv ; 用于保持所有系统变量名
41 | Global AHK_BIEnv ; 用于保持所有系统变量名
42 | Global DebugCount
43 | Menu, Tray, UseErrorLevel ;来阻止显示对话框和终止线程,并启用ErrorLevel
44 | Menu, Tray, NoStandard
45 | /*
46 | 增加脚本管理 By SunWind
47 |
48 | 2013-6-11 01:51 By Starred
49 | ** 为与MZ原先的Script目录区别开,管理脚本请存放于MyScript\ 目录中
50 |
51 | */
52 | /* 启用脚本管理功能,请去掉本行注释
53 | DetectHiddenWindows On ; 允许探测脚本中隐藏的主窗口。
54 | SetTitleMatchMode 2 ; 避免需要指定如下所示的文件的完整路径。
55 | scriptCount = 0
56 | Menu MyScript_unopen, Add
57 | Menu MyScript_unclose, Add
58 |
59 | ; 遍历MyScript目录下的ahk文件
60 | Loop, %A_WorkingDir%\MyScript\*.ahk
61 | {
62 | StringRePlace menuName, A_LoopFileName, .ahk
63 |
64 | scriptCount += 1
65 | MyScript%scriptCount%0 := A_LoopFileName
66 |
67 | IfWinExist %A_LoopFileName% - AutoHotkey ; 已经打开
68 | {
69 | Menu MyScript_unclose, add, %menuName%, tsk_close
70 | MyScript%scriptCount%1 = 1
71 | }
72 | else
73 | {
74 | Menu MyScript_unopen, add, %menuName%, tsk_open
75 | MyScript%scriptCount%1 = 0
76 | }
77 | }
78 |
79 |
80 | ; 增加管理按钮
81 | Menu Tray, Add, 启动所有脚本, tsk_openAll
82 | Menu Tray, Add, 启动脚本, :MyScript_unopen
83 | Menu Tray, Add, 关闭脚本, :MyScript_unclose
84 | Menu Tray, Add, 关闭所有脚本, tsk_closeAll
85 | Menu Tray, Add
86 | 启用脚本管理功能,请去掉本行注释 */
87 | /*
88 | 增加脚本管理结束
89 | */
90 | ;sunwind 2013年6月2日0:36:32 增加编辑配置的traymenu项
91 | ;使用方法:点击托盘图标,选择编辑配置
92 | ;说明:方便直接编辑配置
93 | Menu, Tray, Add,编辑代码(&E),ScriptEdit ; 打开当前脚本进行编辑.
94 | Menu, Tray, Add,修改配置(&C),ConfigEdit ; 打开当前配置进行编辑.
95 | Menu, Tray, Add,
96 | ;sunwind 2013年6月2日0:40:37 修正 OpenListLines 为执行状态
97 | ;增加 显示变量 为 OpenListVars
98 | Menu, Tray, Add,执行状态(&O),OpenListLines
99 | Menu, Tray, Add,显示变量(&V),OpenListVars
100 | Menu, Tray, Add,
101 | Menu, Tray, Add,调试窗口(&D),debuggui
102 | Menu, Tray, Add,隐藏运行列表(&H),debuggui
103 | Menu, Tray, Add,重启(&R),ScriptReload
104 | Menu, Tray, Add,退出(&X),Quit
105 | Menu, Tray, icon,%A_Scriptdir%\icons\menuz.ico
106 | ;Inidelete,%INI%,Hide
107 | OnMessage(0x4a, "Receive_WM_COPYDATA") ; 0x4a 为 WM_COPYDATA
108 | MenuZTextType()
109 | ;MenuZLoadINI()
110 | ; 用于保存所有系统变量名
111 | SystemEnv := A_Tab "ALLUSERSPROFILE" A_Tab "APPDATA" A_Tab "CD" A_Tab "CMDCMDLINE" A_Tab "CMDEXTVERSION" A_Tab "COMPUTERNAME" A_Tab "COMSPEC" A_Tab "DATE" A_Tab "ERRORLEVEL" A_Tab "HOMEDRIVE" A_Tab "HOMEPATH" A_Tab "HOMESHARE" A_Tab "LOGONSERVER" A_Tab "NUMBER_OF_PROCESSORS" A_Tab "OS" A_Tab "PATH" A_Tab "PATHEXT" A_Tab "PROCESSOR_ARCHITECTURE" A_Tab "PROCESSOR_IDENTFIER" A_Tab "PROCESSOR_LEVEL" A_Tab "PROCESSOR_REVISION" A_Tab "PROMPT" A_Tab "RANDOM" A_Tab "SYSTEMDRIVE" A_Tab "SYSTEMROOT" A_Tab "TEMP" A_Tab "TIME" A_Tab "USERDOMAIN" A_Tab "USERNAME" A_Tab "USERPROFILE" A_Tab "WINDIR" A_Tab
112 | AHK_BIEnv := A_Tab "A_WorkingDir" A_Tab "A_ScriptDir" A_Tab "A_ScriptName" A_Tab "A_ScriptFullPath" A_Tab "A_ScriptHwnd" A_Tab "A_LineNumber" A_Tab "A_LineFile" A_Tab "A_ThisFunc" A_Tab "A_ThisLabel" A_Tab "A_AhkVersion" A_Tab "A_AhkPath" A_Tab "A_IsUnicode" A_Tab "A_IsCompiled" A_Tab "A_ExitReason" A_Tab "A_YYYY" A_Tab "A_MM" A_Tab "A_DD" A_Tab "A_MMMM" A_Tab "A_MMM" A_Tab "A_DDDD" A_Tab "A_DDD" A_Tab "A_WDay" A_Tab "A_YDay" A_Tab "A_YWeek" A_Tab "A_Hour" A_Tab "A_Min" A_Tab "A_Sec" A_Tab "A_MSec" A_Tab "A_Now" A_Tab "A_NowUTC" A_Tab "A_TickCount" A_Tab "A_IsSuspended" A_Tab "A_IsPaused" A_Tab "A_IsCritical" A_Tab "A_BatchLines" A_Tab "A_TitleMatchMode" A_Tab "A_TitleMatchModeSpeed" A_Tab "A_DetectHiddenWindows" A_Tab "A_DetectHiddenText" A_Tab "A_AutoTrim" A_Tab "A_StringCaseSense" A_Tab "A_FileEncoding" A_Tab "A_FormatInteger" A_Tab "A_FormatFloat" A_Tab "A_KeyDelay" A_Tab "A_WinDelay" A_Tab "A_ControlDelay" A_Tab "A_MouseDelay" A_Tab "A_DefaultMouseSpeed" A_Tab "A_RegView" A_Tab "A_IconHidden" A_Tab "A_IconTip" A_Tab "A_IconFile" A_Tab "A_IconNumber" A_Tab "A_TimeIdle" A_Tab "A_TimeIdlePhysical" A_Tab "A_Gui" A_Tab "A_GuiControl" A_Tab "A_GuiWidth" A_Tab "A_GuiHeight" A_Tab "A_GuiX" A_Tab "A_GuiY" A_Tab "A_GuiEvent" A_Tab "A_EventInfo" A_Tab "A_ThisHotkey" A_Tab "A_PriorHotkey" A_Tab "A_PriorKey" A_Tab "A_TimeSinceThisHotkey" A_Tab "A_TimeSincePriorHotkey" A_Tab "A_Temp" A_Tab "A_OSType" A_Tab "A_OSVersion" A_Tab "A_Is64bitOS" A_Tab "A_PtrSize" A_Tab "A_Language" A_Tab "A_ComputerName" A_Tab "A_UserName" A_Tab "A_WinDir" A_Tab "A_ProgramFiles" A_Tab "A_AppData" A_Tab "A_AppDataCommon" A_Tab "A_Desktop" A_Tab "A_DesktopCommon" A_Tab "A_StartMenu" A_Tab "A_StartMenuCommon" A_Tab "A_Programs" A_Tab "A_ProgramsCommon" A_Tab "A_Startup" A_Tab "A_StartupCommon" A_Tab "A_MyDocuments" A_Tab "A_IsAdmin" A_Tab "A_ScreenWidth" A_Tab "A_ScreenHeight" A_Tab "A_IPAddress1" A_Tab "A_IPAddress2" A_Tab "A_IPAddress3" A_Tab "A_IPAddress4" A_Tab "A_Cursor" A_Tab "A_CaretX" A_Tab "A_CaretY" A_Tab
113 |
114 | if 0 > 0 ;判断传参
115 | {
116 | RunMode = %1%
117 | ;RunOnce := True
118 | ; Menu,Tray,NoIcon
119 | ; 参数必须为{mode}或者{mode:xxxx}
120 | ; if RegExMatch(RunMode,"i)\{mode[^\{\}]*\}")
121 | MenuZRun()
122 | }
123 | MenuZHotkey() ; 非运行一次时加载热键
124 | return
125 |
126 | ScriptEdit:
127 | Edit
128 | return
129 |
130 | ConfigEdit:
131 | gosub
132 | return
133 |
134 | OpenListLines:
135 | Listlines
136 | return
137 | ;~ sunwind 2013年6月2日0:41:51 显示脚本的 变量: 它们的名称和当前的内容.
138 | OpenListVars:
139 | ListVars
140 | return
141 | Quit:
142 | ExitApp
143 | Return
144 | ScriptReload:
145 | Reload
146 | return
147 | Suspend:
148 | Suspend
149 | Return
150 | ; Core {{{1
151 | ;/======================================================================/
152 | ; MenuZHotkey() {{{2
153 | ; 注册热键ini文件的Hotkey段
154 | MenuZHotkey()
155 | {
156 | ;Iniread,hotkeys,%INI%,Hotkey
157 | HotKeys := IniReadValue(INI,"Hotkey")
158 | If Not Strlen(Hotkeys)
159 | {
160 | INIWrite,{mode},%INI%,Hotkey,!``
161 | HotKeys := IniReadValue(INI,"Hotkey")
162 | }
163 | Loop,Parse,Hotkeys,`n,`r
164 | {
165 | If Strlen(A_LoopField) = 0
166 | Continue
167 | If RegExMatch(A_LoopField,"i)=Suspend")
168 | {
169 | MZKey := Substr(A_LoopField,1,RegExMatch(A_LoopField,"=")-1)
170 | Hotkey,%MZKey%,Suspend,On,UseErrorLevel
171 | }
172 | Else
173 | {
174 | If RegExMatch(A_LoopField,"=")
175 | MZKey := Substr(A_LoopField,1,RegExMatch(A_LoopField,"=")-1)
176 | Else
177 | MZKey := A_LoopField
178 | Value := IniReadValue(INI,"Hotkey",MZKey,"{mode}")
179 | If Not RegExMatch(Value,"\{mode[^\{\}]*\}")
180 | INIWrite,{mode},%INI%,Hotkey,%MZKey%
181 | Hotkey,%MZKey%,,On,UseErrorLevel
182 | }
183 | If ErrorLevel
184 | Msgbox % mzKey "热键定义有误"
185 | }
186 | }
187 | ; MenuZLoadINI() {{{2
188 | MenuZLoadINI()
189 | {
190 | ALLINI := INI "`n"
191 | If IniReadValue(INI,"Config","ReadALLINI",0)
192 | {
193 | ConfigDir := A_ScriptDir "\Config"
194 | If FileExist(ConfigDir)
195 | {
196 | Loop,%ConfigDir%\*.*,0,1
197 | {
198 | If RegExMatch(A_LoopFileName,"i)\.ini$")
199 | ALLINI .= A_LoopFileFullPath "`n"
200 | }
201 | }
202 | }
203 | If IniReadValue(INI,"Config","OpenWithList")
204 | ALLINI .= "`n" A_ScriptDir "\config\auto.ini"
205 | Return ALLINI
206 | }
207 | ;/======================================================================/
208 | ; MenuZTextType() {{{2
209 | ; 读取自定义文本类型
210 | MenuZTextType()
211 | {
212 | TextTypes := IniReadValue(INI,"TextType")
213 | Loop,Parse,TextTypes,`n,`r
214 | {
215 | If RegExMatch(A_LoopField,"=")
216 | {
217 | TypeName := Substr(A_LoopField,1,RegExMatch(A_LoopField,"=")-1)
218 | TypeRegEx := Substr(A_LoopField,RegExMatch(A_LoopField,"=")+1)
219 | MenuZTextType[TypeName] := TypeRegEx
220 | }
221 | }
222 | }
223 | ;/======================================================================/
224 | :
225 | ALLINI .= ReplaceVar(IniReadValue(INI,"Inifiles"),True)
226 | MenuzRun()
227 | return
228 | ; MenuzRun() {{{2
229 | MenuzRun()
230 | {
231 | MenuZPos["MenuZ"] := 1
232 | If Select()
233 | {
234 | DebugCount := 0
235 | Tooltip
236 | SelectArray := ReturnTypeString(SaveString)
237 | Type := SelectArray.Type
238 | MenuZInit(Type)
239 | If RegExMatch(SelectArray.String,"i)\.mza$")
240 | {
241 | Menu,MenuZ,Add,安装MZA包,
242 | Menu,MenuZ,Icon,安装MZA包,%A_ScriptDir%\Icons\menuz.ico
243 | Menu,MenuZ,Add
244 | }
245 | If IniReadValue(INI,"Config","OpenWithList",0)
246 | GetOpenWithList(Type,"config\auto.ini")
247 | MenuZLoadINI()
248 | CreateMenu(Type,"MenuZ",ReadToMenuZItem(Type,ALLINI))
249 | If MenuZItem[0] = 1 And ( Not RegExMatch(MenuZItem["MenuMode"],"i)\{mode\}") ) And IniReadValue(INI,"Config","OnlyOneToRun",1)
250 | {
251 | Item := MenuZItem[1]
252 | Interpreter(Item)
253 | }
254 | Else
255 | MenuZShow(Type)
256 | }
257 | }
258 | ; MenuZInit(type) {{{2
259 | MenuZInit(Type)
260 | {
261 | EditINI := ""
262 | ;一级菜单清空
263 | Menu,MenuZ,Add
264 | Menu,MenuZ,DeleteAll
265 | ; MenuZItem 数组清空
266 | MenuzItem := Object()
267 | MenuZItem["Default"] := ""
268 | ; 多文件处理
269 | If Type = CLASS
270 | {
271 | Class := Substr(SaveString,7)
272 | Type := IniReadValue(INI,Class,"ClassName")
273 | WinGetTitle,ItemKey,AHK_CLASS %Class%
274 | ItemKey := AdjustString(ItemKey,16)
275 | }
276 | Else
277 | {
278 | MenuZItem["Default"] := "copy={save:clipall}"
279 | If RegExMatch(Type,"^Multifiles$")
280 | {
281 | idx_D := 0
282 | idx_F := 0
283 | Loop,Parse,SaveString,`n
284 | {
285 | If RegExMatch(GetType(A_LoopField),"^Folder$")
286 | idx_D++
287 | If RegExMatch(GetType(A_LoopField),"^(\..*)|(NoExt)")
288 | idx_F++
289 | }
290 | ItemKey := "共有目录" idx_D "个,文件" idx_F "个"
291 | }
292 | Else
293 | {
294 | m := "^" ToMatch(Type) "\|"
295 | ; 限定不长于20个字符
296 | ItemKey := AdjustString(Regexreplace(SaveString,m),16)
297 | }
298 | }
299 | Menu,MenuZ,Add,%ItemKey%,
300 | Menu,MenuZ,Add
301 | SetTypeIcon("MenuZ",ItemKey,Type,True)
302 | }
303 | ; MenuZShow(type) {{{2
304 | MenuZShow(type)
305 | {
306 | MenuZAddL("MenuZ")
307 | If Type = CLASS
308 | {
309 | Class := Substr(SaveString,7)
310 | Type := IniReadValue(INI,Class,"ClassName")
311 | }
312 | AddMenu := BeforeConfig "管理" Type "关联菜单"
313 | If RegExMatch(Type,"^Drive$")
314 | AddMenu := BeforeConfig "管理磁盘关联菜单"
315 | If RegExMatch(Type,"^Folder$")
316 | AddMenu := BeforeConfig "管理目录关联菜单"
317 | If RegExMatch(Type,"^Text$")
318 | AddMenu := BeforeConfig "管理文本关联菜单"
319 | If RegExMatch(Type,"^Multifiles$")
320 | AddMenu := BeforeConfig "管理多文件关联菜单"
321 | Menu,MenuZ,Add,%AddMenu%,
322 | Menu,MenuZ,Icon,%AddMenu%,%A_ScriptDir%\Icons\setting.ico
323 | ShowMenu()
324 | }
325 | ShowMenu()
326 | {
327 | MouseGetPos,PosX,PosY
328 | /*
329 | xp := PosX - 50 > 0 ? PosX - 50 : 0
330 | yp := PosY - 12 > 0 ? PosY - 12 : 0
331 | */
332 | INI_xp := INIReadValue(INI,"config","xp",50)
333 | INI_yp := INIReadValue(INI,"config","yp",12)
334 | xp := PosX - INI_xp > 0 ? PosX - INI_xp : 0
335 | yp := PosY - INI_yp > 0 ? PosY - INI_yp : 0
336 | Menu,MenuZ,Show,%xp%,%yp%
337 | }
338 | :
339 | SimpleConfig()
340 | return
341 | ; Config() {{{2
342 | SimpleConfig()
343 | {
344 | Global ListBox_SConfig
345 | Global Text_SConfig
346 | If INIReadValue(INI,"Config","EditRelateINI",0)
347 | {
348 | GoSub,SCDestroy
349 | GUI,SC:Default
350 | GUI,SC:Font,s10
351 | GUI,SC:Add,ListView,Grid AltSubmit gSimpleConfig_Edit vListBox_SConfig x10 y10 h200 w400,热键|配置文件
352 | GUI,SC:Add,CheckBox,x10 y220 h26 gSimpleConfig_chk,全部配置(&D)
353 | GUI,SC:Add,Button,x110 y220 h26 gSimpleConfig_rel,打开关联配置(&F)
354 | GUI,SC:Add,Button,x230 y220 h26 gSimpleConfig_All,打开全部配置(&G)
355 | GUI,SC:Add,Button,x350 y220 h26 gSCDestroy,关闭(&C)
356 | GUI,SC:Add,Button,x1 y1 gSimpleConfig_Enter hidden Default
357 | LV_ModifyCol(1,"Center")
358 | Config := RegExReplace(INI,"i)" ToMatch(A_ScriptDir "\"))
359 | Config_List .= Config "`n"
360 | LV_Add(vis,1,Config)
361 | Loop,Parse,EditINI,`n
362 | {
363 | If FileExist(A_LoopField)
364 | {
365 | Config := RegExReplace(A_LoopField,"i)" ToMatch(A_ScriptDir "\"))
366 | Config_List .= Config "`n"
367 | Key := A_Index + 1
368 | LV_Add(vis,key,Config)
369 | }
370 | }
371 | GUI,SC:Add,Text,x1 y1 vText_SConfig hidden ,%Config_List%
372 | GUI,SC:Show,w420,配置文件管理
373 | Winactivate,配置文件管理
374 | }
375 | Else
376 | {
377 | Editor := INIReadValue(INI,"Config","Editor","Notepad.exe")
378 | Run %Editor% "%INI%"
379 | }
380 | return
381 | }
382 | SimpleConfig_Edit:
383 | SimpleConfig_Edit()
384 | return
385 | SimpleConfig_Edit()
386 | {
387 | If InStr(A_GuiEvent,"K")
388 | {
389 | If A_EventInfo = 70
390 | SimpleConfig_All()
391 | If A_EventInfo = 71
392 | SimpleConfig_rel()
393 | If A_EventInfo = 67
394 | GoSub,SCDestroy
395 | If A_EventInfo = 74
396 | ControlSend,SysListView321,{down},A
397 | If A_EventInfo = 75
398 | ControlSend,SysListView321,{up},A
399 | ControlSend,SysListView321,{bs},A
400 | Return
401 | }
402 | If InStr(A_GuiEvent,"A")
403 | {
404 | LV_GetText(inifile,A_EventInfo,2)
405 | inifile := A_ScriptDir "\" inifile
406 | If Not FileExist(inifile)
407 | Return
408 | Editor := INIReadValue(INI,"Config","Editor","Notepad.exe")
409 | Run %Editor% "%inifile%"
410 | }
411 | Else
412 | Return
413 | Return
414 | ;Msgbox % A_EventInfo
415 | ;return
416 | }
417 | SCDestroy:
418 | GUI,SC:Destroy
419 | Return
420 | SimpleConfig_All:
421 | SimpleConfig_All()
422 | Return
423 | SimpleConfig_All()
424 | {
425 | Editor := INIReadValue(INI,"Config","Editor","Notepad.exe")
426 | ConfigDir := A_ScriptDir "\Config"
427 | If FileExist(ConfigDir)
428 | {
429 | Loop,%ConfigDir%\*.*,0,1
430 | {
431 | If RegExMatch(A_LoopFileName,"i)^auto\.ini$")
432 | Continue
433 | If RegExMatch(A_LoopFileFullPath,"i)\.ini$")
434 | Run %Editor% "%A_LoopFileFullPath%"
435 | }
436 | }
437 | Run %Editor% "%INI%"
438 | }
439 | SimpleConfig_rel:
440 | SimpleConfig_rel()
441 | return
442 | SimpleConfig_rel()
443 | {
444 | Editor := INIReadValue(INI,"Config","Editor","Notepad.exe")
445 | GuiControlGet,inifiles,,Text_SConfig
446 | Loop,Parse,Inifiles,`n
447 | {
448 | If RegExMatch(A_LoopField,"i)menuz\.ini") OR ( Strlen(A_LoopField) = 0 )
449 | Continue
450 | LoopINI := A_ScriptDir "\" A_LoopField
451 | Run %Editor% "%LoopINI%"
452 | }
453 | Run %Editor% "%INI%"
454 | }
455 | SimpleConfig_chk:
456 | SimpleConfig_chk()
457 | return
458 | SimpleConfig_chk()
459 | {
460 | LV_Delete()
461 | idx := 1
462 | Config := RegExReplace(INI,"i)" ToMatch(A_ScriptDir "\"))
463 | LV_Add(vis,idx,Config)
464 | ControlGet,Value,Checked,,Button1,配置文件管理
465 | If Value
466 | {
467 | ConfigDir := A_ScriptDir "\config"
468 | If FileExist(ConfigDir)
469 | {
470 | Loop,%ConfigDir%\*.*,0,1
471 | {
472 | If RegExMatch(A_LoopFileName,"i)^auto\.ini$")
473 | Continue
474 | idx++
475 | If RegExMatch(A_LoopFileName,"i)\.ini$")
476 | config := "config\" A_LoopFileName
477 | LV_Add(vis,idx,Config)
478 | }
479 | }
480 | }
481 | Else
482 | {
483 | Loop,Parse,EditINI,`n
484 | {
485 | If FileExist(A_LoopField)
486 | {
487 | Config := RegExReplace(A_LoopField,"i)" ToMatch(A_ScriptDir "\"))
488 | Config_List .= Config "`n"
489 | Key := A_Index + 1
490 | LV_Add(vis,key,Config)
491 | }
492 | }
493 | }
494 | }
495 | SimpleConfig_Enter:
496 | SimpleConfig_Enter()
497 | Return
498 | SimpleConfig_Enter()
499 | {
500 | LV_GetText(inifile,LV_GetNext(0,"Focused"),2)
501 | inifile := A_ScriptDir "\" inifile
502 | Editor := INIReadValue(INI,"Config","Editor","Notepad.exe")
503 | Run %Editor% "%inifile%"
504 | }
505 | ; Receive_WM_COPYDATA(wParam, lParam) {{{2
506 | Receive_WM_COPYDATA(wParam, lParam)
507 | {
508 | StringAddress := NumGet(lParam + 2*A_PtrSize) ; 获取 CopyDataStruct 的 lpData 成员.
509 | AHKReturn := StrGet(StringAddress) ; 从结构中复制字符串.
510 | ; MZCommand:
511 | If InStr(Substr(AhkReturn,1,11),"MZCommand:")
512 | {
513 | MZC := SubStr(AhkReturn,11)
514 | If RegExMatch(MZC,"^\{[^\{\}]*\}")
515 | {
516 | RunMode := MZC
517 | AhkReturn := ""
518 | Settimer,MZC_RunMode,-10
519 | Return True
520 | }
521 | If RegExMatch(MZC,"i)^DebugGUI:")
522 | {
523 | AhkReturn := Substr(MZC,10)
524 | Settimer,MZC_DebugGUI,-10
525 | Return True
526 | }
527 | }
528 | return true ; 返回 1 (true) 是回复此消息的传统方式.
529 | }
530 | ; MZCommand {{{2
531 | ; MZC_RunMode() {{{3
532 | MZC_RunMode:
533 | MenuZRun()
534 | return
535 | ; MZC_DebugGUI() {{{3
536 | MZC_DebugGUI:
537 | GoSub,DebugGUI
538 | WinWaitActive,MenuZ Debug,,1
539 | ControlSetText,Edit2,%AHKReturn%,MenuZ Debug
540 | AHKReturn := ""
541 | return
542 | ; 限制文本长度为Count,不够的话,补充空格
543 | AdjustString(String,Count)
544 | {
545 | String := RegExReplace(String,"(\t|\n|\r)"," ")
546 | If Strlen(String) <= Count
547 | {
548 | AddSpaceCount := Count - Strlen(String)
549 | Loop,% AddSpaceCount+2
550 | String .= A_Space
551 | }
552 | Else
553 | String := SubStr(String,1,Count/2) "..." Substr(String,-(count/2)+1)
554 | Return String
555 | }
556 | ;/=======================================================================/
557 | ; MenuZAddL() {{{2
558 | MenuZAddL(MenuName)
559 | {
560 | If Strlen(MenuZPos[MenuName]) = 0
561 | MenuZPos[MenuName] := 2
562 | If MenuZPos[MenuName] > 1
563 | Menu,%MenuName%,Add
564 | }
565 | ;/=======================================================================/
566 | ; Select() {{{2
567 | ; 获取数据,并根据数据内容返回相应的格式
568 | ; 如果是单文件,会保存扩展名加文件完全路径的形式
569 | ; Ex : .lnk|D:\Desktop\word 2012.lnk
570 | ; 如果是单文件夹,会保存Folder加文件夹路径的形式
571 | ; Ex : Folder|D:\Desktop\
572 | ; 如果是单文件夹,会保存Drive加文件夹路径的形式
573 | ; Ex : Drive|D:\Desktop\
574 | ; 如果是单文件夹,会保存NoExt加文件夹路径的形式
575 | ; Ex : NoExt|D:\Desktop\
576 | ; 多文件或者多文件夹的时候,就是叠加而已,回车换行
577 | ; Ex : .lnk|D:\Desktop\word 2012.lnk
578 | ; .lnk|D:\Desktop\notepad.lnk
579 | ; .lnk|D:\Desktop\exploer.lnk
580 | Select()
581 | {
582 | WinGet,SaveID,ID,A
583 | ControlGetFocus,SaveCtrl,A
584 | MaxTimeWait := INIReadValue(INI,"Config","SelectOverTime",4)
585 | ClipSaved := ClipboardAll
586 | Clipboard =
587 | Sendinput ^c
588 | While(!Clipboard)
589 | {
590 | ClipWait,0.1,1
591 | If A_Index > %MaxTimeWait%
592 | Break
593 | }
594 | Select = %Clipboard% ; 强制转换为纯文本
595 | ;Select := Clipboard
596 | SaveClip := ClipboardAll
597 | IsFile := DllCall("IsClipboardFormatAvailable","int",15)
598 | Clipboard := ClipSaved
599 | ClipSaved =
600 | If Strlen(Select) = 0 ; 如果选择无效,根据Class调用菜单
601 | {
602 | WinGetClass,Class,AHK_ID %SaveID%
603 | SaveString := "CLASS|" Class
604 | Ifwinexist,MenuZ Debug
605 | {
606 | ControlSetText,Edit1,,MenuZ Debug
607 | ControlSetText,Edit1,%SaveString%,MenuZ Debug
608 | }
609 | Return SaveString
610 | }
611 | SaveString := ; 如果选择有效,清空当前保存的选择(SaveString)
612 | If RegExMatch(Select,"(^.:\\.*)|(^\\\\.*)") And IsFile ;文件或文件夹
613 | {
614 | If RegExMatch(Select,"\n") ;多文件
615 | {
616 | Loop,Parse,Select,`n,`r
617 | {
618 | If RegExMatch(A_LoopField,"[a-zA-Z]:\\$")
619 | {
620 | SaveString .= "Drive|" . A_LoopField . "`r`n"
621 | Continue
622 | }
623 | Select_Attr := FileExist(A_LoopField)
624 | If RegExMatch(Select_Attr,"D") ;如果为目录时,用D加|,再加路径名
625 | SaveString .= "Folder|" . A_LoopField . "`r`n"
626 | Else
627 | {
628 | Splitpath,A_LoopField,,,Select_Extension
629 | ;如果为文件时,以".扩展名"加|,再加路径,无扩展名时,只带".",识别为文本文件
630 | If Select_Extension
631 | SaveString .= "." . Select_Extension . "|" . A_LoopField . "`r`n"
632 | Else
633 | SaveString .= "NoExt|" . A_LoopField . "`r`n"
634 | }
635 | }
636 | }
637 | Else ; 单文件
638 | {
639 | If RegExMatch(Select,"[a-zA-Z]:\\$")
640 | SaveString .= "Drive|" . Select ;. "`r`n"
641 | Else
642 | {
643 | Select_Attr := FileExist(Select)
644 | If RegExMatch(Select_Attr,"D") ;如果为目录时,用D加|,再加路径名
645 | SaveString .= "Folder|" . Select
646 | Else
647 | {
648 | Splitpath,Select,Select_Name,,Select_Extension
649 | If Select_Extension
650 | SaveString .= "." . Select_Extension . "|" . Select
651 | Else
652 | SaveString .= "NoExt|" . Select ;. "`r`n"
653 | }
654 | }
655 | }
656 | }
657 | Else
658 | SaveString := TextType(Select)
659 | Ifwinexist,MenuZ Debug
660 | {
661 | ControlSetText,Edit1,%SaveString%,MenuZ Debug
662 | DebugSwitch()
663 | }
664 | Return SaveString
665 | }
666 | :
667 | InstallMZA()
668 | return
669 | InstallMZA()
670 | {
671 | SelectArray := ReturnTypeString(SaveString)
672 | Select := SelectArray.String
673 | Run "%A_AhkPath%" "%A_ScriptDir%\Actman.ahk" /a "%Select%"
674 | }
675 | ;/=======================================================================/
676 | ; Interpreter() {{{2
677 | ; 替换内置变量
678 | :
679 | Interpreter()
680 | return
681 | Interpreter(Item="")
682 | {
683 | ; 如果无相应的Item传入,则Loop获取当前Item的菜单内容
684 | If Strlen(Item) = 0
685 | {
686 | If ( A_ThisMenuItemPos = 1 ) And RegExMatch(A_ThisMenu,"^MenuZ$")
687 | Item := MenuZItem["Default"]
688 | Else
689 | {
690 | Match := "^\[" ToMatch(A_ThisMenu) "\]" ToMatch(A_ThisMenuItem) "=.*"
691 | DelMatch := "\[" ToMatch(A_ThisMenu) "\]"
692 | For,index,key in MenuZItem
693 | {
694 | If RegExMatch(Key,Match)
695 | Item := RegExReplace(Key,DelMatch)
696 | }
697 | }
698 | }
699 | If RegExMatch(Item,"=")
700 | ItemString := SubStr(Item,RegExMatch(Item,"=")+1)
701 | Else
702 | ItemString := Item
703 | ; 如果全局变量RunMode存在,则设定MenuMode为RunMode保存的模式来执行
704 | If RunMode
705 | MenuMode := RunMode
706 | Else
707 | {
708 | ; 读取模式
709 | IniRead,MenuMode,%INI%,Hotkey,%A_ThisHotkey%
710 | If RegExMatch(MenuMode,"i)^\{mode\}") OR RegExMatch(MenuMode,"^ERROR$")
711 | MenuMode := ""
712 | }
713 | ; 定义执行所有Item的正则
714 | If Strlen(MenuMode) = 0
715 | ModeAll := "i)\{mode:all\}"
716 | Else
717 | ModeAll := "i)" ToMatch(Substr(MenuMode,1,strlen(MenuMode)-1)) ":all\}"
718 | ; 满足{mode:xxxx:all}时,执行所有当前模式的Item
719 | ; 可以得出菜单项ItemString
720 | If RegExMatch(ItemString,ModeALL)
721 | {
722 | Loop, % MenuZItem[0]
723 | {
724 | NeedRun := True
725 | If RegExMatch(MenuZItem[A_Index],"=")
726 | LoopItemString := Substr(MenuZItem[A_Index],RegExMatch(MenuZIte[A_Index],"=")+1)
727 | Else
728 | LoopItemString := MenuZItem[A_Index]
729 | LoopItemValue := ReplaceSwitch(LoopItemString)
730 | Ifwinexist,MenuZ Debug
731 | {
732 | ControlGet,NeedRun,Checked,,Button1,MenuZ Debug
733 | ControlGetText,Edit2_str,Edit2,MenuZ Debug
734 | Edit2_str .= "`n`n`n" LoopItemString
735 | ControlSetText,Edit2,%Edit2_str%,MenuZ Debug
736 | ControlGetText,Edit3_str,Edit3,MenuZ Debug
737 | Edit3_str .= "`n`n`n" LoopItemValue
738 | ControlSetText,Edit3,%Edit3_str%,MenuZ Debug
739 | If Not NeedRun
740 | Continue
741 | }
742 | Pos := RegExMatch(LoopItemValue,"i)\{send[^\}\{]*\}",Switch)
743 | If Pos
744 | {
745 | Block1 := SubStr(LoopItemValue,1,Pos-1)
746 | Pid := ToRun(Block1,ExecMode)
747 | If Pid
748 | WinWaitActive,AHK_PID %PID%,,1
749 | If Not ErrorLevel OR Pid
750 | {
751 | Block2 := Substr(LoopItemValue,Pos+strlen(Switch)+1)
752 | If RegExMatch(Switch,"i)\{send:key\}")
753 | Send %Block2%
754 | Else
755 | SendRaw,%Block2%
756 | }
757 | }
758 | Else
759 | ToRun(LoopItemValue,ExecMode)
760 | }
761 | }
762 | Else
763 | {
764 | ItemValue := ReplaceSwitch(ItemString)
765 | NeedRun := True
766 | Ifwinexist,MenuZ Debug
767 | {
768 | ControlGet,NeedRun,Checked,,Button1,MenuZ Debug
769 | ControlSetText,Edit2,,MenuZ Debug
770 | ControlSetText,Edit2,%ItemString%,MenuZ Debug
771 | ControlSetText,Edit3,,MenuZ Debug
772 | ControlSetText,Edit3,%ItemValue%,MenuZ Debug
773 | }
774 | If NeedRun
775 | {
776 | Pos := RegExMatch(ItemValue,"i)\{send[^\}\{]*\}",Switch)
777 | If Pos
778 | {
779 | Block1 := SubStr(ItemValue,1,Pos-1)
780 | Pid := ToRun(Block1,ExecMode)
781 | If pid
782 | WinWaitActive,AHK_PID %PID%,,1
783 | If Not ErrorLevel OR Pid
784 | {
785 | Block2 := Substr(ItemValue,Pos+strlen(Switch)+1)
786 | If RegExMatch(Switch,"i)\{send:key\}")
787 | Send %Block2%
788 | Else
789 | SendRaw %Block2%
790 | }
791 | }
792 | Else
793 | ToRun(ItemValue,ExecMode)
794 | }
795 | }
796 | If RunOnce
797 | ExitApp
798 | SaveClip =
799 | }
800 | ; ToRun(str,Mode="") {{{2
801 | ToRun(str,Mode="")
802 | {
803 | If RegExMatch(Mode,"i)^none$")
804 | return
805 | If RegExMatch(Mode,"i)^max$")
806 | {
807 | Run %str%,%WorkingDir%,Max UseErrorLevel,runpid
808 | If ErrorLevel
809 | Traytip,错误,%str%`n运行有误,请检查,10,3
810 | WinGet,m,MinMax,AHK_PID %runpid%
811 | If m <> 1
812 | Winmaximize,AHK_PID %runpid%
813 | }
814 | If RegExMatch(Mode,"i)^min$")
815 | {
816 | Run %str%,%WorkingDir%,min UseErrorLevel,runpid
817 | If ErrorLevel
818 | Traytip,错误,%str%`n运行有误,请检查,10,3
819 | WinGet,m,MinMax,AHK_PID %runpid%
820 | If m <> -1
821 | Winminimize,AHK_PID %runpid%
822 | }
823 | If RegExMatch(Mode,"i)^hide$")
824 | {
825 | Run %str%,%WorkingDir%,hide UseErrorLevel,runpid
826 | If ErrorLevel
827 | Traytip,错误,%str%`n运行有误,请检查,10,3
828 | WinGetPos,x,y,,,AHK_PID %runpid%
829 | If (x <> "") or (y <> "")
830 | Winhide,AHK_PID %runpid%
831 | }
832 | If Not RegExMatch(Mode,"i)(max)|(min)|(hide)")
833 | {
834 | Run %str%,%WorkingDir%,UseErrorLevel,runpid
835 | If ErrorLevel
836 | Traytip,错误,%str%`n运行有误,请检查,10,3
837 | }
838 | If IniReadValue(INI,"Config","TrayTip",1)
839 | Traytip,运行结果,%Str%,10,1
840 | EmptyMem()
841 | return,runpid
842 | }
843 | RunSendKey(String,Pos)
844 | {
845 | Block1 := SubStr(String,1,Pos-1)
846 | Pid := ToRun(Block1,ExecMode)
847 | If Pid
848 | WinWaitActive,AHK_PID %PID%,,1
849 | If Not ErrorLevel OR Pid
850 | {
851 | Block2 := Substr(String,Pos+strlen(Switch)+1)
852 | If RegExMatch(Switch,"i)\{send:key\}")
853 | Send %Block2%
854 | Else
855 | SendRaw,%Block2%
856 | }
857 | }
858 | ;/======================================================================/
859 | ; ReadToMenuZItem(Type,INI,OnlyType=False) {{{2
860 | ; 要获取的Section段,一般为Type、子菜单名
861 | ; INI为INI文件列表
862 | ; 保存为多行字符串
863 | ReadToMenuZItem(Type,INIFiles,OnlyType=False,ModeCtrl=False)
864 | {
865 | IsClass := RegExMatch(Type,"^CLASS$")
866 | Select := ReturnTypeString(SaveString)
867 | WinGetClass,ThisClass,AHK_ID %SaveID%
868 | ControlGetFocus,ThisControl,AHK_ID %SaveID%
869 | IconState := IniReadValue(INI,"config","HideIcon",0)
870 | MatchThisClass := ToMatch(ThisClass)
871 | MatchThisControl := ToMatch(ThisControl)
872 | MatchThisType := ToMatch(Select.Type)
873 | MatchClass := "i)(^" MatchThisClass "\|)|(\|" MatchThisClass "\|)|(\|" MatchThisClass "$)|(^" MatchThisClass "$)"
874 | MatchControl := "i)(^" MatchThisControl "\|)|(\|" MatchThisControl "\|)|(\|" MatchThisControl "$)|(^" MatchThisControl "$)"
875 | MatchType := "i)(^" MatchThistype "\|)|(\|" MatchThistype "\|)|(\|" MatchThisType "$)|(^" MatchThistype "$)"
876 | MenuMode := Strlen(RunMode) ? RunMode : IniReadValue(INI,"Hotkey",A_Thishotkey,"{Mode}")
877 | MenuZItem["MenuMode"] := MenuMode
878 | MatchMode := "i)" ToMatch(MenuMode) ; 用于后继的正则比较
879 | MatchModeALL := "i)" ToMatch(Substr(MenuMode,1,strlen(MenuMode)-1)) ":all\}" ; 用于后继的ModeALL正则比较
880 | Match := ToMatch(Type)
881 | InMatch := "i)(^" Match "\|)|(\|" Match "\|)|(\|" Match "$)" ; 模糊匹配
882 | If IsClass
883 | Type := SubStr(SaveString,7) ;如果是CLASS的话,Type为CLASS| 后的内容
884 | Loop,Parse,INIFiles,`n,`r
885 | {
886 | LoopINI := A_LoopField
887 | If FileExist(LoopINI)
888 | {
889 | TypeItem .= IniReadValue(LoopINI,Type) "`n" ; 最佳匹配优先
890 | If OnlyType
891 | Continue
892 | ALLSection := IniReadValue(LoopINI) ; 读取当前循环INI的值
893 | Loop,Parse,ALLSection,`n,`;r
894 | {
895 | LoopSection := A_LoopField
896 | If RegExMatch(LoopSection,InMatch)
897 | FuzzyItem .= IniReadValue(LoopINI,LoopSection) "`n"
898 | }
899 | ; 分类AnyFile,AnyText,AnyClass,Mfile
900 | If IsClass
901 | CategoryItem .= IniReadValue(LoopINI,"AnyClass") "`n" ; 根据对象所属大类匹配
902 | Else
903 | {
904 | If RegExMatch(Type,"(^\.)|(^Folder$)|(^Drive$)|(^NoExt$)")
905 | CategoryItem .= IniReadValue(LoopINI,"AnyFile") "`n"
906 | Else
907 | If Not RegExMatch(Type,"^Multifiles$")
908 | CategoryItem .= IniReadValue(LoopINI,"AnyText") "`n"
909 | }
910 | AnyItem .= IniReadValue(LoopINI,"Any") "`n"
911 | }
912 | }
913 | If OnlyType
914 | ALLItem := TypeItem
915 | Else
916 | ALLItem := TypeItem . FuzzyItem . CategoryItem . AnyItem
917 | ;Msgbox % ALLItem
918 | Loop,Parse,ALLItem,`n,`r
919 | {
920 | LoopString := substr(A_LoopField,1,Instr(A_LoopField,"=")) ReplaceVar(substr(A_LoopField,instr(A_LoopField,"=")+1))
921 | If Not RegExMatch(LoopString,"[^\s\t]") OR ( RegExMatch(LoopString,"i)^ClassName=") And IsClass )
922 | Continue
923 | If RegExMatch(MenuMode,"i)\{mode\}")
924 | {
925 | If RegExMatch(LoopString,"i)\{sep\}")
926 | Continue
927 | }
928 | Else
929 | {
930 | If ( Not RegExMatch(LoopString,MatchMode) ) And ( Not RegExMatch(LoopString,MatchModeAll) ) And ( Not ModeCtrl )
931 | Continue
932 | }
933 | If RegExMatch(LoopString,"i)\{blank\}")
934 | Continue
935 | If RegExMatch(LoopString,"i)\{default\}",Switch)
936 | {
937 | LoopString := RegExReplace(LoopString,ToMatch(Switch))
938 | MenuZItem["Default"] := LoopString
939 | }
940 | ; 根据 Class 类进行分辨
941 | If RegExMatch(LoopString,"i)\{class:[^\{\}]*\}",Switch)
942 | {
943 | LoopString := RegExReplace(LoopString,ToMatch(Switch))
944 | Mode := SubStr(Switch,8,1)
945 | Class := Substr(Switch,9,strlen(Switch)-9)
946 | If ( Not RegExMatch(Class,MatchClass) And RegExMatch(Mode,"=") ) OR ( RegExMatch(Mode,"!") AND RegExMatch(Class,MatchClass) )
947 | Continue
948 | }
949 | ; 根据control 来决定要哪个菜单
950 | If RegExMatch(LoopString,"i)\{control:[^\{\}]*\}",Switch)
951 | {
952 | LoopString := RegExReplace(LoopString,ToMatch(Switch))
953 | Mode := SubStr(Switch,10,1)
954 | Control := Substr(Switch,11,strlen(Switch)-11)
955 | If ( Not RegExMatch(Control,MatchControl) And RegExMatch(Mode,"=") ) OR ( RegExMatch(Mode,"!") AND RegExMatch(Control,MatchControl) )
956 | Continue
957 | }
958 | ; 根据 type 来决定要哪个菜单
959 | If RegExMatch(LoopString,"i)\{type:[^\}]*\}",Switch)
960 | {
961 | LoopString := RegExReplace(LoopString,ToMatch(Switch))
962 | Mode := SubStr(Switch,7,1)
963 | thistype := Substr(Switch,8,strlen(Switch)-8)
964 | If ( Not RegExMatch(thistype,MatchType) And RegExMatch(Mode,"=") ) OR ( RegExMatch(Mode,"!") AND RegExMatch(thistype,MatchType) )
965 | Continue
966 | }
967 | If RegExMatch(LoopString,"i)\{mtype:[^\{\}]*\}",Switch) And RegExMatch(Select.Type,"^Multifiles$")
968 | {
969 | LoopString := RegExReplace(LoopString,ToMatch(Switch))
970 | Mode := SubStr(Switch,8,1)
971 | thistype := Substr(Switch,9,strlen(Switch)-9)
972 | mfiles := Select.String
973 | Loop,Parse,mfiles,`n
974 | {
975 | If strlen(A_LoopField) = 0
976 | Continue
977 | mt_MatchThisType := ToMatch(GetType(A_LoopField))
978 | mt_MatchType := "i)(^" mt_MatchThistype "\|)|(\|" mt_MatchThistype "\|)|(\|" mt_MatchThisType "$)|(^" mt_MatchThistype "$)"
979 | If ( Not RegExMatch(thistype,mt_MatchType) And RegExMatch(Mode,"=") ) OR ( RegExMatch(Mode,"!") AND RegExMatch(thistype,mt_MatchType) )
980 | IsContinue := True
981 | Else
982 | IsContinue := False
983 | }
984 | If IsContinue
985 | Continue
986 | }
987 | ; 根据 name 来决定要哪个菜单
988 | If RegExMatch(LoopString,"i)\{name:[^\}]*\}",Switch) AND RegExMatch(Select.Type,"(^\.)|(^Folder$)|(^Drive$)|(^NoExt$)")
989 | {
990 | LoopString := RegExReplace(LoopString,ToMatch(Switch))
991 | Mode := SubStr(Switch,7,1)
992 | MatchThisName := Substr(Switch,8,strlen(Switch)-8)
993 | thisname := SplitpathNameOnly(Select.String)
994 | MatchName := ""
995 | Loop,Parse,MatchThisName,|
996 | MatchName .= "(" ToMatch(A_LoopField) ")|"
997 | MatchName := "i)" SubStr(MatchName,1,Strlen(MatchName)-1)
998 | If ( Not RegExMatch(thisname,MatchName) And RegExMatch(Mode,"=") ) OR ( RegExMatch(Mode,"!") AND RegExMatch(thisname,MatchName) )
999 | Continue
1000 | }
1001 | NewALLItem .= LoopString "`n"
1002 | }
1003 | Return NewALLItem
1004 | }
1005 | ; 根据数组内容创建Menu
1006 | ; CreateMenu(Type,MenuName,ALLItem="") {{{2
1007 | CreateMenu(Type,MenuName,ALLItem="",Enforcement=False)
1008 | {
1009 | ExecMode := ""
1010 | MatchItem := "i)\t" ToMatch(MenuName) "\t"
1011 | If RegExMatch(MenuZItem["Menus"],MatchItem) And ( Not Enforcement )
1012 | return False
1013 | Else
1014 | MenuZItem["Menus"] .= A_Tab MenuName A_Tab
1015 | If Not RegExMatch(MenuName,"i)MenuZ")
1016 | {
1017 | Menu,%MenuName%,Add
1018 | Menu,%MenuName%,DeleteAll
1019 | }
1020 | Loop,Parse,ALLItem,`n,`r
1021 | {
1022 | LoopString := A_LoopField
1023 | If Not RegExMatch(LoopString,"[^\s\t]")
1024 | Continue
1025 | If RegExMatch(LoopString,"i)^sid=")
1026 | Continue
1027 | ;If RegExMatch(LoopString,">>[^=]*=")
1028 | If RegExMatch(LoopString,"i)\{SubMenu:[^\{\}]*\}",Switch)
1029 | {
1030 | SubMenuName := Substr(Switch,10,strlen(Switch)-10)
1031 | If CreateMenu(Type,SubMenuName,ReadToMenuZItem(SubMenuName,TempINI,True,True))
1032 | IsSubMenuName := True
1033 | Else
1034 | Continue
1035 | }
1036 | If RegExMatch(LoopString,"i)\{inifile:[^\{\}]*\}",Switch)
1037 | {
1038 | INIFile := Substr(Switch,10,strlen(Switch)-10)
1039 | If Not RegExMatch(INIFile,"(^.:\\.*)|(^\\\\.*)")
1040 | INIFile := A_ScriptDir "\" INIFile
1041 | Splitpath,INIFile,,,,INIType
1042 | SaveALLINI := TempINI
1043 | TempINI := INIFile
1044 | MatchINIFile := "\t" ToMatch(INIFile) "\t"
1045 | If Not RegExMatch(EditINI,MatchINIFile)
1046 | EditINI .= INIFile "`n"
1047 | If CreateMenu(Type,MenuName,ReadToMenuZItem(INIType,INIFile,True,True),True)
1048 | TempINI := SaveALLINI
1049 | Continue
1050 |
1051 | /*
1052 | INIFile := Substr(Switch,10,strlen(Switch)-10)
1053 | SubMenuName := SubStr(LoopString,1,RegExMatch(LoopString,"=")-1)
1054 | If Not RegExMatch(INIFile,"(^.:\\.*)|(^\\\\.*)")
1055 | INIFile := A_ScriptDir "\" INIFile
1056 | Splitpath,INIFile,,,,INIType
1057 | SaveALLINI := TempINI
1058 | TempINI := INIFile
1059 | ;Msgbox % SubMenuName "`n" ReadToMenuZItem(INIType,INIFile,True)
1060 | If CreateMenu(Type,SubMenuName,ReadToMenuZItem(INIType,INIFile,True),True)
1061 | {
1062 | IsSubMenuName := True
1063 | TempINI := SaveALLINI
1064 | }
1065 | Else
1066 | Continue
1067 | */
1068 | }
1069 | /*
1070 | If RegExMatch(LoopString,"i)\{DynMenu:[^\{\}]*\}",Switch)
1071 | {
1072 | SubMenuName := Substr(Switch,10,strlen(Switch)-10)
1073 | RunAHK := A_AhkPath " """ SubMenuName """"
1074 | Runwait,%RunAHK%
1075 | DynItems := AhkReturn
1076 | If Strlen(DynItems)
1077 | {
1078 | If CreateMenu(Type,SubMenuName,DynItems)
1079 | IsSubMenuName := True
1080 | Else
1081 | Continue
1082 | }
1083 | Else
1084 | Continue
1085 | }
1086 | */
1087 | If RegExMatch(LoopString,"^[^=]*\\[^=]*=")
1088 | {
1089 | OLkey := Substr(LoopString,1,RegExMatch(LoopString,"\\")-1)
1090 | SubMenuName := OLKey
1091 | LoopString := OLKey
1092 | MatchOLKey := "^" ToMatch(OLKey) "\\"
1093 | SubMenuItems := ""
1094 | Loop,Parse,ALLItem,`n,`r
1095 | {
1096 | If RegExMatch(A_LoopField,MatchOLKey)
1097 | SubMenuItems .= RegExReplace(A_LoopField,MatchOLKey) "`n"
1098 | }
1099 | If CreateMenu(Type,SubMenuName,SubMenuItems,True)
1100 | IsSubMenuName := True
1101 | Else
1102 | Continue
1103 | }
1104 | If RegExMatch(LoopString,"=")
1105 | ItemKey := SubStr(LoopString,1,RegExMatch(LoopString,"=")-1)
1106 | Else
1107 | ItemKey := LoopString
1108 | ItemValue := SubStr(LoopString,RegExMatch(LoopString,"=")+1)
1109 | If RegExMatch(ItemKey,"^-$")
1110 | MenuZAddL(MenuName)
1111 | Else
1112 | {
1113 | If Not RegExMatch(LoopString,"i)\{hide\}")
1114 | {
1115 | If IsSubMenuName
1116 | {
1117 | Menu,%MenuName%,Add,%ItemKey%,:%SubMenuName%
1118 | IsSubMenuName := False
1119 | }
1120 | Else
1121 | Menu,%MenuName%,Add,%ItemKey%,
1122 | ;Menu,%MenuName%,Color,FFFF00,single
1123 | If ErrorLevel
1124 | Continue
1125 | Else
1126 | SetTypeIcon(MenuName,ItemKey,ItemValue)
1127 | }
1128 | Pos := MenuZItem[0]
1129 | Pos++
1130 | MenuZItem[0] := Pos
1131 | MenuzItem[Pos] := "[" MenuName "]" LoopString
1132 | MenuZPos[MenuName]++
1133 | }
1134 | }
1135 | Return True
1136 | }
1137 | ; TextType(Text) {{{2
1138 | ; 根据正则式返回相应的文本类型
1139 | ; 内置正则式,及INI定义正则式
1140 | TextType(Text)
1141 | {
1142 | ;http://www.baidu.com
1143 | ;ftp://192.168.1.1
1144 | If RegExMatch(Text,"^\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))")
1145 | Return "URL|" Text
1146 | ;If RegExMatch(Text,"i)ftps?://.*")
1147 | ; Return "FTP|" Text
1148 | ;If RegExMatch(Text,"i)\\\\.*")
1149 | ; Return "SHARE|" Text
1150 | ;If RegExMatch(Text,"i)\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")
1151 | ; Return "EMAIL|" Text
1152 | For,TypeName,TypeRegEx IN MenuZTextType
1153 | {
1154 | If RegExMatch(Text,TypeRegEx)
1155 | Return TypeName "|" Text
1156 | }
1157 | Return "Text|" Text
1158 | }
1159 | ;/=======================================================================/
1160 | ; GetType(str) {{{2
1161 | ; 返回获取数据的类型
1162 | ; 1、文件:根据后缀返回类型,如.lnk .doc .docx 等
1163 | ; 2、文件夹:返回D
1164 | ; 3、多文件(夹):返回M
1165 | ; 4、文本:根据正则式返回相应的文本类型,如果无相关定义,返回Type
1166 | GetType(str)
1167 | {
1168 | If RegExMatch(str,"^((\..*)|(Folder)|(NoExt)|(Drive))\|")
1169 | {
1170 | If RegExMatch(str,"\n")
1171 | Return "Multifiles"
1172 | }
1173 | Return SubStr(str,1,RegExMatch(str,"\|")-1)
1174 | }
1175 | ;/=======================================================================/
1176 | ; SetTypeIcon(MenuName,ItemKey,ItemValue,Ext=False) {{{2
1177 | ; 当Ext为True时,寻找ItemValue对应后缀名的Icon,并应用到MenuZItem上
1178 | SetTypeIcon(MenuName,ItemKey,ItemValue,Ext=False)
1179 | {
1180 | If Ext
1181 | {
1182 | Shell32DLL := A_WinDir "\system32\shell32.dll"
1183 | If RegExMatch(ItemValue,"^Multifiles$")
1184 | Return ReturnIcon(MenuName,ItemKey,Shell32DLL,"135")
1185 | If RegExMatch(ItemValue,"^Drive$")
1186 | Return ReturnIcon(MenuName,ItemKey,Shell32DLL,"9")
1187 | If RegExMatch(ItemValue,"^Folder$")
1188 | Return ReturnIcon(MenuName,ItemKey,Shell32DLL,"4")
1189 | If RegExMatch(ItemValue,"i)^\.lnk$")
1190 | Return ReturnIcon(MenuName,ItemKey,Shell32DLL,"264")
1191 | If RegExMatch(ItemValue,"^NoExt$")
1192 | Return ReturnIcon(MenuName,ItemKey,Shell32DLL,"291")
1193 | If RegExMatch(ItemValue,"^[^\.]")
1194 | Return ReturnIcon(MenuName,ItemKey,Shell32DLL,"268")
1195 | If RegExMatch(ItemValue,"i)\.exe")
1196 | {
1197 | Match := ToMatch(ItemValue) "\|"
1198 | Path := RegExReplace(SaveString,Match)
1199 | Return ReturnIcon(MenuName,ItemKey,Path,1)
1200 | }
1201 | RegRead,file,HKEY_CLASSES_ROOT,%ItemValue%
1202 | RegRead,IconString,HKEY_CLASSES_ROOT,%file%\DefaultIcon
1203 | If ErrorLevel
1204 | Return ReturnIcon(MenuName,ItemKey,Shell32DLL,"291")
1205 | If RegExMatch(IconString,"%1")
1206 | {
1207 | RegRead,IconPath,HKCR,%file%\Shell\Open\Command
1208 | tm = `"
1209 | ;IconPath := LTrim(ReplaceVar(IconPath),tm)
1210 | IconPath := LTrim(IconPath,tm)
1211 | If FileExist(IconPath)
1212 | Loop_exec := IconPath
1213 | Else
1214 | Loop,% Strlen(IconPath)
1215 | {
1216 | Loop_exec := SubStr(IconPath,1,strlen(IconPath)-A_Index)
1217 | If FileExist(Loop_exec)
1218 | Break
1219 | }
1220 | IconPath := Loop_exec
1221 | IconIndex := 2
1222 | Return ReturnIcon(MenuName,ItemKey,IconPath,IconIndex)
1223 | }
1224 | Else
1225 | {
1226 | ; IconPath := RegExReplace(ReplaceVar(IconString),",-?\d*","")
1227 | IconPath := RegExReplace(IconString,",-?\d*","")
1228 | IconIndex := RegExReplace(IconString,".*,","")
1229 | }
1230 | If Not RegExMatch(IconIndex,"^-?\d*$")
1231 | IconIndex := ""
1232 | Else
1233 | {
1234 | If IconIndex >= 0
1235 | IconIndex++
1236 | }
1237 | Return ReturnIcon(MenuName,ItemKey,IconPath,IconIndex)
1238 | }
1239 | If IconState = 2
1240 | Return
1241 | ; {icon:icons\google.ico|2|16}
1242 | If RegExMatch(ItemValue,"i)\{icon:[^\}]*\}",Icon) And ( IconState <> 1 )
1243 | {
1244 | Icon := SubStr(icon,7,strlen(icon)-7)
1245 | Loop,Parse,Icon,|
1246 | Icon%A_Index% := A_LoopField
1247 | Return ReturnIcon(MenuName,ItemKey,Icon1,Icon2,Icon3)
1248 | }
1249 | Loop,% Strlen(ItemValue)
1250 | {
1251 | Executable := SubStr(ItemValue,1,strlen(ItemValue)-A_Index+1)
1252 | If Strlen(ItemValue) = %A_Index%
1253 | Break
1254 | If FileExist(Executable)
1255 | {
1256 | Executable := Trim(Executable)
1257 | If RegExMatch(Executable,"i).*\.exe$")
1258 | {
1259 | IconPath := Executable
1260 | IconIndex := 0
1261 | }
1262 | Else
1263 | {
1264 | RegExMatch(Executable,"\.[^\.]*$",OutType)
1265 | IconValue := SetTypeIcon(MenuName,"",OutType,True)
1266 | IconPath := SubStr(IconValue,1,RegExMatch(IconValue,"\|")-1)
1267 | IconIndex := SubStr(IconValue,RegExMatch(IconValue,"\|")+1)
1268 | }
1269 | Return ReturnIcon(MenuName,ItemKey,IconPath,IconIndex)
1270 | }
1271 | }
1272 | If IniReadValue(INI,"config","DefaultIcon",1) And ( IconState <> 1 )
1273 | Return ReturnIcon(MenuName,ItemKey,"Icons\default.ico",1)
1274 | else
1275 | Return
1276 | }
1277 | ;/=======================================================================/
1278 | ReturnIcon(MenuName,ItemKey,IconPath,IconIndex,Iconsize="")
1279 | {
1280 | If ItemKey
1281 | {
1282 | ;IconPath := ReplaceVar(IconPath)
1283 | Menu,%MenuName%,Icon,%ItemKey%,%IconPath%,%IconIndex%,%Iconsize%
1284 | If ErrorLevel
1285 | {
1286 | If FileExist(IconPath)
1287 | {
1288 | IconPath := A_WinDir "\system32\shell32.dll"
1289 | IconIndex := 3
1290 | Menu,%MenuName%,Icon,%ItemKey%,%IconPath%,%IconIndex%,%Iconsize%
1291 | }
1292 | }
1293 | }
1294 | return IconPath "|" IconIndex
1295 | }
1296 | ;/=======================================================================/
1297 | ; GetOpenWithList(Type) {{{2
1298 | ; 根据注册表获取当前扩展名的对应打开列表,并保存到MenuZ.auto文件中
1299 | GetOpenWithList(Type,AutoINI)
1300 | {
1301 | IniRead,sid,%AutoINI%,%Type%,sid
1302 | If RegExMatch(sid,"\d{8}") And substr(sid,1,1)
1303 | {
1304 | sid := "1" . Substr(sid,2)
1305 | Return
1306 | }
1307 | Else
1308 | {
1309 | sid := "10000000"
1310 | IniWrite,10000000,%AutoINI%,%Type%,sid
1311 | }
1312 | RegRead,exec,HKCR,%Type%
1313 | RegRead,exec,HKCR,%exec%\Shell\Open\Command
1314 | m .= exec "`n"
1315 | Loop,HKCR,%Type%\OpenWithList,1,1
1316 | {
1317 | RegRead,exec
1318 | If RegExMatch(exec,"i).*\..*$")
1319 | {
1320 | RegRead,exec_path,HKCR,Applications\%exec%\shell\Open\Command\,
1321 | If exec_path
1322 | m .= exec_path "`n"
1323 | Else
1324 | {
1325 | RegRead,exec_path,HKCR,Applications\%exec%\shell\Edit\Command\,
1326 | If exec_path
1327 | m .= exec_path "`n"
1328 | }
1329 | }
1330 | }
1331 | Loop,HKCU,Software\Classes\%Type%\OpenWithList,1,1
1332 | {
1333 | RegRead,exec
1334 | If RegExMatch(exec,"i).*\..*$")
1335 | {
1336 | RegRead,exec_path,HKCR,Applications\%exec%\shell\Open\Command\,
1337 | If exec_path
1338 | m .= exec_path "`n"
1339 | Else
1340 | {
1341 | RegRead,exec_path,HKCR,Applications\%exec%\shell\Edit\Command\,
1342 | If exec_path
1343 | m .= exec_path "`n"
1344 | }
1345 | }
1346 | }
1347 | Loop,HKCU,Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%Type%\OpenWithList,1,1
1348 | {
1349 | RegRead,exec
1350 | If RegExMatch(exec,"i).*\..*$")
1351 | {
1352 | RegRead,exec_path,HKCR,Applications\%exec%\shell\Open\Command\,
1353 | If exec_path
1354 | m .= exec_path "`n"
1355 | Else
1356 | {
1357 | RegRead,exec_path,HKCR,Applications\%exec%\shell\Edit\Command\,
1358 | If exec_path
1359 | m .= exec_path "`n"
1360 | }
1361 | }
1362 | }
1363 | Loop,Parse,m,`n
1364 | {
1365 | If A_LoopField
1366 | {
1367 | Loop_str := RegExReplace(ReplaceVar(A_LoopField),"""")
1368 | If FileExist(Loop_Str)
1369 | Loop_exec := Loop_Str
1370 | Else
1371 | Loop,% Strlen(Loop_str)
1372 | {
1373 | Loop_exec := SubStr(Loop_str,1,strlen(Loop_str)-A_Index)
1374 | If FileExist(Loop_exec)
1375 | Break
1376 | }
1377 | If FileExist(Loop_exec)
1378 | k := FileGetVersionInfo_AW(Loop_exec,"FileDescription")
1379 | Else
1380 | Continue
1381 | If RegExMatch(Loop_Str,"%1")
1382 | s := RegExReplace(Loop_Str,"%1","""{file:path}""")
1383 | Else
1384 | s := Loop_Str . " ""{file:path}"" "
1385 | If s and k
1386 | IniWrite,%s%,%AutoINI%,%Type%,系统打开方式(&S)\%k%
1387 | }
1388 | }
1389 | Return S
1390 | }
1391 | ;/======================================================================/
1392 | ; ReplaceVar(str){{{2
1393 | ; 替换变量
1394 | ReplaceVar(str,OnlyINI=False)
1395 | {
1396 |
1397 | Pos := 1
1398 | Loop
1399 | {
1400 | ;Tooltip % DebugCount
1401 | ;DebugCount++
1402 | Pos := RegExMatch(str,"i)%[^%]*%",UserVar,Pos)
1403 | If Pos
1404 | {
1405 | var := SubStr(UserVar,2,Strlen(UserVar)-2)
1406 | If Strlen(var) = 0
1407 | Break
1408 | Env := IniReadValue(INI,"Env",Var)
1409 | IF Not ErrorLevel
1410 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1411 | Else If RegExMatch(var,"i)^apps$") ; MZ内置变量
1412 | {
1413 | Env := A_ScriptDir "\apps"
1414 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1415 | }
1416 | Else If RegExMatch(var,"i)^Script$") ; MZ内置变量
1417 | {
1418 | Env := A_ScriptDir "\Script"
1419 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1420 | }
1421 | Else If RegExMatch(var,"i)^config$")
1422 | {
1423 | Env := A_ScriptDir "\config"
1424 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1425 | }
1426 | Else If RegExMatch(var,"i)^Extensions$")
1427 | {
1428 | Env := A_ScriptDir "\Extensions"
1429 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1430 | }
1431 | Else If RegExMatch(var,"i)^icons$")
1432 | {
1433 | Env := A_ScriptDir "\icons"
1434 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1435 | }
1436 | Else If RegExMatch(var,"i)^Scriptdir$")
1437 | {
1438 | Env := A_ScriptDir
1439 | str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1440 | }
1441 | Else
1442 | {
1443 | MatchVar := "i)\t" ToMatch(Var) "\t"
1444 | If RegExMatch(AHK_BIEnv,MatchVar) ; AHK内置变量
1445 | {
1446 | Env := %Var%
1447 | Str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1448 | }
1449 | Else If RegExMatch(SystemEnv,MatchVar) ; 系统变量
1450 | {
1451 | EnvGet,Env,%var%
1452 | Str := RegExReplace(Str,ToMatch(UserVar),ToReplace(Env))
1453 | }
1454 | Else
1455 | Env := UserVar
1456 | }
1457 | }
1458 | Else
1459 | Break
1460 | Pos += Strlen(Env)
1461 | }
1462 | Return str
1463 | }
1464 | ; ReplaceSwitch(MenuString) {{{2
1465 | ; 清除预处理的开关
1466 | ClearRealSwitch(String)
1467 | {
1468 | ; 以下开关全部用于预处理
1469 | ; {run} {{{3
1470 | If RegExMatch(String,"i)\{run:[^\}\}]*\}",MatchRun)
1471 | ExecMode := SubStr(MatchRun,6,strlen(MatchRun)-6)
1472 | String := RegExReplace(String,"i)\{run:[^\}\}]*\}")
1473 | ; {hide} {{{3
1474 | String := RegExReplace(string,"i)\{hide\}")
1475 | ; {blank} {{{3
1476 | String := RegExReplace(string,"i)\{blank\}")
1477 | ; {sep} {{{3
1478 | String := RegExReplace(string,"i)\{sep\}")
1479 | ; {icon} {{{3
1480 | String := RegExReplace(String,"i)\{icon:[^\}]*\}")
1481 | ; {class} {{{3
1482 | String := RegExReplace(String,"i)\{class:[^\}]*\}")
1483 | ; {mode} {{{3
1484 | String := RegExReplace(String,"i)\{mode:[^\}]*\}")
1485 | ; {type} {{{3
1486 | String := RegExReplace(String,"i)\{type:[^\}]*\}")
1487 | ; {Default} {{{3
1488 | String := RegExReplace(String,"i)\{default\}")
1489 | ; {control} {{{3
1490 | String := RegExReplace(String,"i)\{control:[^\}]*\}")
1491 | ; {name} {{{3
1492 | String := RegExReplace(String,"i)\{name:[^\}]*\}")
1493 | Return String
1494 | }
1495 | ReplaceSwitch(MenuString)
1496 | {
1497 | ;Global SaveString
1498 | ; 如果无内容不进行多余处理
1499 | WorkingDir := A_WorkingDir
1500 | If RegExMatch(MenuString,"^[\s\t\n\r]*$")
1501 | Return
1502 | Select := Object()
1503 | Select := ReturnTypeString(SaveString)
1504 | ; 清除所有用于预处理的开关
1505 | MenuString := ClearRealSwitch(MenuString)
1506 | ; 查看设置里是否需要将Lnk文件读取成目标而不是Lnk本身
1507 | LnkToDest := IniReadValue(INI,"config","LnkToDest",0)
1508 | ; 单文件预处理
1509 | file := RegExReplace(Select.String,"[\n\r\t]*")
1510 | If FileExist(file)
1511 | {
1512 | If RegExMatch(Select.Type,"i)^\.lnk$") And LnkToDest
1513 | FileGetShortcut,%file%,file
1514 | Splitpath,file,Name,Dir,Ext,NameNoExt,Drive
1515 | Drive .= "\"
1516 | DirName := SplitpathNameOnly(Dir)
1517 | If RegExMatch(Select.Type,"i)^Folder$")
1518 | NameNoExt := Name
1519 | }
1520 | Else
1521 | File := ""
1522 | ; 多文件预处理
1523 | MfileArray := Object()
1524 | If RegExMatch(Select.Type,"i)(^Multifiles$)|(^\..*)|(^Folder$)")
1525 | {
1526 | MfileArray["All"] := ""
1527 | MfileArray["File"] := ""
1528 | MfileArray["Dir"] := ""
1529 | MfileArray["AllName"] := ""
1530 | MfileArray["FileName"] := ""
1531 | MfileArray["DirName"] := ""
1532 | ; 对多文件列表进行循环,分类出文件列表和文件夹列表以及文件(夹)名列表
1533 | AllString := Select.String
1534 | Loop,Parse,AllString,`n,`r
1535 | {
1536 | If Strlen(A_LoopField) = 0
1537 | Continue
1538 | ; 如果当前选择内容为多文件时,没有进行单文件预处理,file变量为空
1539 | ; 而菜单内容里的{file}类开关,只对当前选择的首个文件有效
1540 | If Strlen(file) = 0
1541 | {
1542 | file := Substr(A_LoopField,RegExMatch(A_LoopField,"\|")+1)
1543 | Splitpath,file,Name,Dir,Ext,NameNoExt,Drive
1544 | Drive .= "\"
1545 | DirName := SplitpathNameOnly(Dir)
1546 | }
1547 | Mfile_ThisOne := ReturnTypeString(A_LoopField)
1548 | If RegExMatch(Mfile_ThisOne.Type,"i)^Folder$")
1549 | {
1550 | MfileArray["Dir"] .= Mfile_ThisOne.String "`r`n"
1551 | MfileArray["All"] .= Mfile_ThisOne.String "`r`n"
1552 | MdirName := SplitpathNameOnly(Mfile_ThisOne.String) "`r`n"
1553 | MfileArray["DirName"] .= MdirName
1554 | MfileArray["AllName"] .= MdirName
1555 | }
1556 | Else
1557 | {
1558 | If RegExMatch(Mfile_ThisOne.Type,"i)^\.lnk") And LnkToDest
1559 | {
1560 | lnkfile := Mfile_ThisOne.String
1561 | FileGetShortcut,%lnkfile%,lnkfile
1562 | Mfile_ThisOne.String := lnkfile
1563 | }
1564 | MfileArray["File"] .= Mfile_ThisOne.String "`r`n"
1565 | MfileArray["All"] .= Mfile_ThisOne.String "`r`n"
1566 | MfileName := SplitpathNameOnly(Mfile_ThisOne.String) "`r`n"
1567 | MfileArray["FileName"] .= MfileName
1568 | MfileArray["AllName"] .= MfileName
1569 | }
1570 | }
1571 | }
1572 | Pos := 1
1573 | While Pos
1574 | {
1575 | Pos := RegExMatch(MenuString,"i)\{[^\{\}]*\}",Switch,Pos)
1576 | RString := Switch
1577 | If Not Pos
1578 | Break
1579 | ; {mfile} {{{3
1580 | Else If RegExMatch(Switch,"i)\{mfile[^\{\}]*\}",mfileSwitch)
1581 | {
1582 | ;If RegExMatch(Select.Type,"^Multifiles$")
1583 | RString := StringByMfile(mfileSwitch,MfileArray)
1584 | ;Else
1585 | ; RString := file
1586 | }
1587 | ; {file} {{{3
1588 | Else If RegExMatch(Switch,"i)\{file[^\{\}]*\}",fileSwitch)
1589 | {
1590 | Path := File
1591 | RString := SubStr(fileswitch,7,strlen(fileswitch)-7)
1592 | If RegExMatch(RString,"i)^content$")
1593 | {
1594 | Size := IniReadValue(INI,"config","MaxContentSize",1)
1595 | FileGetSize,OutSize,%file%,M
1596 | If OutSize < size
1597 | FileRead,RString,%file%
1598 | Else
1599 | RString := ""
1600 | }
1601 | Else
1602 | {
1603 | ;If RegExMatch(RString,"i)^ext$") And Not RegExMatch(Select.Type,"^\.")
1604 | ; RString := ""
1605 | If RegExMatch(RString,"i)^(path)|(name)|(dir)|(ext)|(namenoext)|(drive)|(Content)$")
1606 | RString := %RString%
1607 | }
1608 | }
1609 | ; {Select} {{{3
1610 | Else If RegExMatch(Switch,"i)\{select[^\{\}]*}",SelectSwitch)
1611 | {
1612 | If RegExMatch(SelectSwitch,"i)\{select\}")
1613 | RString := Select.String
1614 | Else
1615 | If RegExMatch(SelectSwitch,"i)\{Select\[[^\[\]]*\]\}")
1616 | {
1617 | EncodeMode := SubStr(SelectSwitch,9,strlen(SelectSwitch)-10)
1618 | RString := SksSub_UrlEncode(Select.String,EncodeMode)
1619 | }
1620 | Else
1621 | {
1622 | ; {Select:RegEx} {{{3
1623 | var := "%" SubStr(SelectSwitch,9,strlen(SelectSwitch)-9) "%"
1624 | RegExMatch(Select.String,ReplaceVar(var),RString)
1625 | }
1626 | }
1627 | ; {box} {{{3
1628 | Else If RegExMatch(Switch,"i)\{box:[^\{\}]*\}")
1629 | {
1630 | ; {box:input} {{{4
1631 | If RegExmatch(Switch,"i)\{box:input[^\{\}]*\}")
1632 | {
1633 | InputPrompt := SubStr(Switch,12,Strlen(Switch)-12)
1634 | Inputbox,RString,请输入内容,`n`n`t%InputPrompt%
1635 | If ErrorLevel
1636 | Return
1637 | }
1638 | ; {box:password} {{{4
1639 | Else If RegExmatch(Switch,"i)\{box:password[^\{\}]*\}")
1640 | {
1641 | PwdPrompt := SubStr(Switch,15,Strlen(Switch)-15)
1642 | Inputbox,RString,请输入内容,`n`n`t%PwdPrompt%,Hide
1643 | If ErrorLevel
1644 | Return
1645 | }
1646 | ; {box:file} {{{4
1647 | Else If RegExMatch(Switch,"i)\{box:file\}",bm)
1648 | {
1649 | FileSelectFile,RString,M11,,查找文件
1650 | If ErrorLevel
1651 | Return
1652 | }
1653 | Else If RegExmatch(Switch,"i)\{box:file((open)|(save))[^\{\}]*\}")
1654 | {
1655 | ; Box:fileopen:Prompt,Filter,Openfile,RootDir
1656 | Opt := SubStr(Switch,15,Strlen(Switch)-15)
1657 | Loop,Parse,Opt,`,
1658 | {
1659 | If A_Index = 1
1660 | fPrompt := A_LoopField
1661 | Else If A_Index = 2
1662 | Filter := A_LoopField
1663 | Else If A_Index = 3
1664 | Openfile := A_LoopField
1665 | Else If A_Index = 4
1666 | RootDir := A_LoopField
1667 | }
1668 | If RegExmatch(Switch,"i)\{box:fileopen")
1669 | option := "M11"
1670 | Else If RegExmatch(Switch,"i)\{box:filesave")
1671 | option := "S25"
1672 | FileSelectFile,RString,%option%,%OpenRootDir% %Openfile%,%fPrompt%,%Filter%
1673 | If ErrorLevel
1674 | Return
1675 | Else
1676 | If option = S25
1677 | FileAppend,"",%RString%
1678 | }
1679 | ; {box:dir} {{{4
1680 | Else If RegExMatch(Switch,"i)\{box:dir\}")
1681 | {
1682 | FileSelectFolder,RString,,3,查找文件夹
1683 | If ErrorLevel
1684 | Return
1685 | }
1686 | Else If RegExMatch(Switch,"i)\{box:dir:.*\}")
1687 | {
1688 | ; box:dir:Prompt,StartingFolder
1689 | Opt := SubStr(Switch,10,Strlen(Switch)-10)
1690 | Loop,Parse,Opt,`,
1691 | {
1692 | If A_Index = 1
1693 | dPrompt := A_LoopField
1694 | Else If A_Index = 2
1695 | StartingFolder := A_LoopField
1696 | }
1697 | FileSelectFolder,RString,%StartingFolder%,3,%dPrompt%
1698 | }
1699 | }
1700 | ; {date} {{{3
1701 | Else If RegExMatch(Switch,"i)\{date\:?[^\{\}]*\}")
1702 | {
1703 | TimeString := RegExReplace(Switch,"i)^(\{date\:?)|(\}$)")
1704 | Loop,Parse,TimeString,`,
1705 | Time%A_index% := A_LoopField
1706 | If Time2
1707 | FormatTime,RString,,%Time1%,%Time2%
1708 | Else
1709 | If Time1
1710 | FormatTime,RString,,%Time1%
1711 | Else
1712 | FormatTime,RString
1713 | }
1714 | ; {func} {{{3
1715 | Else If RegExMatch(Switch,"i)\{Func:[^\{\}]*\}")
1716 | {
1717 | Func := Substr(Switch,7,strlen(Switch)-7)
1718 | RString := CheckExtension(Func)
1719 | }
1720 | Else If RegExMatch(Switch,"i)\{clip\}")
1721 | RString := Clipboard
1722 | ; {save} {{{3
1723 | Else If RegExMatch(Switch,"i)\{save:[^\{\}]*\}")
1724 | {
1725 | ; {save:ClipAll} {{{4
1726 | ; 将原始的选择内容保存到剪切板中
1727 | If RegExMatch(Switch,"i)\{save:clipAll\}")
1728 | {
1729 | MatchClipAll := Switch
1730 | RString := ""
1731 | }
1732 | ; {save:clip} {{{4
1733 | ; 将替换完毕的内容保存到剪切板中
1734 | Else If RegExMatch(Switch,"i)\{save:clip\}")
1735 | {
1736 | MatchClip := Switch
1737 | RString := ""
1738 | }
1739 | ; {save:assc} {{{4
1740 | Else
1741 | If RegExMatch(Switch,"i)\{save:[^\{\}]*\}")
1742 | {
1743 | SavePath := A_Temp "\MenuZ." Substr(Switch,7,strlen(Switch)-7)
1744 | If RegExMatch(Select.Type,"^Multifiles$")
1745 | SaveString := MfileArray["ALL"]
1746 | Else
1747 | SaveString := Select.String
1748 | If FileExist(SavePath)
1749 | FileDelete,%SavePath%
1750 | FileAppend,%SaveString%,%SavePath% ;,UTF-8
1751 | RString := SavePath
1752 | }
1753 | }
1754 | ; {SendMsg} {{{3
1755 | Else If RegExMatch(Switch,"i)\{sendmsg:[^\{\}]*\}")
1756 | {
1757 | ;SendMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
1758 | MsgString := SubStr(Switch,10,Strlen(Switch)-10)
1759 | S_Msg := S_wParam := S_lParam := S_Mode := SendMsgHwnd := ""
1760 | Loop,Parse,MsgString,`,
1761 | {
1762 | If A_Index = 1
1763 | S_Msg := A_LoopField
1764 | Else If A_Index = 2
1765 | S_wParam := A_LoopField
1766 | Else If A_Index = 3
1767 | S_lParam := A_LoopField
1768 | Else If A_Index = 4
1769 | S_Mode := A_LoopField
1770 | }
1771 | If S_Mode = 1
1772 | ControlGet,SendMsgHwnd,hwnd,,%SaveCtrl%,AHK_ID %SaveID%
1773 | Else
1774 | SendMsgHwnd := SaveID
1775 | SendMessage, %S_Msg% , %S_wParam% , %S_lParam% , , AHK_ID %SendMsgHwnd%
1776 | If ErrorLevel = FAIL
1777 | {
1778 | RString := ""
1779 | Msgbox % "SendMessage出错"
1780 | }
1781 | Else
1782 | RString := ErrorLevel
1783 | }
1784 | ; {PostMsg} {{{3
1785 | Else If RegExMatch(Switch,"i)\{Postmsg:[^\{\}]*\}")
1786 | {
1787 | ;PostMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
1788 | MsgString := SubStr(Switch,10,Strlen(Switch)-10)
1789 | P_Msg := P_wParam := P_lParam := P_Mode := PostMsgHwnd := ""
1790 | Loop,Parse,MsgString,`,
1791 | {
1792 | If A_Index = 1
1793 | P_Msg := A_LoopField
1794 | Else If A_Index = 2
1795 | P_wParam := A_LoopField
1796 | Else If A_Index = 3
1797 | P_lParam := A_LoopField
1798 | ELse If A_Index = 4
1799 | P_Mode := A_LoopField
1800 | }
1801 | If S_Mode = 1
1802 | ControlGet,PostMsgHwnd,hwnd,,%SaveCtrl%,AHK_ID %SaveID%
1803 | Else
1804 | PostMsgHwnd := SaveID
1805 | PostMessage, %P_Msg% , %P_wParam% , %P_lParam% , , AHK_ID %PostMsgHwnd%
1806 | If ErrorLevel
1807 | Msgbox % "PostMessage出错"
1808 | RString := ""
1809 | }
1810 | ; {Ahk} {{{3
1811 | Else If RegExMatch(Switch,"i)\{ahk:[^\{\}]*\}")
1812 | {
1813 | If RegExMatch(Switch,"i)\{ahk:return:[^\{\}]*\}")
1814 | {
1815 | RunAHK := A_AhkPath " """ RegExReplace(Switch,"i)(^\{ahk:return:)|\}$") """"
1816 | Runwait,%RunAHK%
1817 | RString := AhkReturn
1818 | }
1819 | Else
1820 | RString := A_AhkPath " """ RegExReplace(Switch,"i)(^\{ahk:)|\}$") """"
1821 | }
1822 | Else If RegExMatch(Switch,"i)\{workdir:[^\{\}]*\}")
1823 | {
1824 | WorkingDir := SubStr(Switch,10,Strlen(Switch)-10)
1825 | RString := ""
1826 | }
1827 | MenuString := RegExReplace(MenuString,ToMatch(Switch),ToReplace(RString),"",1,Pos)
1828 | Pos += Strlen(RString)
1829 | }
1830 | If Strlen(MatchClipAll)
1831 | {
1832 | Clipboard = %SaveClip%
1833 | MatchClipAll := ""
1834 | }
1835 | If Strlen(MatchClip)
1836 | {
1837 | Clipboard := MenuString
1838 | MatchClip := ""
1839 | }
1840 | Return MenuString
1841 | }
1842 | ; StringByMfile(Switch,MfileArray) {{{2
1843 | StringByMfile(Switch,MfileArray)
1844 | {
1845 | opt := Strlen(Switch) <> 7 ? ":" SubStr(Switch,8,Strlen(Switch)-8) : ""
1846 | If Strlen(Opt) = 0
1847 | Return MfileArray["All"]
1848 | ; 如果没有加: 则{mfile:=aaa}识别的选项就是=aaa,需要加冒号,以便进行循环分析
1849 | opt := RegExReplace(opt,"mfile")
1850 | If RegExMatch(opt,"i)(:((filename)|(file)|(dirname)|(dir)|(allname)|(all))$)|(:((filename)|(file)|(dirname)|(dir)|(allname)|(all))(?=:))",List)
1851 | {
1852 | RString := MfileArray[RegExReplace(List,":")]
1853 | opt := RegExReplace(opt,ToMatch(List),"",outputvar,1)
1854 | }
1855 | Else
1856 | RString := MfileArray["ALL"]
1857 | If RegExMatch(opt,":=[^:]*",In)
1858 | {
1859 | IsInClude := True
1860 | opt := RegExReplace(opt,ToMatch(In))
1861 | In := Substr(In,3)
1862 | Loop,Parse,In,|
1863 | Include .= "(" RegExReplace(RegExReplace(A_LoopField,"\s"),"\+|\?|\.|\*|\{|\}|\(|\)|\||\[|\]|\\","\$0") ")|"
1864 | InClude := "i)" SubStr(Include,1,Strlen(Include)-1)
1865 | }
1866 | Else
1867 | IsInClude := False
1868 | If RegExMatch(opt,":![^:]*",Ex)
1869 | {
1870 | IsExClude := True
1871 | opt := RegExReplace(opt,ToMatch(Ex))
1872 | Ex := Substr(Ex,3)
1873 | Loop,Parse,Ex,|
1874 | Exclude .= "(" RegExReplace(RegExReplace(A_LoopField,"\s"),"\+|\?|\.|\*|\{|\}|\(|\)|\||\[|\]|\\","\$0") ")|"
1875 | ExClude := "i)" SubStr(Exclude,1,Strlen(Exclude)-1)
1876 | }
1877 | Else
1878 | IsExClude := False
1879 | If RegExMatch(opt,":-\d*",ChrNum)
1880 | {
1881 | Opt := RegExReplace(opt,ToMatch(ChrNum))
1882 | ChrNum := Substr(ChrNum,3)
1883 | }
1884 | Else
1885 | ChrNum := 0
1886 | If RegExMatch(opt,":%\d*",MfileIndex)
1887 | {
1888 | IsIndex := True
1889 | Opt := RegExReplace(opt,ToMatch(MfileIndex))
1890 | MfileIndex := SubStr(MfileIndex,3)
1891 | }
1892 | Else
1893 | IsIndex := False
1894 | If RegExMatch(opt,":.*")
1895 | {
1896 | IsTemplate := True
1897 | Template := Substr(opt,2)
1898 | }
1899 | Else
1900 | IsTemplate := False
1901 | idx := 0
1902 | MatchTemplate := "i)(\bindex\b)|(\bfile\b)|(\bdir\b)|(\bext\b)|(\bNameNoExt\b)|(\bName\b)|(\bdrive\b)|(
)|()"
1903 | Loop,Parse,RString,`n,`r
1904 | {
1905 | If Strlen(A_LoopField) = 0
1906 | Continue
1907 | Name := SplitpathNameOnly(A_LoopField)
1908 | IF IsInClude AND (Not RegExMatch(name,Include))
1909 | Continue
1910 | IF IsExClude AND RegExMatch(name,Exclude)
1911 | Continue
1912 | If IsTemplate
1913 | {
1914 | Splitpath,A_LoopField,Name,Dir,Ext,NameNoExt,Drive
1915 | Pos := 1
1916 | Index := A_Index
1917 | NewRString := Template
1918 | Loop
1919 | {
1920 | Pos := RegExMatch(NewRString,MatchTemplate,Switch,Pos)
1921 | If Not Pos
1922 | Break
1923 | else If RegExMatch(Switch,"i)^file$")
1924 | RString := A_LoopField
1925 | else If RegExMatch(Switch,"i)^index$")
1926 | RString := Index
1927 | else If RegExMatch(Switch,"i)^name$")
1928 | RString := Name
1929 | else If RegExMatch(Switch,"i)^dir$")
1930 | RString := Dir
1931 | else If RegExMatch(Switch,"i)^ext$")
1932 | RString := Ext
1933 | else If RegExMatch(Switch,"i)drive")
1934 | RString := Drive
1935 | else If RegExMatch(Switch,"i)
")
1936 | RString := "`r`n"
1937 | else If RegExMatch(Switch,"i)")
1938 | RString := A_Tab
1939 | NewRString := RegExReplace(NewRString,ToMatch(Switch),ToReplace(RString),"",1,Pos)
1940 | Pos += strlen(RString)
1941 | }
1942 | /*
1943 | NewRString := Template
1944 | NewRString := RegExReplace(NewRString,"i)file",A_LoopField)
1945 | NewRString := RegExReplace(NewRString,"i)Index",A_Index)
1946 | NewRString := RegExReplace(NewRString,"i)NameNoExt",NameNoExt)
1947 | NewRString := RegExReplace(NewRString,"i)name",name)
1948 | NewRString := RegExReplace(NewRString,"i)dir",dir)
1949 | NewRString := RegExReplace(NewRString,"i)ext",ext)
1950 | NewRString := RegExReplace(NewRString,"i)drive",Drive)
1951 | NewRString := RegExReplace(NewRString,"i)
","`r`n")
1952 | NewRString := RegExReplace(NewRString,"i)",A_Tab)
1953 | */
1954 | }
1955 | Else
1956 | NewRString := A_LoopField
1957 | LoopString .= NewRString
1958 | If Idx = %MfileIndex%
1959 | Return Substr(NewRString,1,Strlen(NewRString)-ChrNum)
1960 | Idx++
1961 | }
1962 | RString := Substr(LoopString,1,Strlen(LoopString)-ChrNum)
1963 | Return RString
1964 | }
1965 |
1966 | ; 格式化并返回MenuZ格式的类型和选择内容
1967 | ; 注意!返回的是对象Object
1968 | ReturnTypeString(String)
1969 | {
1970 | ReturnArray := Object()
1971 | If RegExMatch(String,"\n") And RegExMatch(String,"^(\.|(Folder))")
1972 | {
1973 | ReturnArray.Type := "Multifiles"
1974 | ReturnArray.String := String
1975 | }
1976 | Else
1977 | {
1978 | ReturnArray.Type := Substr(String,1,RegExMatch(String,"\|")-1)
1979 | Match := ToMatch(ReturnArray.Type) "\|"
1980 | ReturnArray.String := RegExReplace(String,Match,"",Out,1)
1981 | }
1982 | Return ReturnArray
1983 | }
1984 | ; SplitpathNameOnly(Path) {{{2
1985 | ; 基本上与Splitpath类似,只是只返回文件名或者目录名
1986 | SplitpathNameOnly(Path)
1987 | {
1988 | filetype := FileExist(Path)
1989 | If filetype
1990 | {
1991 | If Instr(filetype,"D")
1992 | {
1993 | Loop,Parse,Path
1994 | {
1995 | If RegExMatch(Substr(Path,1-A_Index,1),"\\")
1996 | {
1997 | name := Substr(Path,Strlen(Path)-A_index+2)
1998 | Break
1999 | }
2000 | }
2001 | }
2002 | Else
2003 | Splitpath,Path,Name
2004 | Return Name
2005 | }
2006 | Else
2007 | return
2008 | }
2009 | ; IniReadValue(INIFile,Section="",Key="",Default="") {{{2
2010 | IniReadValue(INIFile,Section="",Key="",Default="")
2011 | {
2012 | ; DebugCount++
2013 | ; Tooltip % DebugCount
2014 | ErrorLevel := False
2015 | IniRead,Value,%INIFile%,%Section%,%Key%
2016 | If Value = ERROR
2017 | {
2018 | ErrorLevel := True
2019 | If Strlen(Default)
2020 | Iniwrite,%Default%,%INIFile%,%Section%,%Key%
2021 | Return Default
2022 | }
2023 | Else
2024 | Return Value
2025 | }
2026 | ; CheckExtension(action="") {{{2
2027 | CheckExtension(func)
2028 | {
2029 | ExtensionsAHK := A_ScriptDir "\Extensions\Extensions.ahk"
2030 | ; 检查目录下有没有Func的同名文件
2031 | FuncAHK := A_ScriptDir "\Extensions\" Func ".ahk"
2032 | If FileExist(FuncAHK)
2033 | {
2034 | ; 是否Include了FuncAHK
2035 | Match := "i)^\s*#include\s*%A_ScriptDir%\\Extensions\\" ToMatch(Func) "\.ahk"
2036 | FileRead,Extensions,%ExtensionsAHK%
2037 | Loop,Parse,Extensions,`n,`r
2038 | {
2039 | If RegExMatch(A_LoopField,Match)
2040 | {
2041 | FileGetTime,CheckTime,%FuncAHK%,M
2042 | ExtensionsTime := IniReadValue(ExtensionsAHK,"ExtensionsTime",Func)
2043 | If ExtensionsTime = %CheckTime%
2044 | {
2045 | If IsFunc(Func)
2046 | Return %Func%()
2047 | Else
2048 | Msgbox % "插件: Extensions\" Func ".ahk 中没有 " Func "( ) 函数,请检查!"
2049 | Return
2050 | }
2051 | }
2052 | }
2053 | If A_IsCompiled
2054 | Return
2055 | ; Msgbox,4,,检测到 %Func% 插件修改,是否重新加载?
2056 | ; IfMsgbox Yes
2057 | ; {
2058 | MenuMode := Strlen(RunMode) ? RunMode : IniReadValue(INI,"Hotkey",A_Thishotkey,"{Mode}")
2059 | run %A_AhkPath% "%A_ScriptDir%\ActMan.ahk" /r "%MenuMode%"
2060 | ExitApp
2061 | ; }
2062 | }
2063 | Else
2064 | Msgbox % Func " 插件不存在,请检查!"
2065 | Return
2066 | }
2067 | ; ToMatch(str) {{{2
2068 | ; 正则表达式转义
2069 | ToMatch(str)
2070 | {
2071 | str := RegExReplace(str,"\+|\?|\.|\*|\{|\}|\(|\)|\||\^|\$|\[|\]|\\","\$0")
2072 | Return RegExReplace(str,"\s","\s")
2073 | }
2074 | ; ToReplace(str) {{{2
2075 | ;
2076 | ToReplace(str)
2077 | {
2078 | If RegExMatch(str,"\$")
2079 | return Regexreplace(str,"\$","$$$$")
2080 | Else
2081 | Return str
2082 | }
2083 | StringReplaceF(String,SearchText,ReplaceText="",ReplaceAll="ALL")
2084 | {
2085 | StringReplace,RString,String,SearchText,ReplaceText,ReplaceAll
2086 | Return RString
2087 | }
2088 | ;/======================================================================/
2089 | ; EmptyMem() {{{2
2090 | EmptyMem(PID="AHK Rocks")
2091 | {
2092 | pid:=(pid="AHK Rocks") ? DllCall("GetCurrentProcessId") : pid
2093 | h:=DllCall("OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", pid)
2094 | DllCall("SetProcessWorkingSetSize", "UInt", h, "Int", -1, "Int", -1)
2095 | DllCall("CloseHandle", "Int", h)
2096 | }
2097 | ;/======================================================================/
2098 | ; 以下为引用函数
2099 | ; FileGetVersionInfo_AW() {{{2
2100 | ; 获取文件名称,用于MenuZ.auto
2101 | FileGetVersionInfo_AW( peFile="", StringFileInfo="", Delimiter="|") { ; Written by SKAN
2102 | ; FileDescription | FileVersion | InternalName | LegalCopyright | OriginalFilename
2103 | ; ProductName | ProductVersion | CompanyName | PrivateBuild | SpecialBuild | LegalTrademarks
2104 | ; www.autohotkey.com/forum/viewtopic.php?t=64128 CD:24-Nov-2008 / LM:28-May-2010
2105 | Static CS, HexVal, Sps=" ", DLL="Version\"
2106 | If ( CS = "" )
2107 | CS := A_IsUnicode ? "W" : "A", HexVal := "msvcrt\s" (A_IsUnicode ? "w": "" ) "printf"
2108 | If ! FSz := DllCall( DLL "GetFileVersionInfoSize" CS , Str,peFile, UInt,0 )
2109 | Return "", DllCall( "SetLastError", UInt,1 )
2110 | VarSetCapacity( FVI, FSz, 0 ), VarSetCapacity( Trans,8 * ( A_IsUnicode ? 2 : 1 ) )
2111 | DllCall( DLL "GetFileVersionInfo" CS, Str,peFile, Int,0, UInt,FSz, UInt,&FVI )
2112 | If ! DllCall( DLL "VerQueryValue" CS
2113 | , UInt,&FVI, Str,"\VarFileInfo\Translation", UIntP,Translation, UInt,0 )
2114 | Return "", DllCall( "SetLastError", UInt,2 )
2115 | If ! DllCall( HexVal, Str,Trans, Str,"%08X", UInt,NumGet(Translation+0) )
2116 | Return "", DllCall( "SetLastError", UInt,3 )
2117 | Loop, Parse, StringFileInfo, %Delimiter%
2118 | { subBlock := "\StringFileInfo\" SubStr(Trans,-3) SubStr(Trans,1,4) "\" A_LoopField
2119 | If ! DllCall( DLL "VerQueryValue" CS, UInt,&FVI, Str,SubBlock, UIntP,InfoPtr, UInt,0 )
2120 | Continue
2121 | Value := DllCall( "MulDiv", UInt,InfoPtr, Int,1, Int,1, "Str" )
2122 | Info .= Value ? ( ( InStr( StringFileInfo,Delimiter ) ? SubStr( A_LoopField Sps,1,24 )
2123 | . A_Tab : "" ) . Value . Delimiter ) : ""
2124 | } StringTrimRight, Info, Info, 1
2125 | Return Info
2126 | }
2127 | ; SksSub_UrlEncode(string, enc="UTF-8") {{{2
2128 | ; 来自万年书妖的Candy里的函数,用于转换编码。感谢!
2129 | SksSub_UrlEncode(string, enc="UTF-8")
2130 | { ;url编码
2131 | enc:=trim(enc)
2132 | If enc=
2133 | Return string
2134 | If Strlen(String) > 200
2135 | string := Substr(string,1,200)
2136 | formatInteger := A_FormatInteger
2137 | SetFormat, IntegerFast, H
2138 | VarSetCapacity(buff, StrPut(string, enc))
2139 | Loop % StrPut(string, &buff, enc) - 1
2140 | {
2141 | byte := NumGet(buff, A_Index-1, "UChar")
2142 | encoded .= byte > 127 or byte <33 ? "%" Substr(byte, 3) : Chr(byte)
2143 | }
2144 | SetFormat, IntegerFast, %formatInteger%
2145 | return encoded
2146 | }
2147 | ; =======================================================
2148 | ; GUI {{{1
2149 | ; DebugGUI: {{{2
2150 | Debuggui:
2151 | Gui,Debug:Destroy
2152 | Gui,Debug:Font,s10
2153 | Gui,Debug:Add,Text,h12 w500,选择内容
2154 | Gui,Debug:Add,Edit,h100 w500
2155 | Gui,Debug:Add,Text,h12 w500,测试语句
2156 | Gui,Debug:Add,Edit,h80 w500 gDebugSwitch
2157 | Gui,Debug:Add,Text,h12 w500,测试结果
2158 | Gui,Debug:Add,CheckBox, x350 y240,显示测试结果并运行
2159 | Gui,Debug:Add,Edit,x12 h200 w500
2160 | Gui,Debug:show,,MenuZ Debug
2161 | return
2162 | DebugSwitch:
2163 | DebugSwitch()
2164 | Return
2165 | DebugSwitch()
2166 | {
2167 | ControlGetText,SaveString,Edit1,MenuZ Debug
2168 | ControlGetText,Switch,Edit2,MenuZ Debug
2169 | result := ReplaceSwitch(ReplaceVar(Switch))
2170 | ControlSetText,Edit3,%result%,MenuZ Debug
2171 | }
2172 | ; ConfigGUI {{{2
2173 |
2174 | tsk_openAll:
2175 | Loop, %scriptCount%
2176 | {
2177 | thisScript := MyScript%A_index%0
2178 | If MyScript%A_index%1 = 0 ;没打开
2179 | {
2180 | IfWinNotExist %thisScript% - AutoHotkey ; 没有打开
2181 | Run "%A_AhkPath%" MyScript/%thisScript%
2182 |
2183 |
2184 | MyScript%A_index%1 = 1
2185 |
2186 | StringRePlace menuName, thisScript, .ahk
2187 | Menu MyScript_unclose, add, %menuName%, tsk_close
2188 | Menu MyScript_unopen, delete, %menuName%
2189 | }
2190 | }
2191 | Return
2192 |
2193 | tsk_open:
2194 | Loop, %scriptCount%
2195 | {
2196 | thisScript := MyScript%A_index%0
2197 | If thisScript = %A_thismenuitem%.ahk ; match found.
2198 | {
2199 | IfWinNotExist %thisScript% - AutoHotkey ; 没有打开
2200 | Run "%A_AhkPath%" MyScript/%thisScript%
2201 |
2202 | MyScript%A_index%1 := 1
2203 |
2204 | Menu MyScript_unclose, add, %A_thismenuitem%, tsk_close
2205 | Menu MyScript_unopen, delete, %A_thismenuitem%
2206 |
2207 | Break
2208 | }
2209 | }
2210 | Return
2211 |
2212 | tsk_close:
2213 | Loop, %scriptCount%
2214 | {
2215 | thisScript := MyScript%A_index%0
2216 | If thisScript = %A_thismenuitem%.ahk ; match found.
2217 | {
2218 | WinClose %thisScript% - AutoHotkey
2219 | MyScript%A_index%1 := 0
2220 |
2221 | Menu MyScript_unopen, add, %A_thismenuitem%, tsk_open
2222 | Menu MyScript_unclose, delete, %A_thismenuitem%
2223 |
2224 | Break
2225 | }
2226 | }
2227 | Return
2228 |
2229 | tsk_closeAll:
2230 | Loop, %scriptCount%
2231 | {
2232 | thisScript := MyScript%A_index%0
2233 | If MyScript%A_index%1 = 1 ; 已打开
2234 | {
2235 | WinClose %thisScript% - AutoHotkey
2236 | MyScript%A_index%1 = 0
2237 |
2238 | StringRePlace menuName, thisScript, .ahk
2239 | Menu MyScript_unopen, add, %menuName%, tsk_open
2240 | Menu MyScript_unclose, delete, %menuName%
2241 | }
2242 | }
2243 | Return
2244 | #Include %A_ScriptDir%\Extensions\Extensions.ahk
2245 |
--------------------------------------------------------------------------------