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>
其执行界面:



浙公网安备 33010602011771号