HTA全解析:给VBS和JS一个强大的交互界面

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>

其执行界面:

你可能感兴趣的:(HTA全解析:给VBS和JS一个强大的交互界面)