HTA程序:VBS/JS脚本GUI
1.概述
HTA全称Html Application,在Windows中由mshta.exe加载执行,是一种本地程序。可使用html元素来构建界面,用JS或VBS来构建执行逻辑,从而强化Windows脚本的交互能力与友好性。只要将Html文件扩展名改为.hta即可将html当做一个hta程序来运行。
2.<HTA:APPLICATION>元素
<HTA:APPLICATION>元素必须全大写,其中的APPLICATION不可少;它拥有一些属性【它们是只读的】,用以来控制HTA进程和窗口的一些特性,具体如下:
【1】applicationName:string=>设置HTA程序的名称,在singleInstance属性设置为"Yes"时有用
【2】border:enum=>设置HTA窗口的边框类型,默认值Thick
所有允许的值: Thick 粗边框
Dialog 对话框【大小不可调整】
None 无边框【无标题栏】
Thin 窄边框
【3】borderSytle:enum=>设置HTA窗口的边框风格,默认值是Normal
所有允许的值: Normal 普通
Complex 凹凸格式组合边框
Raised 凸出的3D边框
Static 3D边框格式
Sunken 凹进的3D边框
【4】caption:Yes/No=>设置HTA窗口是否显示标题,默认值为Yes
【5】commandLine:string=>此属性保存了HTA程序的启动参数【无法通过在<HTA:APPLICATION>元素中设置来定义,是受调用传递的参数控制的】,参数可以在Script块中通过<Id>.commandLine来引用,如本程序则是Test.commandLine。它的各个参数之间以空格分隔;包含空格的参数请在调用时,用引号引起来,否则会被当成多个参数;第一个参数总是HTA程序的文件路径;其参数需要自己手动解析;因为这个属性的存在,你可以方便地使用JS/VBS总调用各种HTA界面,而后通过window.onunload来记录下结果,以方便总调程序获取HTA交互结果
【6】contextMenu:Yes/No=>是否显示右键上下文菜单
【7】icon:stirng=>设置应用程序的图标文件路径,须是有效的ico图标文件,如icon="c:\\a.ico"
【8】innerBorder:Yes/No=>是否显示内部边框的3D边界
【9】navigable:Yes/No=>是否在本窗口加载新navigate(url)的链接,当navigable=Yes时,window.navigate(url)方法加载的页面将在本HTA窗口中加载,而不是新的浏览器页面
【10】maximizeButton:Yes/No=>是否显示最大化按钮,默认值Yes
【11】minimizeButton:Yes/No=>是否显示最小化按钮,默认值Yes
【12】scroll:Yes/No=>是否在页面右侧显示垂直滚动条,默认值是Yes
【13】scrollFlat:Yes/No=>设置滚动条是3D(No)或者平面的(Yes)
【14】selection:Yes/No=>设置内容是否可以被鼠标或键盘选中
【15】showInTaskbar:Yes/No=>是否在任务栏显示任务图标,默认值Yes
【16】singleInstance:Yes/No=>是否同时只允许有一个运行实例【进程】,默认值No。当第二次启动同一个HTA程序时, mshta.exe通过上面applicaitonName来区分是否名称已占用
【17】sysMenu:Yes/No=>是否允许显示标题栏右键菜单,默认值是Yes
【18】version:string=>设置应用程序的版本,如"1.0",默认值为""
【19】windowState:enum=>设置HTA窗口的显示类型,默认值为Normal
所有允许的值: Normal 常规
Minimize 最小化
Maximize 最大化
3.HTA窗口事件
窗口级事件如下:
window.onafterprint 此事件在HTA窗口的打印工作完成之后发生
window.onbeforeprint 此事件在HTA窗口的打印工作开始之前发生
window.onbeforeunload 此事件在HTA窗口被销毁前发生
window.onblur 此事件在将键盘焦点从HTA窗口移开时发生
window.onerror 此事件在HTA程序出现错误时发生
window.onfocus 此事件在HTA窗口获得焦点时发生
window.onhelp 此事件在HTA窗口有焦点时按下F1帮助键时发生
window.onload 此事件在HTA窗口被成功加载后发生
window.onresize 此事件在HTA窗口的大小改变时发生
window.onscroll 此事件在对HTA窗口执行滚动操作时发生
window.onunload 此事件在HTA窗口被销毁时发生,切记此时alert不再可用
4.可用与不可用对象
HTA中脚本宿主对象WScript/WshArguments/WshNamed/WshUnnamed对象是无法使用的,其它的如WshShell/WshEnvironment/WshShortcut/WshSpecialFolders/WshUrlShortcut/WshNetwork对象等依然可用。
脚本运行时对象,即Dictionary和Scripting.FileSystemObject对象仍然可用,可以通过window.unload事件来将界面交互表单用文件记录下来,以方便多脚本协作。
HTA程序的顶层对象是HtmlWindow2对象,参见Microsoft HTML Object Library库。
可通过<id>.<AttributeName>访问本HTA程序的各个<HTA:APPLICATION>属性项。
5.几个用得着的自编功能补充函数
【1】GetCmdArgs从命令行参数中解析出参数
[1]JS版本
1 function GetCmdArgs(cmdArgs) 2 { 3 //本函数解析命令行参数 4 //1.左引号前面必须是空格,否则引号应视作参数内容,而非边界 5 //2.右引号后面必须是空格,否则引号应视作参数内容,而非边界 6 //3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么 7 // 最后的那个参数的左引号当重新认定为内容,而非边界 8 //4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中 9 //5.防止命令行参数最后有多个无意义空格的情况 10 var args=new Array(''),isComplete=true 11 for(var i=0;i<cmdArgs.length;i++) 12 { 13 var c=cmdArgs.charAt(i); 14 if(c=='"') 15 if(isComplete) 16 if(i==0) 17 isComplete=!isComplete; 18 else 19 if(cmdArgs.charAt(i-1)==" ") 20 isComplete=!isComplete; 21 else 22 args[args.length-1]+=c; 23 else 24 if(i==cmdArgs.length-1) 25 isComplete=!isComplete; 26 else 27 if(cmdArgs.charAt(i+1)==" ") 28 isComplete=!isComplete; 29 else 30 args[args.length-1]+=c; 31 32 else 33 if(c==" "&&isComplete&&args[args.length-1]!="") 34 args.push('') 35 else 36 args[args.length-1]+=c; 37 } 38 if(!isComplete) 39 { 40 var arg='"'+args.pop(); 41 if(arg.indexOf(" ")!=-1) 42 args=args.concat(arg.split(" ")); 43 } 44 if(args[args.length-1]=="") 45 args.pop(); 46 return args 47 }
[2]VBS版本
1 Function GetCmdArgs(cmdArgs) 2 '本函数解析命令行参数 3 '1.左引号前面必须是空格,否则引号应视作参数内容,而非边界 4 '2.右引号后面必须是空格,否则引号应视作参数内容,而非边界 5 '3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么 6 ' 最后的那个参数的左引号当重新认定为内容,而非边界 7 '4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中 8 '5.防止命令行参数最后有多个无意义空格的情况 9 Dim args(),isComplete,c,args2,i,index 10 isComplete=True 11 ReDim args(0) 12 For i=1 To Len(cmdArgs) 13 c=Mid(cmdargs,i,1) 14 If c=Chr(34) Then 15 If isComplete Then 16 If i=1 Then 17 isComplete=Not isComplete 18 Else 19 If Mid(cmdArgs,i-1,1)=" " Then 20 isComplete=Not isComplete 21 Else 22 args(UBound(args))=args(UBound(args))+c 23 End If 24 End If 25 Else 26 If i=Len(cmdArgs) Then 27 isComplete=Not isComplete 28 Else 29 If Mid(cmdArgs,i+1,1)=" " Then 30 isComplete=Not isComplete 31 Else 32 args(UBound(args))=args(UBound(args))+c 33 End If 34 End If 35 End If 36 Else 37 If c=" " And isComplete=True Then 38 If args(UBound(args))<>"" Then 39 ReDim Preserve args(UBound(args)+1) 40 End If 41 Else 42 args(UBound(args))=args(UBound(args))+c 43 End if 44 End If 45 Next 46 If isComplete=False Then 47 args(UBound(args))=Chr(34)+args(UBound(args)) 48 If InStr(args(UBound(args))," ")<>0 Then 49 args2=Split(args(UBound(args))) 50 index=UBound(args) 51 ReDim Preserve args(UBound(args2)+index) 52 For i=index To UBound(args2)+index 53 args(i)=args2(i-index) 54 Next 55 End If 56 End If 57 If args(UBound(args))="" Then 58 ReDim Preserve args(UBound(args)-1) 59 End If 60 GetCmdArgs=args 61 End Function
6.示例
[1]JS版本
1 <Html> 2 <Head> 3 <Title>HTA Test</Title> 4 <HTA:APPLICATION 5 applicationName="HTA_Test" 6 border="Dialog" 7 borderStyle="Raized" 8 caption="Yes" 9 contextMenu="No" 10 icon="E:\文档\图标\Ico图标大全\Icon资源大全\chemical.ico" 11 id="Test" 12 innerBoder="Yes" 13 navigable="Yes" 14 maximizeButton="No" 15 minimizeButton="No" 16 scroll="No" 17 scrollFlat="Yes" 18 selection="Yes" 19 showInTaskbar="Yes" 20 singleInstance="No" 21 sysMenu="Yes" 22 version="1.0" 23 windowState="Normal" /> 24 </Head> 25 <script language="VBScript"> 26 Function GetCmdArgs(cmdArgs) 27 '本函数解析命令行参数 28 '1.左引号前面必须是空格,否则引号应视作参数内容,而非边界 29 '2.右引号后面必须是空格,否则引号应视作参数内容,而非边界 30 '3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么 31 ' 最后的那个参数的左引号当重新认定为内容,而非边界 32 '4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中 33 '5.防止命令行参数最后有多个无意义空格的情况 34 Dim args(),isComplete,c,args2,i,index 35 isComplete=True 36 ReDim args(0) 37 For i=1 To Len(cmdArgs) 38 c=Mid(cmdargs,i,1) 39 If c=Chr(34) Then 40 If isComplete Then 41 If i=1 Then 42 isComplete=Not isComplete 43 Else 44 If Mid(cmdArgs,i-1,1)=" " Then 45 isComplete=Not isComplete 46 Else 47 args(UBound(args))=args(UBound(args))+c 48 End If 49 End If 50 Else 51 If i=Len(cmdArgs) Then 52 isComplete=Not isComplete 53 Else 54 If Mid(cmdArgs,i+1,1)=" " Then 55 isComplete=Not isComplete 56 Else 57 args(UBound(args))=args(UBound(args))+c 58 End If 59 End If 60 End If 61 Else 62 If c=" " And isComplete=True Then 63 If args(UBound(args))<>"" Then 64 ReDim Preserve args(UBound(args)+1) 65 End If 66 Else 67 args(UBound(args))=args(UBound(args))+c 68 End if 69 End If 70 Next 71 If isComplete=False Then 72 args(UBound(args))=Chr(34)+args(UBound(args)) 73 If InStr(args(UBound(args))," ")<>0 Then 74 args2=Split(args(UBound(args))) 75 index=UBound(args) 76 ReDim Preserve args(UBound(args2)+index) 77 For i=index To UBound(args2)+index 78 args(i)=args2(i-index) 79 Next 80 End If 81 End If 82 If args(UBound(args))="" Then 83 ReDim Preserve args(UBound(args)-1) 84 End If 85 GetCmdArgs=args 86 End Function 87 </script> 88 <Script language="JavaScript"> 89 //===================================================== 90 //HTA是HTML Application的缩写(HTML应用程序),直接将HTML 91 //保存成HTA的格式,就成了一个独立的应用软件,也可以嵌入 92 //<HTA:APPLICATION>元素来增强对该应用程序的控制 93 //===================================================== 94 //以下是<HTA:APPLICATION>元素可用属性,可用来设置HTA窗口 95 //的各种细节【记住HTA:APPLICATION这个APPLICATION不可少, 96 //且这里必须全大写,否则以下属性无效】 97 //【1】applicationName:string=>设置HTA程序的名称,在singleInstance 98 // 属性设置为"Yes"时有用 99 //【2】border:enum=>设置HTA窗口的边框类型,默认值Thick 100 // 所有允许的值: Thick 粗边框 101 // Dialog 对话框【大小不可调整】 102 // None 无边框【无标题栏】 103 // Thin 窄边框 104 //【3】borderSytle:enum=>设置HTA窗口的边框风格,默认值是Normal 105 // 所有允许的值: Normal 普通 106 // Complex 凹凸格式组合边框 107 // Raised 凸出的3D边框 108 // Static 3D边框格式 109 // Sunken 凹进的3D边框 110 //【4】caption:Yes/No=>设置HTA窗口是否显示标题栏,默认值为Yes 111 //【5】commandLine:string=>此属性保存了HTA程序的启动参数【无法通过 112 // 在<HTA:APPLICATION>元素中设置来定义,是受调用传递的参数控制的】, 113 // 参数可以在Script块中通过<Id>.commandLine来引用,如本程序则是 114 // Test.commandLine。它的各个参数之间以空格分隔;包含空格的参数请 115 // 在调用时,用引号引起来,否则会被当成多个参数;第一个参数总是HTA 116 // 程序的文件路径;其参数需要自己手动解析;因为这个属性的存在,你可 117 // 以方便地使用js/vbs总调用各种HTA界面,而后通过window.onunload来记录 118 // 下结果,以方便总调程序获取HTA交互结果 119 //【6】contextMenu:Yes/No=>是否显示右键上下文菜单,默认值Yes 120 //【7】icon:stirng=>设置应用程序的图标文件路径,须是有效的ico图标文 121 // 件,如icon="c:\\a.ico" 122 //【8】innerBorder:Yes/No=>是否显示内部边框的3D边界,默认值Yes 123 //【9】navigable:Yes/No=>是否在本窗口加载新navigate(url)的链接,当 124 // navigable=Yes时,window.navigate(url)方法加载的页面将在本HTA窗口 125 // 中加载,而不是新的浏览器页面 126 //【10】maximizeButton:Yes/No=>是否显示最大化按钮,默认值Yes 127 //【11】minimizeButton:Yes/No=>是否显示最小化按钮,默认值Yes 128 //【12】scroll:Yes/No=>是否在页面右侧显示垂直滚动条,默认值是Yes 129 //【13】scrollFlat:Yes/No=>设置滚动条是3D(No)或者平面的(Yes) 130 //【14】selection:Yes/No=>设置内容是否可以被鼠标或键盘选中 131 //【15】showInTaskbar:Yes/No=>是否在任务栏显示任务图标,默认值Yes 132 //【16】singleInstance:Yes/No=>是否同时只允许有一个运行实例【进程】, 133 // 默认值No。当第二次启动同一个HTA程序时, mshta.exe通过上面 134 // applicaitonName来区分是否名称已占用 135 //【17】sysMenu:Yes/No=>是否允许显示标题栏右键菜单,默认值是Yes 136 //【18】version:string=>设置应用程序的版本,如"1.0",默认值为"" 137 //【19】windowState:enum=>设置HTA窗口的显示类型,默认值为Normal 138 // 所有允许的值: Normal 常规 139 // Minimize 最小化 140 // Maximize 最大化 141 //===================================================== 142 //参见Microsoft HTML Object Library库 143 //1.以下事件是可以正常发生的: 144 //window.onafterprint 此事件在HTA窗口的打印工作完成之后发生 145 //window.onbeforeprint 此事件在HTA窗口的打印工作开始之前发生 146 //window.onbeforeunload 此事件在HTA窗口被销毁前发生 147 //window.onblur 此事件在将键盘焦点从HTA窗口移开时发生 148 //window.onerror 此事件在HTA程序出现错误时发生 149 //window.onfocus 此事件在HTA窗口获得焦点时发生 150 //window.onhelp 此事件在HTA窗口有焦点时按下F1帮助键时发生 151 //window.onload 此事件在HTA窗口被成功加载后发生 152 //window.onresize 此事件在HTA窗口的大小改变时发生 153 //window.onscroll 此事件在对HTA窗口执行滚动操作时发生 154 //window.onunload 此事件在HTA窗口被销毁时发生,切记此时alert不再可用 155 //2.可以通过IHTMLWindow2接口定义的其它方法属性来操纵HTA程序 156 // 的窗口。 157 //3.HTA中仍然可以使用Scripting.FileSystemObject对象来对文件 158 // 系统进行读写操作,可利用Window_OnUnload事件来收集HTA表单 159 // 的数据,记录为文本,方便常规的VBS脚本程序通过GUI界面来进 160 // 行交互,提升交互体验与使用的方便性。 161 //4.HTA中脚本宿主对象WScript/WshArguments/WshNamed/WshUnnamed 162 // 对象是无法使用的,其它的如WshShell/WshEnvironment/ 163 // WshShortcut/WshSpecialFolders/WshUrlShortcut/WshNetwork 164 // 对象等依然可用 165 //----------------------------------------------------- 166 //HTA窗口的打印控制事件 167 // window.onafterprint=function() 168 // { 169 // 此事件在HTA窗口的打印工作完成之后发生 170 // alert("OnAfterPrint"); 171 // } 172 // window.onbeforeprint=function() 173 // { 174 // 此事件在HTA窗口的打印工作开始之前发生 175 // alert("OnBeforePrint"); 176 // } 177 //----------------------------------------------------- 178 // window.onblur=function() 179 // { 180 // 此事件在将键盘焦点从HTA窗口移开时发生 181 // alert("OnBlur"); 182 // } 183 // window.onerror=function() 184 // { 185 // 此事件在HTA程序出现错误时发生 186 // alert("OnError"); 187 // } 188 // window.onfocus=function() 189 // { 190 // 此事件在HTA窗口获得焦点时发生 191 // alert("OnFocus"); 192 // } 193 // window.onhelp=function() 194 // { 195 // 此事件在HTA窗口有焦点时按下F1帮助键时发生 196 // alert("OnHelp"); 197 // } 198 //----------------------------------------------------- 199 //HTA窗口的加载与销毁事件 200 var es,values; 201 var ws=new ActiveXObject("WScript.Shell"); 202 var fso=new ActiveXObject("Scripting.FileSystemObject"); 203 204 function GetCmdArgs(cmdArgs) 205 { 206 //本函数解析命令行参数 207 //1.左引号前面必须是空格,否则引号应视作参数内容,而非边界 208 //2.右引号后面必须是空格,否则引号应视作参数内容,而非边界 209 //3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么 210 // 最后的那个参数的左引号当重新认定为内容,而非边界 211 //4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中 212 //5.防止命令行参数最后有多个无意义空格的情况 213 var args=new Array(''),isComplete=true; 214 for(var i=0;i<cmdArgs.length;i++) 215 { 216 var c=cmdArgs.charAt(i); 217 if(c=='"') 218 if(isComplete) 219 if(i==0) 220 isComplete=!isComplete; 221 else 222 if(cmdArgs.charAt(i-1)==" ") 223 isComplete=!isComplete; 224 else 225 args[args.length-1]+=c; 226 else 227 if(i==cmdArgs.length-1) 228 isComplete=!isComplete; 229 else 230 if(cmdArgs.charAt(i+1)==" ") 231 isComplete=!isComplete; 232 else 233 args[args.length-1]+=c; 234 235 else 236 if(c==" "&&isComplete&&args[args.length-1]!="") 237 args.push(''); 238 else 239 args[args.length-1]+=c; 240 } 241 if(!isComplete) 242 { 243 var arg='"'+args.pop(); 244 if(arg.indexOf(" ")!=-1) 245 args=args.concat(arg.split(" ")); 246 } 247 if(args[args.length-1]=="") 248 args.pop(); 249 return args 250 } 251 252 function isGoodVarName(name){ 253 var arr=name.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/g); 254 if(arr!=null&&arr.length==1) 255 return true; 256 else 257 return false; 258 } 259 260 function isNumberStr(numStr){ 261 try{num=eval('new Number('+numStr+')');} 262 catch(e){return false;} 263 return true; 264 } 265 266 function center_clicked(){ 267 var e=self.document.getElementById('left'); 268 e.disabled=!e.disabled; 269 var e=self.document.getElementById('top'); 270 e.disabled=!e.disabled; 271 } 272 273 function getHta(){ 274 var xml=new ActiveXObject("MSXML2.DOMDocument"); 275 var eHta=xml.createElement('HTA:APPLICATION'); 276 var names=('applicationName;border;borderStyle;caption;contextMenu;'+ 277 'icon;id;innerBorder;navigable;maximizeButton;minimizeButton;'+ 278 'scroll;scrollFlat;selection;showInTaskbar;singleInstance;'+ 279 'sysMenu;version;windowState').split(";"); 280 for(var i=0;i<names.length;i++) 281 eHta.setAttribute(names[i],values.Item(names[i])); 282 var htaSettingsStr=eHta.xml; 283 htaSettingsStr=htaSettingsStr.replace(/(\") (\w)/ig,'$1\r\n $2'); 284 htaSettingsStr=htaSettingsStr.replace(/(\w) (\w+=\")/ig,'$1\r\n $2'); 285 return htaSettingsStr; 286 } 287 288 function btnOk_clicked(){ 289 es=new Elements(); 290 values=new ActiveXObject("Scripting.Dictionary"); 291 //get all values 292 for(var i in es) 293 if(i!='getValue') 294 values.Add(i,es.getValue(es[i])); 295 //check values 296 //check 'id' 297 var value=values.Item('id'); 298 if(values.Item('commandLine')=='Yes'&&value==''&&!isGoodVarName(value)){ 299 alert('The value of "id" must be a good varname when the commandLine is required!!!'); 300 return; 301 } 302 //check 'left','top','width','height' 303 var names=new Array('left','top','width','height'); 304 for(var i=0;i<names.length;i++){ 305 var name=names[i]; 306 if(values.Item('center')=='Yes') 307 if(name=='left'||name=='top') 308 continue; 309 value=values.Item(name); 310 if(isNumberStr(value)){ 311 values.Item(name)=eval('new Number('+value+')'); 312 value=values.Item(name); 313 var maxValue=eval('self.window.screen.'+name); 314 if(value>maxValue||value<0){ 315 alert("The value of '"+name+"' must be 0-"+maxValue); 316 return; 317 } 318 } 319 else{ 320 alert("The value of '"+name+"' is not a number string."); 321 return; 322 } 323 } 324 //htaPath 325 var htaPath; 326 do{ 327 htaPath=fso.GetAbsolutePathName(fso.GetBaseName(fso.GetTempName())+'.hta'); 328 }while(fso.FileExists(htaPath)); 329 //start to write the hta file 330 var txt=fso.CreateTextFile(htaPath); 331 txt.WriteLine('<html>\r\n<head>\r\n<title>'+values.Item('title')+'</title>'); 332 txt.WriteLine(getHta()); 333 txt.WriteLine('<script language="'+values.Item('language')+'">'); 334 if(values.Item('language')=='JavaScript'){ 335 if(values.Item('commandLine')=='Yes'){ 336 txt.WriteLine(GetCmdArgs); 337 txt.WriteLine(''); 338 } 339 340 if(values.Item('center')=='Yes'){ 341 var width=values.Item('width'),height=values.Item('height'); 342 if(width!=0&&height!=0){ 343 txt.WriteLine('\r\nself.resizeTo('+width+','+height+');'); 344 txt.WriteLine('self.moveTo((self.screen.width-'+width+ 345 ')/2,(self.screen.height-'+height+')/2);\r\n'); 346 } 347 } 348 else{ 349 var left=values.Item('left'),top=values.Item('top'); 350 var width=values.Item('width'),height=values.Item('height'); 351 if(left!=0&&top!=0&&width!=0&&height!=0){ 352 txt.WriteLine('\r\nself.resizeTo('+width+','+height+');'); 353 txt.WriteLine('self.moveTo('+left+','+top+');\r\n'); 354 } 355 } 356 for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){ 357 name=e.item(); 358 if(name.indexOf('window')==0&&values.Item(name)=='Yes'){ 359 name=name.replace('_','.'); 360 txt.WriteLine(name+'=function(){\r\n \r\n}\r\n'); 361 } 362 } 363 } 364 else{ 365 if(values.Item('commandLine')=='Yes'){ 366 var stream=fso.OpenTextFile(GetCmdArgs(Test.commandLine)[0]); 367 for(var i=1;i<=86;i++) 368 if(i<=25) 369 stream.SkipLine(); 370 else 371 txt.WriteLine(stream.ReadLine()); 372 stream.Close(); 373 txt.WriteLine(''); 374 } 375 if(values.Item('center')=='Yes'){ 376 var width=values.Item('width'),height=values.Item('height'); 377 if(width!=0&&height!=0){ 378 txt.WriteLine('\r\nself.resizeTo '+width+','+height); 379 txt.WriteLine('self.moveTo (self.screen.width-'+width+ 380 ')/2,(self.screen.height-'+height+')/2\r\n'); 381 } 382 } 383 else{ 384 var left=values.Item('left'),top=values.Item('top'); 385 var width=values.Item('width'),height=values.Item('height'); 386 if(left!=0&&top!=0&&width!=0&&height!=0){ 387 txt.WriteLine('\r\nself.resizeTo '+width+','+height); 388 txt.WriteLine('self.moveTo '+left+','+top); 389 txt.WriteLine(''); 390 } 391 } 392 for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){ 393 name=e.item(); 394 if(name.indexOf('window')==0&&values.Item(name)=='Yes'){ 395 txt.WriteLine('Sub '+name+'\r\n \r\nEnd Sub\r\n'); 396 } 397 } 398 } 399 txt.WriteLine('<\/script>'); 400 txt.WriteLine('</head>\r\n<body>\r\n</body>\r\n</html>'); 401 txt.Close(); 402 self.close(); 403 } 404 405 function btnCancel_clicked(){ 406 var btn=ws.Popup("The settings will be gave up, a"+ 407 "re you sure?",0,"Warnning",4+32); 408 if(btn==6) 409 self.close(); 410 } 411 412 function Elements(){ 413 this.getValue=function(e){ 414 switch(e.type){ 415 case "checkbox": 416 return e.checked?'Yes':'No'; 417 case "text": 418 case "file": 419 return e.value; 420 case "select-one": 421 case "select-multiple": 422 index=e.selectedIndex 423 return e.options[index].text; 424 default: 425 throw new Error(5001,"The element '"+e.id+"' is not the right type."); 426 } 427 } 428 for(var i=0;i<self.document.all.length;i++){ 429 var el=self.document.all[i]; 430 if(el.id!=''&&typeof el.type!='undefined'&&el.type!='button') 431 eval('this.'+el.id+'=el'); 432 } 433 } 434 window.onload=function() 435 { 436 //此事件在HTA窗口被成功加载后发生 437 var width=800,height=685; 438 self.resizeTo(width,height); 439 self.moveTo((self.screen.availWidth-width)/2, 440 (self.screen.availHeight-height)/2); 441 alert("OnLoad"); 442 //让我们来看看本程序接收到哪些命令行参数 443 //你可以命令行执行HTATest.hta "hello world" 32 444 alert("Test.CommandLine: "+Test.commandLine); 445 alert("ApplicationName = "+Test.applicationName); 446 //其它属性也可只读访问,切记使用Id名来引用各个属性 447 var args=GetCmdArgs(Test.commandLine); 448 for(var i=0;i<args.length;i++) 449 alert(args[i]); 450 } 451 // window.onbeforeunload=function() 452 // { 453 // 此事件在HTA窗口被销毁前发生 454 // alert("OnBeforeUnload" ); 455 // } 456 window.onunload=function() 457 { 458 //此事件在HTA窗口被销毁时发生,切记alert不再可用 459 var ws=new ActiveXObject("WScript.Shell") 460 ws.Popup("OnUnload"); 461 //------------------------------------- 462 dPath=ws.SpecialFolders("Desktop") 463 pPath=ws.SpecialFolders("Programs") 464 //------------------------------------- 465 var sc=ws.CreateShortcut(dPath+"\\Programs.lnk") 466 sc.TargetPath=pPath 467 sc.WindowStyle=3 468 sc.Hotkey="Ctrl+Alt+j" 469 sc.Save(); 470 //------------------------------------- 471 var sc=ws.CreateShortcut(dPath+"\\baidu.url") 472 sc.TargetPath="http://www.baidu.com" 473 sc.Save(); 474 //------------------------------------- 475 var fso=new ActiveXObject("Scripting.FileSystemObject") 476 var txt=fso.CreateTextFile("Output.txt") 477 var nt=new ActiveXObject("WScript.Network") 478 txt.WriteLine("Domain = "+nt.UserDomain); 479 txt.WriteLine("Computer Name = "+nt.ComputerName); 480 txt.WriteLine("User Name = " + nt.UserName ); 481 txt.WriteLine("====================================="); 482 var oDrives=nt.EnumNetworkDrives(); 483 var oPrinters=nt.EnumPrinterConnections(); 484 txt.WriteLine("Network drive mappings:"); 485 for(var i=0;i<oDrives.length;i+=2) 486 txt.WriteLine("Drive【"+oDrives.item(i)+"】="+ 487 oDrives.item(i+1)); 488 txt.WriteLine("====================================="); 489 txt.WriteLine("Network printer mappings:"); 490 for(var i=0;i<oPrinters.length;i+=2) 491 txt.WriteLine("Port【"+oPrinters.item(i)+"】="+ 492 oPrinters.item(i+1)); 493 txt.WriteLine("====================================="); 494 txt.Close(); 495 ws.Run("Notepad.exe Output.txt") 496 } 497 //----------------------------------------------------- 498 // window.onresize=function() 499 // { 500 // 此事件在HTA窗口的大小改变时发生 501 // alert("OnResize"); 502 // } 503 // window.onscroll=function() 504 // { 505 // 此事件在对HTA窗口执行滚动操作时发生 506 // alert("OnScroll"); 507 // } 508 //===================================================== 509 </Script> 510 <Body> 511 <table width="100%" border="1"> 512 <col /> 513 <col width="16%" /> 514 <col width="46%" /> 515 <tr> 516 <th>选择事件</th> 517 <th>属性</th> 518 <th>设置值</th> 519 </tr> 520 <tr> 521 <td><input type="checkbox" id="window_onafterprint">window.onafterprint</td> 522 <td align="right">applicationName: </td> 523 <td><input type="text" id="applicationName"></td> 524 </tr> 525 <tr> 526 <td><input type="checkbox" id="window_onbeforeprint">window.onbeforeprint</td> 527 <td align="right">border: </td> 528 <td><select id="border"> 529 <option value="Dialog">Dialog</option> 530 <option value="None">None</option> 531 <option value="Thick">Thick</option> 532 <option value="Thin">Thin</option> 533 </select></td> 534 </tr> 535 <tr> 536 <td><input type="checkbox" id="window_onbeforeunload">window.onbeforeunload</td> 537 <td align="right">borderStyle: </td> 538 <td><select id="borderStyle"> 539 <option value="Normal">Normal</option> 540 <option value="Complex">Complex</option> 541 <option value="Raised">Raised</option> 542 <option value="Static">Static</option> 543 <option value="Sunken">Sunken</option> 544 </select></td> 545 </tr> 546 <tr> 547 <td><input type="checkbox" id="window_onblur">window.onblur</td> 548 <td align="right">caption: </td> 549 <td><input type="checkbox" id="caption" checked="true">show title bar?</td> 550 </tr> 551 <tr> 552 <td><input type="checkbox" id="window_onerror">window.onerror</td> 553 <td align="right">contextMenu: </td> 554 <td><input type="checkbox" id="contextMenu" checked="true">show contextMenu?</td> 555 </tr> 556 <tr> 557 <td><input type="checkbox" id="window_onfocus">window.onfocus</td> 558 <td align="right">icon: </td> 559 <td><input type="file" id="icon"></td> 560 </tr> 561 <tr> 562 <td><input type="checkbox" id="window_onhelp">window.onhelp</td> 563 <td align="right">id: </td> 564 <td><input type="text" id="id"></td> 565 </tr> 566 <tr> 567 <td><input type="checkbox" id="window_onload" checked="true">window.onload</td> 568 <td align="right">innerBorder: </td> 569 <td><input type="checkbox" id="innerBorder" checked="true">show inner border?</td> 570 </tr> 571 <tr> 572 <td><input type="checkbox" id="window_onresize">window.onresize</td> 573 <td align="right">navigable: </td> 574 <td><input type="checkbox" id="navigable" checked="true">navigate pages in current page?</td> 575 </tr> 576 <tr> 577 <td><input type="checkbox" id="window_onscroll">window.onscroll</td> 578 <td align="right">maximizeButton: </td> 579 <td><input type="checkbox" id="maximizeButton" checked="true">show maximize button?</td> 580 </tr> 581 <tr> 582 <td><input type="checkbox" id="window_onunload">window.onunload</td> 583 <td align="right">minimizeButton: </td> 584 <td><input type="checkbox" id="minimizeButton" checked="true">show minimize button?</td> 585 </tr> 586 <tr> 587 <td> 588 <table width="100%"> 589 <col width="38%" /> 590 <col /> 591 <tr> 592 <td align="right">left: </td> 593 <td><input type="text" id="left" disabled="true" value="0"></td> 594 </tr> 595 </table> 596 </td> 597 <td align="right">scroll: </td> 598 <td><input type="checkbox" id="scroll" checked="true">show scroll?</td> 599 </tr> 600 <tr> 601 <td> 602 <table width="100%"> 603 <col width="38%" /> 604 <col /> 605 <tr> 606 <td align="right">top: </td> 607 <td><input type="text" id="top" disabled="true" value="0"></td> 608 </tr> 609 </table> 610 </td> 611 <td align="right">scrollFlat: </td> 612 <td><input type="checkbox" id="scrollFlat" checked="true">show scroll in flat?</td> 613 </tr> 614 <tr> 615 <td> 616 <table width="100%"> 617 <col width="38%" /> 618 <col /> 619 <tr> 620 <td align="right">width: </td> 621 <td><input type="text" id="width" value="0"></td> 622 </tr> 623 </table> 624 </td> 625 <td align="right">selection: </td> 626 <td><input type="checkbox" id="selection" checked="true">allow user to select the page elements?</td> 627 </tr> 628 <tr> 629 <td> 630 <table width="100%"> 631 <col width="38%" /> 632 <col /> 633 <tr> 634 <td align="right">height: </td> 635 <td><input type="text" id="height" value="0"></td> 636 </tr> 637 </table> 638 </td> 639 <td align="right">showInTaskbar: </td> 640 <td><input type="checkbox" id="showInTaskbar" checked="true">show in taskbar?</td> 641 </tr> 642 <tr> 643 <td> 644 <table width="100%"> 645 <col width="38%" /> 646 <col /> 647 <tr> 648 <td align="right">center: </td> 649 <td><input type="checkbox" id="center" checked="true" onclick="center_clicked()">center screen?</td> 650 </tr> 651 </table> 652 </td> 653 <td align="right">singleInstance: </td> 654 <td><input type="checkbox" id="singleInstance">run as a single instance application?</td> 655 </tr> 656 <tr> 657 <td> 658 <table width="100%"> 659 <col width="38%" /> 660 <col /> 661 <tr> 662 <td align="right">language: </td> 663 <td><select id="language"> 664 <option value="JavaScript">JavaScript</option> 665 <option value="VBScript">VBScript</option> 666 </select></td> 667 </tr> 668 </table> 669 </td> 670 <td align="right">sysMenu: </td> 671 <td><input type="checkbox" id="sysMenu" checked="true">show system menu?</td> 672 </tr> 673 <tr> 674 <td> 675 <table width="100%"> 676 <col width="38%" /> 677 <col /> 678 <tr> 679 <td align="right">commandLine: </td> 680 <td><input type="checkbox" id="commandLine">Receive arguments?</td> 681 </tr> 682 </table> 683 </td> 684 <td align="right">version: </td> 685 <td><input type="text" id="version" value="1.0"></td> 686 </tr> 687 <tr> 688 <td> 689 <table width="100%"> 690 <col width="38%" /> 691 <col /> 692 <tr> 693 <td align="right">title: </td> 694 <td><input type="text" id="title"></td> 695 </tr> 696 </table> 697 </td> 698 <td align="right">windowState: </td> 699 <td><select id="windowState"> 700 <option value="Normal">Normal</option> 701 <option value="Minimize">Minimize</option> 702 <option value="Maximize">Maximize</option> 703 </select></td> 704 </tr> 705 </table> 706 <center> 707 <input type="button" id="btnOk" value=" Ok " onclick="btnOk_clicked()"> 708 <input type="button" id="btnCancel" value="Cancel" onclick="btnCancel_clicked()"> 709 </center> 710 </Body> 711 </Html>
[2]VBS版本
1 <Html> 2 <Head> 3 <Title>HTA Test</Title> 4 <HTA:APPLICATION 5 applicationName="HTA_Test" 6 border="Thick" 7 borderStyle="Raized" 8 caption="Yes" 9 contextMenu="No" 10 icon="E:\文档\图标\Unclassified ICO\2WAY.ICO" 11 id="Test" 12 innerBoder="Yes" 13 navigable="Yes" 14 maximizeButton="No" 15 minimizeButton="No" 16 scroll="Yes" 17 scrollFlat="Yes" 18 selection="Yes" 19 showInTaskbar="Yes" 20 singleInstance="No" 21 sysMenu="Yes" 22 version="1.0" 23 windowState="Normal" /> 24 </Head> 25 <Script language="VBScript"> 26 '===================================================== 27 'HTA是HTML Application的缩写(HTML应用程序),直接将HTML 28 '保存成HTA的格式,就成了一个独立的应用软件,也可以嵌入 29 '<HTA:APPLICATION>元素来增强对该应用程序的控制 30 '===================================================== 31 '以下是<HTA:APPLICATION>元素可用属性,可用来设置HTA窗口 32 '的各种细节【记住HTA:APPLICATION这个APPLICATION不可少, 33 '且这里必须全大写,否则以下属性无效】 34 '【1】applicationName:string=>设置HTA程序的名称,在singleInstance 35 ' 属性设置为"Yes"时有用 36 '【2】border:enum=>设置HTA窗口的边框类型,默认值Thick 37 ' 所有允许的值: Thick 粗边框 38 ' Dialog 对话框【大小不可调整】 39 ' None 无边框【无标题栏】 40 ' Thin 窄边框 41 '【3】borderSytle:enum=>设置HTA窗口的边框风格,默认值是Normal 42 ' 所有允许的值: Normal 普通 43 ' Complex 凹凸格式组合边框 44 ' Raised 凸出的3D边框 45 ' Static 3D边框格式 46 ' Sunken 凹进的3D边框 47 '【4】caption:Yes/No=>设置HTA窗口是否显示标题,默认值为Yes 48 '【5】commandLine:string=>此属性保存了HTA程序的启动参数【无法通过 49 ' 在<HTA:APPLICATION>元素中设置来定义,是受调用传递的参数控制的】, 50 ' 参数可以在Script块中通过<Id>.commandLine来引用,如本程序则是 51 ' Test.commandLine。它的各个参数之间以空格分隔;包含空格的参数请 52 ' 在调用时,用引号引起来,否则会被当成多个参数;第一个参数总是HTA 53 ' 程序的文件路径;其参数需要自己手动解析;因为这个属性的存在,你可 54 ' 以方便地使用js/vbs总调用各种HTA界面,而后通过window.onunload来记录 55 ' 下结果,以方便总调程序获取HTA交互结果 56 '【6】contextMenu:Yes/No=>是否显示右键上下文菜单 57 '【7】icon:stirng=>设置应用程序的图标文件路径,须是有效的ico图标文 58 ' 件,如icon="c:\\a.ico" 59 '【8】innerBorder:Yes/No=>是否显示内部边框的3D边界 60 '【9】navigable:Yes/No=>是否在本窗口加载新navigate(url)的链接,当 61 ' navigable=Yes时,window.navigate(url)方法加载的页面将在本HTA窗口 62 ' 中加载,而不是新的浏览器页面 63 '【10】maximizeButton:Yes/No=>是否显示最大化按钮,默认值Yes 64 '【11】minimizeButton:Yes/No=>是否显示最小化按钮,默认值Yes 65 '【12】scroll:Yes/No=>是否在页面右侧显示垂直滚动条,默认值是Yes 66 '【13】scrollFlat:Yes/No=>设置滚动条是3D(No)或者平面的(Yes) 67 '【14】selection:Yes/No=>设置内容是否可以被鼠标或键盘选中 68 '【15】showInTaskbar:Yes/No=>是否在任务栏显示任务图标,默认值Yes 69 '【16】singleInstance:Yes/No=>是否同时只允许有一个运行实例【进程】, 70 ' 默认值No。当第二次启动同一个HTA程序时, mshta.exe通过上面 71 ' applicaitonName来区分是否名称已占用 72 '【17】sysMenu:Yes/No=>是否允许显示标题栏右键菜单,默认值是Yes 73 '【18】version:string=>设置应用程序的版本,如"1.0",默认值为"" 74 '【19】windowState:enum=>设置HTA窗口的显示类型,默认值为Normal 75 ' 所有允许的值: Normal 常规 76 ' Minimize 最小化 77 ' Maximize 最大化 78 '===================================================== 79 '参见Microsoft HTML Object Library库 80 '1.以下事件是可以正常发生的,参见HTMLWindow2这个类的事件成 81 ' 员【它们以on为前缀】,有事件图标标识的事件成员都可以被 82 ' HTA宿主程序捕获到该事件的消息,其它的以on为前缀的事件成 83 ' 员无法被捕获到。 84 '2.可以通过IHTMLWindow2接口定义的其它方法属性来操纵HTA程序 85 ' 的窗口。 86 '3.HTA中仍然可以使用Scripting.FileSystemObject对象来对文件 87 ' 系统进行读写操作,可利用Window_OnUnload事件来收集HTA表单 88 ' 的数据,记录为文本,方便常规的VBS脚本程序通过GUI界面来进 89 ' 行交互,提升交互体验与使用的方便性。 90 '4.HTA中脚本宿主对象WScript/WshArguments/WshNamed/WshUnnamed 91 ' 对象是无法使用的,其它的如WshShell/WshEnvironment/ 92 ' WshShortcut/WshSpecialFolders/WshUrlShortcut/WshNetwork 93 ' 对象等依然可用 94 '----------------------------------------------------- 95 'HTA窗口的打印控制事件 96 'Sub Window_OnAfterPrint 97 '此事件在HTA窗口的打印工作完成之后发生 98 ' MsgBox "OnAfterPrint" 99 'End Sub 100 'Sub Window_OnBeforePrint 101 '此事件在HTA窗口的打印工作开始之前发生 102 ' MsgBox "OnBeforePrint" 103 'End Sub 104 '----------------------------------------------------- 105 'Sub Window_OnBlur 106 '此事件在将键盘焦点从HTA窗口移开时发生 107 ' MsgBox "OnBlur" 108 'End Sub 109 'Sub Window_OnError 110 '此事件在HTA程序出现错误时发生 111 ' MsgBox "OnError" 112 'End Sub 113 'Sub Window_OnFocus 114 '此事件在HTA窗口获得焦点时发生 115 ' MsgBox "OnFocus" 116 'End Sub 117 'Sub Window_OnHelp 118 '此事件在HTA窗口有焦点时按下F1帮助键时发生 119 ' MsgBox "OnHelp" 120 'End Sub 121 '----------------------------------------------------- 122 'HTA窗口的加载与销毁事件 123 Function GetCmdArgs(cmdArgs) 124 '本函数解析命令行参数 125 '1.左引号前面必须是空格,否则引号应视作参数内容,而非边界 126 '2.右引号后面必须是空格,否则引号应视作参数内容,而非边界 127 '3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么 128 ' 最后的那个参数的左引号当重新认定为内容,而非边界 129 '4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中 130 '5.防止命令行参数最后有多个无意义空格的情况 131 Dim args(),isComplete,c,args2,i,index 132 isComplete=True 133 ReDim args(0) 134 For i=1 To Len(cmdArgs) 135 c=Mid(cmdargs,i,1) 136 If c=Chr(34) Then 137 If isComplete Then 138 If i=1 Then 139 isComplete=Not isComplete 140 Else 141 If Mid(cmdArgs,i-1,1)=" " Then 142 isComplete=Not isComplete 143 Else 144 args(UBound(args))=args(UBound(args))+c 145 End If 146 End If 147 Else 148 If i=Len(cmdArgs) Then 149 isComplete=Not isComplete 150 Else 151 If Mid(cmdArgs,i+1,1)=" " Then 152 isComplete=Not isComplete 153 Else 154 args(UBound(args))=args(UBound(args))+c 155 End If 156 End If 157 End If 158 Else 159 If c=" " And isComplete=True Then 160 If args(UBound(args))<>"" Then 161 ReDim Preserve args(UBound(args)+1) 162 End If 163 Else 164 args(UBound(args))=args(UBound(args))+c 165 End if 166 End If 167 Next 168 If isComplete=False Then 169 args(UBound(args))=Chr(34)+args(UBound(args)) 170 If InStr(args(UBound(args))," ")<>0 Then 171 args2=Split(args(UBound(args))) 172 index=UBound(args) 173 ReDim Preserve args(UBound(args2)+index) 174 For i=index To UBound(args2)+index 175 args(i)=args2(i-index) 176 Next 177 End If 178 End If 179 If args(UBound(args))="" Then 180 ReDim Preserve args(UBound(args)-1) 181 End If 182 GetCmdArgs=args 183 End Function 184 185 Sub Window_OnLoad 186 '此事件在HTA窗口被成功加载后发生 187 Dim width,height 188 width=300:height=300 189 self.ResizeTo width,height 190 self.MoveTo (self.screen.AvailWidth-width)/2, _ 191 (self.screen.AvailHeight-height)/2 192 MsgBox "OnLoad" 193 '让我们来看看本程序接收到哪些命令行参数 194 Dim item 195 MsgBox "Test.commandLine: " & Test.commandLine 196 For Each item In GetCmdArgs(Test.commandLine) 197 MsgBox item 198 Next 199 End Sub 200 'Sub Window_OnBeforeUnload 201 ' 此事件在HTA窗口被销毁前发生 202 ' MsgBox "OnBeforeUnload" 203 'End Sub 204 Sub Window_OnUnload 205 '此事件在HTA窗口被销毁时发生 206 MsgBox "OnUnload" 207 Set ws=CreateObject("WScript.Shell") 208 '------------------------------------- 209 dPath=ws.SpecialFolders("Desktop") 210 pPath=ws.SpecialFolders("Programs") 211 '------------------------------------- 212 Set sc=ws.CreateShortcut(dPath & "\所有程序.lnk") 213 sc.TargetPath=pPath 214 sc.WindowStyle=3 215 sc.Hotkey="Ctrl+Alt+j" 216 sc.save 217 '------------------------------------- 218 Set sc=ws.CreateShortcut(dPath & "\百度.url") 219 sc.TargetPath="http:'www.baidu.com" 220 sc.save 221 '------------------------------------- 222 Set fso=CreateObject("Scripting.FileSystemObject") 223 Set txt=fso.CreateTextFile("Output.txt") 224 Set nt = CreateObject("WScript.Network") 225 txt.WriteLine "Domain = " & nt.UserDomain 226 txt.WriteLine "Computer Name = " & nt.ComputerName 227 txt.WriteLine "User Name = " & nt.UserName 228 txt.WriteLine "=====================================" 229 Set oDrives = nt.EnumNetworkDrives 230 Set oPrinters = nt.EnumPrinterConnections 231 txt.WriteLine "Network drive mappings:" 232 For i = 0 to oDrives.Count - 1 Step 2 233 txt.WriteLine "Drive 【" & oDrives.Item(i) & "】 = " & oDrives.Item(i+1) 234 Next 235 txt.WriteLine "=====================================" 236 txt.WriteLine "Network printer mappings:" 237 For i = 0 to oPrinters.Count - 1 Step 2 238 txt.WriteLine "Port 【" & oPrinters.Item(i) & "】 = " & oPrinters.Item(i+1) 239 Next 240 txt.WriteLine "=====================================" 241 txt.Close 242 ws.Run "Notepad.exe Output.txt" 243 End Sub 244 '----------------------------------------------------- 245 'Sub Window_OnResize 246 '此事件在HTA窗口的大小改变时发生 247 ' MsgBox "OnResize" 248 'End Sub 249 'Sub Window_OnScroll 250 '此事件在对HTA窗口执行滚动操作时发生 251 ' MsgBox "OnScroll" 252 'End Sub 253 '===================================================== 254 </Script> 255 <Body bgcolor="green"> 256 </Body> 257 </Html>
7.JS版HTACreater
1 <html> 2 <head> 3 <title>HTA Settings</title> 4 <HTA:APPLICATION 5 applicationName="HTACreater" 6 border="Dialog" 7 borderStyle="Raized" 8 caption="Yes" 9 contextMenu="Yes" 10 icon="E:\文档\图标\Ico图标大全\ico图标\VB_ICO图标\wrench.ico" 11 id="Creater" 12 innerBoder="Yes" 13 navigable="Yes" 14 maximizeButton="No" 15 minimizeButton="No" 16 scroll="No" 17 scrollFlat="Yes" 18 selection="Yes" 19 showInTaskbar="Yes" 20 singleInstance="No" 21 sysMenu="Yes" 22 version="1.0" 23 windowState="Normal" /> 24 <script language="VBScript"> 25 Function GetCmdArgs(cmdArgs) 26 '本函数解析命令行参数 27 '1.左引号前面必须是空格,否则引号应视作参数内容,而非边界 28 '2.右引号后面必须是空格,否则引号应视作参数内容,而非边界 29 '3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么 30 ' 最后的那个参数的左引号当重新认定为内容,而非边界 31 '4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中 32 '5.防止命令行参数最后有多个无意义空格的情况 33 Dim args(),isComplete,c,args2,i,index 34 isComplete=True 35 ReDim args(0) 36 For i=1 To Len(cmdArgs) 37 c=Mid(cmdargs,i,1) 38 If c=Chr(34) Then 39 If isComplete Then 40 If i=1 Then 41 isComplete=Not isComplete 42 Else 43 If Mid(cmdArgs,i-1,1)=" " Then 44 isComplete=Not isComplete 45 Else 46 args(UBound(args))=args(UBound(args))+c 47 End If 48 End If 49 Else 50 If i=Len(cmdArgs) Then 51 isComplete=Not isComplete 52 Else 53 If Mid(cmdArgs,i+1,1)=" " Then 54 isComplete=Not isComplete 55 Else 56 args(UBound(args))=args(UBound(args))+c 57 End If 58 End If 59 End If 60 Else 61 If c=" " And isComplete=True Then 62 If args(UBound(args))<>"" Then 63 ReDim Preserve args(UBound(args)+1) 64 End If 65 Else 66 args(UBound(args))=args(UBound(args))+c 67 End if 68 End If 69 Next 70 If isComplete=False Then 71 args(UBound(args))=Chr(34)+args(UBound(args)) 72 If InStr(args(UBound(args))," ")<>0 Then 73 args2=Split(args(UBound(args))) 74 index=UBound(args) 75 ReDim Preserve args(UBound(args2)+index) 76 For i=index To UBound(args2)+index 77 args(i)=args2(i-index) 78 Next 79 End If 80 End If 81 If args(UBound(args))="" Then 82 ReDim Preserve args(UBound(args)-1) 83 End If 84 GetCmdArgs=args 85 End Function 86 </script> 87 <script language="JavaScript"> 88 var es,values; 89 var ws=new ActiveXObject("WScript.Shell"); 90 var fso=new ActiveXObject("Scripting.FileSystemObject"); 91 92 function GetCmdArgs(cmdArgs) 93 { 94 //本函数解析命令行参数 95 //1.左引号前面必须是空格,否则引号应视作参数内容,而非边界 96 //2.右引号后面必须是空格,否则引号应视作参数内容,而非边界 97 //3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么 98 // 最后的那个参数的左引号当重新认定为内容,而非边界 99 //4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中 100 //5.防止命令行参数最后有多个无意义空格的情况 101 var args=new Array(''),isComplete=true; 102 for(var i=0;i<cmdArgs.length;i++) 103 { 104 var c=cmdArgs.charAt(i); 105 if(c=='"') 106 if(isComplete) 107 if(i==0) 108 isComplete=!isComplete; 109 else 110 if(cmdArgs.charAt(i-1)==" ") 111 isComplete=!isComplete; 112 else 113 args[args.length-1]+=c; 114 else 115 if(i==cmdArgs.length-1) 116 isComplete=!isComplete; 117 else 118 if(cmdArgs.charAt(i+1)==" ") 119 isComplete=!isComplete; 120 else 121 args[args.length-1]+=c; 122 123 else 124 if(c==" "&&isComplete&&args[args.length-1]!="") 125 args.push(''); 126 else 127 args[args.length-1]+=c; 128 } 129 if(!isComplete) 130 { 131 var arg='"'+args.pop(); 132 if(arg.indexOf(" ")!=-1) 133 args=args.concat(arg.split(" ")); 134 } 135 if(args[args.length-1]=="") 136 args.pop(); 137 return args 138 } 139 140 function isGoodVarName(name){ 141 var arr=name.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/g); 142 if(arr!=null&&arr.length==1) 143 return true; 144 else 145 return false; 146 } 147 148 function isNumberStr(numStr){ 149 try{num=eval('new Number('+numStr+')');} 150 catch(e){return false;} 151 return true; 152 } 153 154 function center_clicked(){ 155 var e=self.document.getElementById('left'); 156 e.disabled=!e.disabled; 157 var e=self.document.getElementById('top'); 158 e.disabled=!e.disabled; 159 } 160 161 function getHta(){ 162 var xml=new ActiveXObject("MSXML2.DOMDocument"); 163 var eHta=xml.createElement('HTA:APPLICATION'); 164 var names=('applicationName;border;borderStyle;caption;contextMenu;'+ 165 'icon;id;innerBorder;navigable;maximizeButton;minimizeButton;'+ 166 'scroll;scrollFlat;selection;showInTaskbar;singleInstance;'+ 167 'sysMenu;version;windowState').split(";"); 168 for(var i=0;i<names.length;i++) 169 eHta.setAttribute(names[i],values.Item(names[i])); 170 var htaSettingsStr=eHta.xml; 171 htaSettingsStr=htaSettingsStr.replace(/(\") (\w)/ig,'$1\r\n $2'); 172 htaSettingsStr=htaSettingsStr.replace(/(\w) (\w+=\")/ig,'$1\r\n $2'); 173 return htaSettingsStr; 174 } 175 176 function btnOk_clicked(){ 177 es=new Elements(); 178 values=new ActiveXObject("Scripting.Dictionary"); 179 //get all values 180 for(var i in es) 181 if(i!='getValue') 182 values.Add(i,es.getValue(es[i])); 183 //check values 184 //check 'id' 185 var value=values.Item('id'); 186 if(values.Item('commandLine')=='Yes'&&value==''&&!isGoodVarName(value)){ 187 alert('The value of "id" must be a good varname when the commandLine is required!!!'); 188 return; 189 } 190 //check 'left','top','width','height' 191 var names=new Array('left','top','width','height'); 192 for(var i=0;i<names.length;i++){ 193 var name=names[i]; 194 if(values.Item('center')=='Yes') 195 if(name=='left'||name=='top') 196 continue; 197 value=values.Item(name); 198 if(isNumberStr(value)){ 199 values.Item(name)=eval('new Number('+value+')'); 200 value=values.Item(name); 201 var maxValue=eval('self.window.screen.'+name); 202 if(value>maxValue||value<0){ 203 alert("The value of '"+name+"' must be 0-"+maxValue); 204 return; 205 } 206 } 207 else{ 208 alert("The value of '"+name+"' is not a number string."); 209 return; 210 } 211 } 212 //htaPath 213 var htaPath; 214 do{ 215 htaPath=fso.GetAbsolutePathName(fso.GetBaseName(fso.GetTempName())+'.hta'); 216 }while(fso.FileExists(htaPath)); 217 //start to write the hta file 218 var txt=fso.CreateTextFile(htaPath); 219 txt.WriteLine('<html>\r\n<head>\r\n<title>'+values.Item('title')+'</title>'); 220 txt.WriteLine(getHta()); 221 txt.WriteLine('<script language="'+values.Item('language')+'">'); 222 if(values.Item('language')=='JavaScript'){ 223 if(values.Item('commandLine')=='Yes'){ 224 txt.WriteLine(GetCmdArgs); 225 txt.WriteLine(''); 226 } 227 228 if(values.Item('center')=='Yes'){ 229 var width=values.Item('width'),height=values.Item('height'); 230 if(width!=0&&height!=0){ 231 txt.WriteLine('\r\nself.resizeTo('+width+','+height+');'); 232 txt.WriteLine('self.moveTo((self.screen.width-'+width+ 233 ')/2,(self.screen.height-'+height+')/2);\r\n'); 234 } 235 } 236 else{ 237 var left=values.Item('left'),top=values.Item('top'); 238 var width=values.Item('width'),height=values.Item('height'); 239 if(left!=0&&top!=0&&width!=0&&height!=0){ 240 txt.WriteLine('\r\nself.resizeTo('+width+','+height+');'); 241 txt.WriteLine('self.moveTo('+left+','+top+');\r\n'); 242 } 243 } 244 for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){ 245 name=e.item(); 246 if(name.indexOf('window')==0&&values.Item(name)=='Yes'){ 247 name=name.replace('_','.'); 248 txt.WriteLine(name+'=function(){\r\n \r\n}\r\n'); 249 } 250 } 251 } 252 else{ 253 if(values.Item('commandLine')=='Yes'){ 254 var stream=fso.OpenTextFile(GetCmdArgs(Creater.commandLine)[0]); 255 for(var i=1;i<=85;i++) 256 if(i<25) 257 stream.SkipLine(); 258 else 259 txt.WriteLine(stream.ReadLine()); 260 stream.Close(); 261 txt.WriteLine(''); 262 } 263 if(values.Item('center')=='Yes'){ 264 var width=values.Item('width'),height=values.Item('height'); 265 if(width!=0&&height!=0){ 266 txt.WriteLine('\r\nself.resizeTo '+width+','+height); 267 txt.WriteLine('self.moveTo (self.screen.width-'+width+ 268 ')/2,(self.screen.height-'+height+')/2\r\n'); 269 } 270 } 271 else{ 272 var left=values.Item('left'),top=values.Item('top'); 273 var width=values.Item('width'),height=values.Item('height'); 274 if(left!=0&&top!=0&&width!=0&&height!=0){ 275 txt.WriteLine('\r\nself.resizeTo '+width+','+height); 276 txt.WriteLine('self.moveTo '+left+','+top); 277 txt.WriteLine(''); 278 } 279 } 280 for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){ 281 name=e.item(); 282 if(name.indexOf('window')==0&&values.Item(name)=='Yes'){ 283 txt.WriteLine('Sub '+name+'\r\n \r\nEnd Sub\r\n'); 284 } 285 } 286 } 287 txt.WriteLine('<\/script>'); 288 txt.WriteLine('</head>\r\n<body>\r\n</body>\r\n</html>'); 289 txt.Close(); 290 self.close(); 291 } 292 293 function btnCancel_clicked(){ 294 var btn=ws.Popup("The settings will be gave up, a"+ 295 "re you sure?",0,"Warnning",4+32); 296 if(btn==6) 297 self.close(); 298 } 299 300 function Elements(){ 301 this.getValue=function(e){ 302 switch(e.type){ 303 case "checkbox": 304 return e.checked?'Yes':'No'; 305 case "text": 306 case "file": 307 return e.value; 308 case "select-one": 309 case "select-multiple": 310 index=e.selectedIndex 311 return e.options[index].text; 312 default: 313 throw new Error(5001,"The element '"+e.id+"' is not the right type."); 314 } 315 } 316 for(var i=0;i<self.document.all.length;i++){ 317 var el=self.document.all[i]; 318 if(el.id!=''&&typeof el.type!='undefined'&&el.type!='button') 319 eval('this.'+el.id+'=el'); 320 } 321 } 322 323 324 window.onload=function(){ 325 var width=800,height=685; 326 self.resizeTo(width,height); 327 self.moveTo((self.screen.width-width)/2, 328 (self.screen.height-height)/2); 329 } 330 </script> 331 </head> 332 <body> 333 <table width="100%" border="1"> 334 <col /> 335 <col width="16%" /> 336 <col width="46%" /> 337 <tr> 338 <th>选择事件</th> 339 <th>属性</th> 340 <th>设置值</th> 341 </tr> 342 <tr> 343 <td><input type="checkbox" id="window_onafterprint">window.onafterprint</td> 344 <td align="right">applicationName: </td> 345 <td><input type="text" id="applicationName"></td> 346 </tr> 347 <tr> 348 <td><input type="checkbox" id="window_onbeforeprint">window.onbeforeprint</td> 349 <td align="right">border: </td> 350 <td><select id="border"> 351 <option value="Dialog">Dialog</option> 352 <option value="None">None</option> 353 <option value="Thick">Thick</option> 354 <option value="Thin">Thin</option> 355 </select></td> 356 </tr> 357 <tr> 358 <td><input type="checkbox" id="window_onbeforeunload">window.onbeforeunload</td> 359 <td align="right">borderStyle: </td> 360 <td><select id="borderStyle"> 361 <option value="Normal">Normal</option> 362 <option value="Complex">Complex</option> 363 <option value="Raised">Raised</option> 364 <option value="Static">Static</option> 365 <option value="Sunken">Sunken</option> 366 </select></td> 367 </tr> 368 <tr> 369 <td><input type="checkbox" id="window_onblur">window.onblur</td> 370 <td align="right">caption: </td> 371 <td><input type="checkbox" id="caption" checked="true">show title bar?</td> 372 </tr> 373 <tr> 374 <td><input type="checkbox" id="window_onerror">window.onerror</td> 375 <td align="right">contextMenu: </td> 376 <td><input type="checkbox" id="contextMenu" checked="true">show contextMenu?</td> 377 </tr> 378 <tr> 379 <td><input type="checkbox" id="window_onfocus">window.onfocus</td> 380 <td align="right">icon: </td> 381 <td><input type="file" id="icon"></td> 382 </tr> 383 <tr> 384 <td><input type="checkbox" id="window_onhelp">window.onhelp</td> 385 <td align="right">id: </td> 386 <td><input type="text" id="id"></td> 387 </tr> 388 <tr> 389 <td><input type="checkbox" id="window_onload" checked="true">window.onload</td> 390 <td align="right">innerBorder: </td> 391 <td><input type="checkbox" id="innerBorder" checked="true">show inner border?</td> 392 </tr> 393 <tr> 394 <td><input type="checkbox" id="window_onresize">window.onresize</td> 395 <td align="right">navigable: </td> 396 <td><input type="checkbox" id="navigable" checked="true">navigate pages in current page?</td> 397 </tr> 398 <tr> 399 <td><input type="checkbox" id="window_onscroll">window.onscroll</td> 400 <td align="right">maximizeButton: </td> 401 <td><input type="checkbox" id="maximizeButton" checked="true">show maximize button?</td> 402 </tr> 403 <tr> 404 <td><input type="checkbox" id="window_onunload">window.onunload</td> 405 <td align="right">minimizeButton: </td> 406 <td><input type="checkbox" id="minimizeButton" checked="true">show minimize button?</td> 407 </tr> 408 <tr> 409 <td> 410 <table width="100%"> 411 <col width="38%" /> 412 <col /> 413 <tr> 414 <td align="right">left: </td> 415 <td><input type="text" id="left" disabled="true" value="0"></td> 416 </tr> 417 </table> 418 </td> 419 <td align="right">scroll: </td> 420 <td><input type="checkbox" id="scroll" checked="true">show scroll?</td> 421 </tr> 422 <tr> 423 <td> 424 <table width="100%"> 425 <col width="38%" /> 426 <col /> 427 <tr> 428 <td align="right">top: </td> 429 <td><input type="text" id="top" disabled="true" value="0"></td> 430 </tr> 431 </table> 432 </td> 433 <td align="right">scrollFlat: </td> 434 <td><input type="checkbox" id="scrollFlat" checked="true">show scroll in flat?</td> 435 </tr> 436 <tr> 437 <td> 438 <table width="100%"> 439 <col width="38%" /> 440 <col /> 441 <tr> 442 <td align="right">width: </td> 443 <td><input type="text" id="width" value="0"></td> 444 </tr> 445 </table> 446 </td> 447 <td align="right">selection: </td> 448 <td><input type="checkbox" id="selection" checked="true">allow user to select the page elements?</td> 449 </tr> 450 <tr> 451 <td> 452 <table width="100%"> 453 <col width="38%" /> 454 <col /> 455 <tr> 456 <td align="right">height: </td> 457 <td><input type="text" id="height" value="0"></td> 458 </tr> 459 </table> 460 </td> 461 <td align="right">showInTaskbar: </td> 462 <td><input type="checkbox" id="showInTaskbar" checked="true">show in taskbar?</td> 463 </tr> 464 <tr> 465 <td> 466 <table width="100%"> 467 <col width="38%" /> 468 <col /> 469 <tr> 470 <td align="right">center: </td> 471 <td><input type="checkbox" id="center" checked="true" onclick="center_clicked()">center screen?</td> 472 </tr> 473 </table> 474 </td> 475 <td align="right">singleInstance: </td> 476 <td><input type="checkbox" id="singleInstance">run as a single instance application?</td> 477 </tr> 478 <tr> 479 <td> 480 <table width="100%"> 481 <col width="38%" /> 482 <col /> 483 <tr> 484 <td align="right">language: </td> 485 <td><select id="language"> 486 <option value="JavaScript">JavaScript</option> 487 <option value="VBScript">VBScript</option> 488 </select></td> 489 </tr> 490 </table> 491 </td> 492 <td align="right">sysMenu: </td> 493 <td><input type="checkbox" id="sysMenu" checked="true">show system menu?</td> 494 </tr> 495 <tr> 496 <td> 497 <table width="100%"> 498 <col width="38%" /> 499 <col /> 500 <tr> 501 <td align="right">commandLine: </td> 502 <td><input type="checkbox" id="commandLine">Receive arguments?</td> 503 </tr> 504 </table> 505 </td> 506 <td align="right">version: </td> 507 <td><input type="text" id="version" value="1.0"></td> 508 </tr> 509 <tr> 510 <td> 511 <table width="100%"> 512 <col width="38%" /> 513 <col /> 514 <tr> 515 <td align="right">title: </td> 516 <td><input type="text" id="title"></td> 517 </tr> 518 </table> 519 </td> 520 <td align="right">windowState: </td> 521 <td><select id="windowState"> 522 <option value="Normal">Normal</option> 523 <option value="Minimize">Minimize</option> 524 <option value="Maximize">Maximize</option> 525 </select></td> 526 </tr> 527 </table> 528 <center> 529 <input type="button" id="btnOk" value=" Ok " onclick="btnOk_clicked()"> 530 <input type="button" id="btnCancel" value="Cancel" onclick="btnCancel_clicked()"> 531 </center> 532 </body> 533 </html>
其执行界面: