├── 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 | --------------------------------------------------------------------------------