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版本

 function GetCmdArgs(cmdArgs)
{
//本函数解析命令行参数
//1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
//2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
//3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
// 最后的那个参数的左引号当重新认定为内容,而非边界
//4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
//5.防止命令行参数最后有多个无意义空格的情况
var args=new Array(''),isComplete=true
for(var i=0;i<cmdArgs.length;i++)
{
var c=cmdArgs.charAt(i);
if(c=='"')
if(isComplete)
if(i==0)
isComplete=!isComplete;
else
if(cmdArgs.charAt(i-1)==" ")
isComplete=!isComplete;
else
args[args.length-1]+=c;
else
if(i==cmdArgs.length-1)
isComplete=!isComplete;
else
if(cmdArgs.charAt(i+1)==" ")
isComplete=!isComplete;
else
args[args.length-1]+=c; else
if(c==" "&&isComplete&&args[args.length-1]!="")
args.push('')
else
args[args.length-1]+=c;
}
if(!isComplete)
{
var arg='"'+args.pop();
if(arg.indexOf(" ")!=-1)
args=args.concat(arg.split(" "));
}
if(args[args.length-1]=="")
args.pop();
return args
}

[2]VBS版本

 Function GetCmdArgs(cmdArgs)
'本函数解析命令行参数
'1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
'2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
'3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
' 最后的那个参数的左引号当重新认定为内容,而非边界
'4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
'5.防止命令行参数最后有多个无意义空格的情况
Dim args(),isComplete,c,args2,i,index
isComplete=True
ReDim args()
For i= To Len(cmdArgs)
c=Mid(cmdargs,i,)
If c=Chr() Then
If isComplete Then
If i= Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i-,)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
Else
If i=Len(cmdArgs) Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i+,)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
End If
Else
If c=" " And isComplete=True Then
If args(UBound(args))<>"" Then
ReDim Preserve args(UBound(args)+)
End If
Else
args(UBound(args))=args(UBound(args))+c
End if
End If
Next
If isComplete=False Then
args(UBound(args))=Chr()+args(UBound(args))
If InStr(args(UBound(args))," ")<> Then
args2=Split(args(UBound(args)))
index=UBound(args)
ReDim Preserve args(UBound(args2)+index)
For i=index To UBound(args2)+index
args(i)=args2(i-index)
Next
End If
End If
If args(UBound(args))="" Then
ReDim Preserve args(UBound(args)-)
End If
GetCmdArgs=args
End Function

6.示例

[1]JS版本

 <Html>
<Head>
<Title>HTA Test</Title>
<HTA:APPLICATION
applicationName="HTA_Test"
border="Dialog"
borderStyle="Raized"
caption="Yes"
contextMenu="No"
icon="E:\文档\图标\Ico图标大全\Icon资源大全\chemical.ico"
id="Test"
innerBoder="Yes"
navigable="Yes"
maximizeButton="No"
minimizeButton="No"
scroll="No"
scrollFlat="Yes"
selection="Yes"
showInTaskbar="Yes"
singleInstance="No"
sysMenu="Yes"
version="1.0"
windowState="Normal" />
</Head>
<script language="VBScript">
Function GetCmdArgs(cmdArgs)
'本函数解析命令行参数
'1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
'2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
'3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
' 最后的那个参数的左引号当重新认定为内容,而非边界
'4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
'5.防止命令行参数最后有多个无意义空格的情况
Dim args(),isComplete,c,args2,i,index
isComplete=True
ReDim args(0)
For i=1 To Len(cmdArgs)
c=Mid(cmdargs,i,1)
If c=Chr(34) Then
If isComplete Then
If i=1 Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i-1,1)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
Else
If i=Len(cmdArgs) Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i+1,1)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
End If
Else
If c=" " And isComplete=True Then
If args(UBound(args))<>"" Then
ReDim Preserve args(UBound(args)+1)
End If
Else
args(UBound(args))=args(UBound(args))+c
End if
End If
Next
If isComplete=False Then
args(UBound(args))=Chr(34)+args(UBound(args))
If InStr(args(UBound(args))," ")<>0 Then
args2=Split(args(UBound(args)))
index=UBound(args)
ReDim Preserve args(UBound(args2)+index)
For i=index To UBound(args2)+index
args(i)=args2(i-index)
Next
End If
End If
If args(UBound(args))="" Then
ReDim Preserve args(UBound(args)-1)
End If
GetCmdArgs=args
End Function
</script>
<Script language="JavaScript">
//=====================================================
//HTA是HTML Application的缩写(HTML应用程序),直接将HTML
//保存成HTA的格式,就成了一个独立的应用软件,也可以嵌入
//<HTA:APPLICATION>元素来增强对该应用程序的控制
//=====================================================
//以下是<HTA:APPLICATION>元素可用属性,可用来设置HTA窗口
//的各种细节【记住HTA:APPLICATION这个APPLICATION不可少,
//且这里必须全大写,否则以下属性无效】
//【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=>是否显示右键上下文菜单,默认值Yes
//【7】icon:stirng=>设置应用程序的图标文件路径,须是有效的ico图标文
// 件,如icon="c:\\a.ico"
//【8】innerBorder:Yes/No=>是否显示内部边框的3D边界,默认值Yes
//【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 最大化
//=====================================================
//参见Microsoft HTML Object Library库
//1.以下事件是可以正常发生的:
//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不再可用
//2.可以通过IHTMLWindow2接口定义的其它方法属性来操纵HTA程序
// 的窗口。
//3.HTA中仍然可以使用Scripting.FileSystemObject对象来对文件
// 系统进行读写操作,可利用Window_OnUnload事件来收集HTA表单
// 的数据,记录为文本,方便常规的VBS脚本程序通过GUI界面来进
// 行交互,提升交互体验与使用的方便性。
//4.HTA中脚本宿主对象WScript/WshArguments/WshNamed/WshUnnamed
// 对象是无法使用的,其它的如WshShell/WshEnvironment/
// WshShortcut/WshSpecialFolders/WshUrlShortcut/WshNetwork
// 对象等依然可用
//-----------------------------------------------------
//HTA窗口的打印控制事件
// window.onafterprint=function()
// {
// 此事件在HTA窗口的打印工作完成之后发生
// alert("OnAfterPrint");
// }
// window.onbeforeprint=function()
// {
// 此事件在HTA窗口的打印工作开始之前发生
// alert("OnBeforePrint");
// }
//-----------------------------------------------------
// window.onblur=function()
// {
// 此事件在将键盘焦点从HTA窗口移开时发生
// alert("OnBlur");
// }
// window.onerror=function()
// {
// 此事件在HTA程序出现错误时发生
// alert("OnError");
// }
// window.onfocus=function()
// {
// 此事件在HTA窗口获得焦点时发生
// alert("OnFocus");
// }
// window.onhelp=function()
// {
// 此事件在HTA窗口有焦点时按下F1帮助键时发生
// alert("OnHelp");
// }
//-----------------------------------------------------
//HTA窗口的加载与销毁事件
var es,values;
var ws=new ActiveXObject("WScript.Shell");
var fso=new ActiveXObject("Scripting.FileSystemObject"); function GetCmdArgs(cmdArgs)
{
//本函数解析命令行参数
//1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
//2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
//3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
// 最后的那个参数的左引号当重新认定为内容,而非边界
//4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
//5.防止命令行参数最后有多个无意义空格的情况
var args=new Array(''),isComplete=true;
for(var i=0;i<cmdArgs.length;i++)
{
var c=cmdArgs.charAt(i);
if(c=='"')
if(isComplete)
if(i==0)
isComplete=!isComplete;
else
if(cmdArgs.charAt(i-1)==" ")
isComplete=!isComplete;
else
args[args.length-1]+=c;
else
if(i==cmdArgs.length-1)
isComplete=!isComplete;
else
if(cmdArgs.charAt(i+1)==" ")
isComplete=!isComplete;
else
args[args.length-1]+=c; else
if(c==" "&&isComplete&&args[args.length-1]!="")
args.push('');
else
args[args.length-1]+=c;
}
if(!isComplete)
{
var arg='"'+args.pop();
if(arg.indexOf(" ")!=-1)
args=args.concat(arg.split(" "));
}
if(args[args.length-1]=="")
args.pop();
return args
} function isGoodVarName(name){
var arr=name.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/g);
if(arr!=null&&arr.length==1)
return true;
else
return false;
} function isNumberStr(numStr){
try{num=eval('new Number('+numStr+')');}
catch(e){return false;}
return true;
} function center_clicked(){
var e=self.document.getElementById('left');
e.disabled=!e.disabled;
var e=self.document.getElementById('top');
e.disabled=!e.disabled;
} function getHta(){
var xml=new ActiveXObject("MSXML2.DOMDocument");
var eHta=xml.createElement('HTA:APPLICATION');
var names=('applicationName;border;borderStyle;caption;contextMenu;'+
'icon;id;innerBorder;navigable;maximizeButton;minimizeButton;'+
'scroll;scrollFlat;selection;showInTaskbar;singleInstance;'+
'sysMenu;version;windowState').split(";");
for(var i=0;i<names.length;i++)
eHta.setAttribute(names[i],values.Item(names[i]));
var htaSettingsStr=eHta.xml;
htaSettingsStr=htaSettingsStr.replace(/(\") (\w)/ig,'$1\r\n $2');
htaSettingsStr=htaSettingsStr.replace(/(\w) (\w+=\")/ig,'$1\r\n $2');
return htaSettingsStr;
} function btnOk_clicked(){
es=new Elements();
values=new ActiveXObject("Scripting.Dictionary");
//get all values
for(var i in es)
if(i!='getValue')
values.Add(i,es.getValue(es[i]));
//check values
//check 'id'
var value=values.Item('id');
if(values.Item('commandLine')=='Yes'&&value==''&&!isGoodVarName(value)){
alert('The value of "id" must be a good varname when the commandLine is required!!!');
return;
}
//check 'left','top','width','height'
var names=new Array('left','top','width','height');
for(var i=0;i<names.length;i++){
var name=names[i];
if(values.Item('center')=='Yes')
if(name=='left'||name=='top')
continue;
value=values.Item(name);
if(isNumberStr(value)){
values.Item(name)=eval('new Number('+value+')');
value=values.Item(name);
var maxValue=eval('self.window.screen.'+name);
if(value>maxValue||value<0){
alert("The value of '"+name+"' must be 0-"+maxValue);
return;
}
}
else{
alert("The value of '"+name+"' is not a number string.");
return;
}
}
//htaPath
var htaPath;
do{
htaPath=fso.GetAbsolutePathName(fso.GetBaseName(fso.GetTempName())+'.hta');
}while(fso.FileExists(htaPath));
//start to write the hta file
var txt=fso.CreateTextFile(htaPath);
txt.WriteLine('<html>\r\n<head>\r\n<title>'+values.Item('title')+'</title>');
txt.WriteLine(getHta());
txt.WriteLine('<script language="'+values.Item('language')+'">');
if(values.Item('language')=='JavaScript'){
if(values.Item('commandLine')=='Yes'){
txt.WriteLine(GetCmdArgs);
txt.WriteLine('');
} if(values.Item('center')=='Yes'){
var width=values.Item('width'),height=values.Item('height');
if(width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo('+width+','+height+');');
txt.WriteLine('self.moveTo((self.screen.width-'+width+
')/2,(self.screen.height-'+height+')/2);\r\n');
}
}
else{
var left=values.Item('left'),top=values.Item('top');
var width=values.Item('width'),height=values.Item('height');
if(left!=0&&top!=0&&width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo('+width+','+height+');');
txt.WriteLine('self.moveTo('+left+','+top+');\r\n');
}
}
for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){
name=e.item();
if(name.indexOf('window')==0&&values.Item(name)=='Yes'){
name=name.replace('_','.');
txt.WriteLine(name+'=function(){\r\n \r\n}\r\n');
}
}
}
else{
if(values.Item('commandLine')=='Yes'){
var stream=fso.OpenTextFile(GetCmdArgs(Test.commandLine)[0]);
for(var i=1;i<=86;i++)
if(i<=25)
stream.SkipLine();
else
txt.WriteLine(stream.ReadLine());
stream.Close();
txt.WriteLine('');
}
if(values.Item('center')=='Yes'){
var width=values.Item('width'),height=values.Item('height');
if(width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo '+width+','+height);
txt.WriteLine('self.moveTo (self.screen.width-'+width+
')/2,(self.screen.height-'+height+')/2\r\n');
}
}
else{
var left=values.Item('left'),top=values.Item('top');
var width=values.Item('width'),height=values.Item('height');
if(left!=0&&top!=0&&width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo '+width+','+height);
txt.WriteLine('self.moveTo '+left+','+top);
txt.WriteLine('');
}
}
for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){
name=e.item();
if(name.indexOf('window')==0&&values.Item(name)=='Yes'){
txt.WriteLine('Sub '+name+'\r\n \r\nEnd Sub\r\n');
}
}
}
txt.WriteLine('<\/script>');
txt.WriteLine('</head>\r\n<body>\r\n</body>\r\n</html>');
txt.Close();
self.close();
} function btnCancel_clicked(){
var btn=ws.Popup("The settings will be gave up, a"+
"re you sure?",0,"Warnning",4+32);
if(btn==6)
self.close();
} function Elements(){
this.getValue=function(e){
switch(e.type){
case "checkbox":
return e.checked?'Yes':'No';
case "text":
case "file":
return e.value;
case "select-one":
case "select-multiple":
index=e.selectedIndex
return e.options[index].text;
default:
throw new Error(5001,"The element '"+e.id+"' is not the right type.");
}
}
for(var i=0;i<self.document.all.length;i++){
var el=self.document.all[i];
if(el.id!=''&&typeof el.type!='undefined'&&el.type!='button')
eval('this.'+el.id+'=el');
}
}
window.onload=function()
{
//此事件在HTA窗口被成功加载后发生
var width=800,height=685;
self.resizeTo(width,height);
self.moveTo((self.screen.availWidth-width)/2,
(self.screen.availHeight-height)/2);
alert("OnLoad");
//让我们来看看本程序接收到哪些命令行参数
//你可以命令行执行HTATest.hta "hello world" 32
alert("Test.CommandLine: "+Test.commandLine);
alert("ApplicationName = "+Test.applicationName);
//其它属性也可只读访问,切记使用Id名来引用各个属性
var args=GetCmdArgs(Test.commandLine);
for(var i=0;i<args.length;i++)
alert(args[i]);
}
// window.onbeforeunload=function()
// {
// 此事件在HTA窗口被销毁前发生
// alert("OnBeforeUnload" );
// }
window.onunload=function()
{
//此事件在HTA窗口被销毁时发生,切记alert不再可用
var ws=new ActiveXObject("WScript.Shell")
ws.Popup("OnUnload");
//-------------------------------------
dPath=ws.SpecialFolders("Desktop")
pPath=ws.SpecialFolders("Programs")
//-------------------------------------
var sc=ws.CreateShortcut(dPath+"\\Programs.lnk")
sc.TargetPath=pPath
sc.WindowStyle=3
sc.Hotkey="Ctrl+Alt+j"
sc.Save();
//-------------------------------------
var sc=ws.CreateShortcut(dPath+"\\baidu.url")
sc.TargetPath="http://www.baidu.com"
sc.Save();
//-------------------------------------
var fso=new ActiveXObject("Scripting.FileSystemObject")
var txt=fso.CreateTextFile("Output.txt")
var nt=new ActiveXObject("WScript.Network")
txt.WriteLine("Domain = "+nt.UserDomain);
txt.WriteLine("Computer Name = "+nt.ComputerName);
txt.WriteLine("User Name = " + nt.UserName );
txt.WriteLine("=====================================");
var oDrives=nt.EnumNetworkDrives();
var oPrinters=nt.EnumPrinterConnections();
txt.WriteLine("Network drive mappings:");
for(var i=0;i<oDrives.length;i+=2)
txt.WriteLine("Drive【"+oDrives.item(i)+"】="+
oDrives.item(i+1));
txt.WriteLine("=====================================");
txt.WriteLine("Network printer mappings:");
for(var i=0;i<oPrinters.length;i+=2)
txt.WriteLine("Port【"+oPrinters.item(i)+"】="+
oPrinters.item(i+1));
txt.WriteLine("=====================================");
txt.Close();
ws.Run("Notepad.exe Output.txt")
}
//-----------------------------------------------------
// window.onresize=function()
// {
// 此事件在HTA窗口的大小改变时发生
// alert("OnResize");
// }
// window.onscroll=function()
// {
// 此事件在对HTA窗口执行滚动操作时发生
// alert("OnScroll");
// }
//=====================================================
</Script>
<Body>
<table width="100%" border="1">
<col />
<col width="16%" />
<col width="46%" />
<tr>
<th>选择事件</th>
<th>属性</th>
<th>设置值</th>
</tr>
<tr>
<td><input type="checkbox" id="window_onafterprint">window.onafterprint</td>
<td align="right">applicationName: </td>
<td><input type="text" id="applicationName"></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onbeforeprint">window.onbeforeprint</td>
<td align="right">border: </td>
<td><select id="border">
<option value="Dialog">Dialog</option>
<option value="None">None</option>
<option value="Thick">Thick</option>
<option value="Thin">Thin</option>
</select></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onbeforeunload">window.onbeforeunload</td>
<td align="right">borderStyle: </td>
<td><select id="borderStyle">
<option value="Normal">Normal</option>
<option value="Complex">Complex</option>
<option value="Raised">Raised</option>
<option value="Static">Static</option>
<option value="Sunken">Sunken</option>
</select></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onblur">window.onblur</td>
<td align="right">caption: </td>
<td><input type="checkbox" id="caption" checked="true">show title bar?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onerror">window.onerror</td>
<td align="right">contextMenu: </td>
<td><input type="checkbox" id="contextMenu" checked="true">show contextMenu?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onfocus">window.onfocus</td>
<td align="right">icon: </td>
<td><input type="file" id="icon"></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onhelp">window.onhelp</td>
<td align="right">id: </td>
<td><input type="text" id="id"></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onload" checked="true">window.onload</td>
<td align="right">innerBorder: </td>
<td><input type="checkbox" id="innerBorder" checked="true">show inner border?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onresize">window.onresize</td>
<td align="right">navigable: </td>
<td><input type="checkbox" id="navigable" checked="true">navigate pages in current page?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onscroll">window.onscroll</td>
<td align="right">maximizeButton: </td>
<td><input type="checkbox" id="maximizeButton" checked="true">show maximize button?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onunload">window.onunload</td>
<td align="right">minimizeButton: </td>
<td><input type="checkbox" id="minimizeButton" checked="true">show minimize button?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">left: </td>
<td><input type="text" id="left" disabled="true" value="0"></td>
</tr>
</table>
</td>
<td align="right">scroll: </td>
<td><input type="checkbox" id="scroll" checked="true">show scroll?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">top: </td>
<td><input type="text" id="top" disabled="true" value="0"></td>
</tr>
</table>
</td>
<td align="right">scrollFlat: </td>
<td><input type="checkbox" id="scrollFlat" checked="true">show scroll in flat?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">width: </td>
<td><input type="text" id="width" value="0"></td>
</tr>
</table>
</td>
<td align="right">selection: </td>
<td><input type="checkbox" id="selection" checked="true">allow user to select the page elements?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">height: </td>
<td><input type="text" id="height" value="0"></td>
</tr>
</table>
</td>
<td align="right">showInTaskbar: </td>
<td><input type="checkbox" id="showInTaskbar" checked="true">show in taskbar?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">center: </td>
<td><input type="checkbox" id="center" checked="true" onclick="center_clicked()">center screen?</td>
</tr>
</table>
</td>
<td align="right">singleInstance: </td>
<td><input type="checkbox" id="singleInstance">run as a single instance application?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">language: </td>
<td><select id="language">
<option value="JavaScript">JavaScript</option>
<option value="VBScript">VBScript</option>
</select></td>
</tr>
</table>
</td>
<td align="right">sysMenu: </td>
<td><input type="checkbox" id="sysMenu" checked="true">show system menu?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">commandLine: </td>
<td><input type="checkbox" id="commandLine">Receive arguments?</td>
</tr>
</table>
</td>
<td align="right">version: </td>
<td><input type="text" id="version" value="1.0"></td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">title: </td>
<td><input type="text" id="title"></td>
</tr>
</table>
</td>
<td align="right">windowState: </td>
<td><select id="windowState">
<option value="Normal">Normal</option>
<option value="Minimize">Minimize</option>
<option value="Maximize">Maximize</option>
</select></td>
</tr>
</table>
<center>
<input type="button" id="btnOk" value=" Ok " onclick="btnOk_clicked()">
<input type="button" id="btnCancel" value="Cancel" onclick="btnCancel_clicked()">
</center>
</Body>
</Html>

[2]VBS版本

 <Html>
<Head>
<Title>HTA Test</Title>
<HTA:APPLICATION
applicationName="HTA_Test"
border="Thick"
borderStyle="Raized"
caption="Yes"
contextMenu="No"
icon="E:\文档\图标\Unclassified ICO\2WAY.ICO"
id="Test"
innerBoder="Yes"
navigable="Yes"
maximizeButton="No"
minimizeButton="No"
scroll="Yes"
scrollFlat="Yes"
selection="Yes"
showInTaskbar="Yes"
singleInstance="No"
sysMenu="Yes"
version="1.0"
windowState="Normal" />
</Head>
<Script language="VBScript">
'=====================================================
'HTA是HTML Application的缩写(HTML应用程序),直接将HTML
'保存成HTA的格式,就成了一个独立的应用软件,也可以嵌入
'<HTA:APPLICATION>元素来增强对该应用程序的控制
'=====================================================
'以下是<HTA:APPLICATION>元素可用属性,可用来设置HTA窗口
'的各种细节【记住HTA:APPLICATION这个APPLICATION不可少,
'且这里必须全大写,否则以下属性无效】
'【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 最大化
'=====================================================
'参见Microsoft HTML Object Library库
'1.以下事件是可以正常发生的,参见HTMLWindow2这个类的事件成
' 员【它们以on为前缀】,有事件图标标识的事件成员都可以被
' HTA宿主程序捕获到该事件的消息,其它的以on为前缀的事件成
' 员无法被捕获到。
'2.可以通过IHTMLWindow2接口定义的其它方法属性来操纵HTA程序
' 的窗口。
'3.HTA中仍然可以使用Scripting.FileSystemObject对象来对文件
' 系统进行读写操作,可利用Window_OnUnload事件来收集HTA表单
' 的数据,记录为文本,方便常规的VBS脚本程序通过GUI界面来进
' 行交互,提升交互体验与使用的方便性。
'4.HTA中脚本宿主对象WScript/WshArguments/WshNamed/WshUnnamed
' 对象是无法使用的,其它的如WshShell/WshEnvironment/
' WshShortcut/WshSpecialFolders/WshUrlShortcut/WshNetwork
' 对象等依然可用
'-----------------------------------------------------
'HTA窗口的打印控制事件
'Sub Window_OnAfterPrint
'此事件在HTA窗口的打印工作完成之后发生
' MsgBox "OnAfterPrint"
'End Sub
'Sub Window_OnBeforePrint
'此事件在HTA窗口的打印工作开始之前发生
' MsgBox "OnBeforePrint"
'End Sub
'-----------------------------------------------------
'Sub Window_OnBlur
'此事件在将键盘焦点从HTA窗口移开时发生
' MsgBox "OnBlur"
'End Sub
'Sub Window_OnError
'此事件在HTA程序出现错误时发生
' MsgBox "OnError"
'End Sub
'Sub Window_OnFocus
'此事件在HTA窗口获得焦点时发生
' MsgBox "OnFocus"
'End Sub
'Sub Window_OnHelp
'此事件在HTA窗口有焦点时按下F1帮助键时发生
' MsgBox "OnHelp"
'End Sub
'-----------------------------------------------------
'HTA窗口的加载与销毁事件
Function GetCmdArgs(cmdArgs)
'本函数解析命令行参数
'1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
'2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
'3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
' 最后的那个参数的左引号当重新认定为内容,而非边界
'4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
'5.防止命令行参数最后有多个无意义空格的情况
Dim args(),isComplete,c,args2,i,index
isComplete=True
ReDim args()
For i= To Len(cmdArgs)
c=Mid(cmdargs,i,)
If c=Chr() Then
If isComplete Then
If i= Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i-,)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
Else
If i=Len(cmdArgs) Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i+,)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
End If
Else
If c=" " And isComplete=True Then
If args(UBound(args))<>"" Then
ReDim Preserve args(UBound(args)+)
End If
Else
args(UBound(args))=args(UBound(args))+c
End if
End If
Next
If isComplete=False Then
args(UBound(args))=Chr()+args(UBound(args))
If InStr(args(UBound(args))," ")<> Then
args2=Split(args(UBound(args)))
index=UBound(args)
ReDim Preserve args(UBound(args2)+index)
For i=index To UBound(args2)+index
args(i)=args2(i-index)
Next
End If
End If
If args(UBound(args))="" Then
ReDim Preserve args(UBound(args)-)
End If
GetCmdArgs=args
End Function Sub Window_OnLoad
'此事件在HTA窗口被成功加载后发生
Dim width,height
width=:height=
self.ResizeTo width,height
self.MoveTo (self.screen.AvailWidth-width)/, _
(self.screen.AvailHeight-height)/
MsgBox "OnLoad"
'让我们来看看本程序接收到哪些命令行参数
Dim item
MsgBox "Test.commandLine: " & Test.commandLine
For Each item In GetCmdArgs(Test.commandLine)
MsgBox item
Next
End Sub
'Sub Window_OnBeforeUnload
' 此事件在HTA窗口被销毁前发生
' MsgBox "OnBeforeUnload"
'End Sub
Sub Window_OnUnload
'此事件在HTA窗口被销毁时发生
MsgBox "OnUnload"
Set ws=CreateObject("WScript.Shell")
'-------------------------------------
dPath=ws.SpecialFolders("Desktop")
pPath=ws.SpecialFolders("Programs")
'-------------------------------------
Set sc=ws.CreateShortcut(dPath & "\所有程序.lnk")
sc.TargetPath=pPath
sc.WindowStyle=
sc.Hotkey="Ctrl+Alt+j"
sc.save
'-------------------------------------
Set sc=ws.CreateShortcut(dPath & "\百度.url")
sc.TargetPath="http:'www.baidu.com"
sc.save
'-------------------------------------
Set fso=CreateObject("Scripting.FileSystemObject")
Set txt=fso.CreateTextFile("Output.txt")
Set nt = CreateObject("WScript.Network")
txt.WriteLine "Domain = " & nt.UserDomain
txt.WriteLine "Computer Name = " & nt.ComputerName
txt.WriteLine "User Name = " & nt.UserName
txt.WriteLine "====================================="
Set oDrives = nt.EnumNetworkDrives
Set oPrinters = nt.EnumPrinterConnections
txt.WriteLine "Network drive mappings:"
For i = to oDrives.Count - Step
txt.WriteLine "Drive 【" & oDrives.Item(i) & "】 = " & oDrives.Item(i+)
Next
txt.WriteLine "====================================="
txt.WriteLine "Network printer mappings:"
For i = to oPrinters.Count - Step
txt.WriteLine "Port 【" & oPrinters.Item(i) & "】 = " & oPrinters.Item(i+)
Next
txt.WriteLine "====================================="
txt.Close
ws.Run "Notepad.exe Output.txt"
End Sub
'-----------------------------------------------------
'Sub Window_OnResize
'此事件在HTA窗口的大小改变时发生
' MsgBox "OnResize"
'End Sub
'Sub Window_OnScroll
'此事件在对HTA窗口执行滚动操作时发生
' MsgBox "OnScroll"
'End Sub
'=====================================================
</Script>
<Body bgcolor="green">
</Body>
</Html>

7.JS版HTACreater

 <html>
<head>
<title>HTA Settings</title>
<HTA:APPLICATION
applicationName="HTACreater"
border="Dialog"
borderStyle="Raized"
caption="Yes"
contextMenu="Yes"
icon="E:\文档\图标\Ico图标大全\ico图标\VB_ICO图标\wrench.ico"
id="Creater"
innerBoder="Yes"
navigable="Yes"
maximizeButton="No"
minimizeButton="No"
scroll="No"
scrollFlat="Yes"
selection="Yes"
showInTaskbar="Yes"
singleInstance="No"
sysMenu="Yes"
version="1.0"
windowState="Normal" />
<script language="VBScript">
Function GetCmdArgs(cmdArgs)
'本函数解析命令行参数
'1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
'2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
'3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
' 最后的那个参数的左引号当重新认定为内容,而非边界
'4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
'5.防止命令行参数最后有多个无意义空格的情况
Dim args(),isComplete,c,args2,i,index
isComplete=True
ReDim args(0)
For i=1 To Len(cmdArgs)
c=Mid(cmdargs,i,1)
If c=Chr(34) Then
If isComplete Then
If i=1 Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i-1,1)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
Else
If i=Len(cmdArgs) Then
isComplete=Not isComplete
Else
If Mid(cmdArgs,i+1,1)=" " Then
isComplete=Not isComplete
Else
args(UBound(args))=args(UBound(args))+c
End If
End If
End If
Else
If c=" " And isComplete=True Then
If args(UBound(args))<>"" Then
ReDim Preserve args(UBound(args)+1)
End If
Else
args(UBound(args))=args(UBound(args))+c
End if
End If
Next
If isComplete=False Then
args(UBound(args))=Chr(34)+args(UBound(args))
If InStr(args(UBound(args))," ")<>0 Then
args2=Split(args(UBound(args)))
index=UBound(args)
ReDim Preserve args(UBound(args2)+index)
For i=index To UBound(args2)+index
args(i)=args2(i-index)
Next
End If
End If
If args(UBound(args))="" Then
ReDim Preserve args(UBound(args)-1)
End If
GetCmdArgs=args
End Function
</script>
<script language="JavaScript">
var es,values;
var ws=new ActiveXObject("WScript.Shell");
var fso=new ActiveXObject("Scripting.FileSystemObject"); function GetCmdArgs(cmdArgs)
{
//本函数解析命令行参数
//1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
//2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
//3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
// 最后的那个参数的左引号当重新认定为内容,而非边界
//4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
//5.防止命令行参数最后有多个无意义空格的情况
var args=new Array(''),isComplete=true;
for(var i=0;i<cmdArgs.length;i++)
{
var c=cmdArgs.charAt(i);
if(c=='"')
if(isComplete)
if(i==0)
isComplete=!isComplete;
else
if(cmdArgs.charAt(i-1)==" ")
isComplete=!isComplete;
else
args[args.length-1]+=c;
else
if(i==cmdArgs.length-1)
isComplete=!isComplete;
else
if(cmdArgs.charAt(i+1)==" ")
isComplete=!isComplete;
else
args[args.length-1]+=c; else
if(c==" "&&isComplete&&args[args.length-1]!="")
args.push('');
else
args[args.length-1]+=c;
}
if(!isComplete)
{
var arg='"'+args.pop();
if(arg.indexOf(" ")!=-1)
args=args.concat(arg.split(" "));
}
if(args[args.length-1]=="")
args.pop();
return args
} function isGoodVarName(name){
var arr=name.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/g);
if(arr!=null&&arr.length==1)
return true;
else
return false;
} function isNumberStr(numStr){
try{num=eval('new Number('+numStr+')');}
catch(e){return false;}
return true;
} function center_clicked(){
var e=self.document.getElementById('left');
e.disabled=!e.disabled;
var e=self.document.getElementById('top');
e.disabled=!e.disabled;
} function getHta(){
var xml=new ActiveXObject("MSXML2.DOMDocument");
var eHta=xml.createElement('HTA:APPLICATION');
var names=('applicationName;border;borderStyle;caption;contextMenu;'+
'icon;id;innerBorder;navigable;maximizeButton;minimizeButton;'+
'scroll;scrollFlat;selection;showInTaskbar;singleInstance;'+
'sysMenu;version;windowState').split(";");
for(var i=0;i<names.length;i++)
eHta.setAttribute(names[i],values.Item(names[i]));
var htaSettingsStr=eHta.xml;
htaSettingsStr=htaSettingsStr.replace(/(\") (\w)/ig,'$1\r\n $2');
htaSettingsStr=htaSettingsStr.replace(/(\w) (\w+=\")/ig,'$1\r\n $2');
return htaSettingsStr;
} function btnOk_clicked(){
es=new Elements();
values=new ActiveXObject("Scripting.Dictionary");
//get all values
for(var i in es)
if(i!='getValue')
values.Add(i,es.getValue(es[i]));
//check values
//check 'id'
var value=values.Item('id');
if(values.Item('commandLine')=='Yes'&&value==''&&!isGoodVarName(value)){
alert('The value of "id" must be a good varname when the commandLine is required!!!');
return;
}
//check 'left','top','width','height'
var names=new Array('left','top','width','height');
for(var i=0;i<names.length;i++){
var name=names[i];
if(values.Item('center')=='Yes')
if(name=='left'||name=='top')
continue;
value=values.Item(name);
if(isNumberStr(value)){
values.Item(name)=eval('new Number('+value+')');
value=values.Item(name);
var maxValue=eval('self.window.screen.'+name);
if(value>maxValue||value<0){
alert("The value of '"+name+"' must be 0-"+maxValue);
return;
}
}
else{
alert("The value of '"+name+"' is not a number string.");
return;
}
}
//htaPath
var htaPath;
do{
htaPath=fso.GetAbsolutePathName(fso.GetBaseName(fso.GetTempName())+'.hta');
}while(fso.FileExists(htaPath));
//start to write the hta file
var txt=fso.CreateTextFile(htaPath);
txt.WriteLine('<html>\r\n<head>\r\n<title>'+values.Item('title')+'</title>');
txt.WriteLine(getHta());
txt.WriteLine('<script language="'+values.Item('language')+'">');
if(values.Item('language')=='JavaScript'){
if(values.Item('commandLine')=='Yes'){
txt.WriteLine(GetCmdArgs);
txt.WriteLine('');
} if(values.Item('center')=='Yes'){
var width=values.Item('width'),height=values.Item('height');
if(width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo('+width+','+height+');');
txt.WriteLine('self.moveTo((self.screen.width-'+width+
')/2,(self.screen.height-'+height+')/2);\r\n');
}
}
else{
var left=values.Item('left'),top=values.Item('top');
var width=values.Item('width'),height=values.Item('height');
if(left!=0&&top!=0&&width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo('+width+','+height+');');
txt.WriteLine('self.moveTo('+left+','+top+');\r\n');
}
}
for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){
name=e.item();
if(name.indexOf('window')==0&&values.Item(name)=='Yes'){
name=name.replace('_','.');
txt.WriteLine(name+'=function(){\r\n \r\n}\r\n');
}
}
}
else{
if(values.Item('commandLine')=='Yes'){
var stream=fso.OpenTextFile(GetCmdArgs(Creater.commandLine)[0]);
for(var i=1;i<=85;i++)
if(i<25)
stream.SkipLine();
else
txt.WriteLine(stream.ReadLine());
stream.Close();
txt.WriteLine('');
}
if(values.Item('center')=='Yes'){
var width=values.Item('width'),height=values.Item('height');
if(width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo '+width+','+height);
txt.WriteLine('self.moveTo (self.screen.width-'+width+
')/2,(self.screen.height-'+height+')/2\r\n');
}
}
else{
var left=values.Item('left'),top=values.Item('top');
var width=values.Item('width'),height=values.Item('height');
if(left!=0&&top!=0&&width!=0&&height!=0){
txt.WriteLine('\r\nself.resizeTo '+width+','+height);
txt.WriteLine('self.moveTo '+left+','+top);
txt.WriteLine('');
}
}
for(var e=new Enumerator(values);!e.atEnd();e.moveNext()){
name=e.item();
if(name.indexOf('window')==0&&values.Item(name)=='Yes'){
txt.WriteLine('Sub '+name+'\r\n \r\nEnd Sub\r\n');
}
}
}
txt.WriteLine('<\/script>');
txt.WriteLine('</head>\r\n<body>\r\n</body>\r\n</html>');
txt.Close();
self.close();
} function btnCancel_clicked(){
var btn=ws.Popup("The settings will be gave up, a"+
"re you sure?",0,"Warnning",4+32);
if(btn==6)
self.close();
} function Elements(){
this.getValue=function(e){
switch(e.type){
case "checkbox":
return e.checked?'Yes':'No';
case "text":
case "file":
return e.value;
case "select-one":
case "select-multiple":
index=e.selectedIndex
return e.options[index].text;
default:
throw new Error(5001,"The element '"+e.id+"' is not the right type.");
}
}
for(var i=0;i<self.document.all.length;i++){
var el=self.document.all[i];
if(el.id!=''&&typeof el.type!='undefined'&&el.type!='button')
eval('this.'+el.id+'=el');
}
} window.onload=function(){
var width=800,height=685;
self.resizeTo(width,height);
self.moveTo((self.screen.width-width)/2,
(self.screen.height-height)/2);
}
</script>
</head>
<body>
<table width="100%" border="1">
<col />
<col width="16%" />
<col width="46%" />
<tr>
<th>选择事件</th>
<th>属性</th>
<th>设置值</th>
</tr>
<tr>
<td><input type="checkbox" id="window_onafterprint">window.onafterprint</td>
<td align="right">applicationName: </td>
<td><input type="text" id="applicationName"></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onbeforeprint">window.onbeforeprint</td>
<td align="right">border: </td>
<td><select id="border">
<option value="Dialog">Dialog</option>
<option value="None">None</option>
<option value="Thick">Thick</option>
<option value="Thin">Thin</option>
</select></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onbeforeunload">window.onbeforeunload</td>
<td align="right">borderStyle: </td>
<td><select id="borderStyle">
<option value="Normal">Normal</option>
<option value="Complex">Complex</option>
<option value="Raised">Raised</option>
<option value="Static">Static</option>
<option value="Sunken">Sunken</option>
</select></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onblur">window.onblur</td>
<td align="right">caption: </td>
<td><input type="checkbox" id="caption" checked="true">show title bar?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onerror">window.onerror</td>
<td align="right">contextMenu: </td>
<td><input type="checkbox" id="contextMenu" checked="true">show contextMenu?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onfocus">window.onfocus</td>
<td align="right">icon: </td>
<td><input type="file" id="icon"></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onhelp">window.onhelp</td>
<td align="right">id: </td>
<td><input type="text" id="id"></td>
</tr>
<tr>
<td><input type="checkbox" id="window_onload" checked="true">window.onload</td>
<td align="right">innerBorder: </td>
<td><input type="checkbox" id="innerBorder" checked="true">show inner border?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onresize">window.onresize</td>
<td align="right">navigable: </td>
<td><input type="checkbox" id="navigable" checked="true">navigate pages in current page?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onscroll">window.onscroll</td>
<td align="right">maximizeButton: </td>
<td><input type="checkbox" id="maximizeButton" checked="true">show maximize button?</td>
</tr>
<tr>
<td><input type="checkbox" id="window_onunload">window.onunload</td>
<td align="right">minimizeButton: </td>
<td><input type="checkbox" id="minimizeButton" checked="true">show minimize button?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">left: </td>
<td><input type="text" id="left" disabled="true" value="0"></td>
</tr>
</table>
</td>
<td align="right">scroll: </td>
<td><input type="checkbox" id="scroll" checked="true">show scroll?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">top: </td>
<td><input type="text" id="top" disabled="true" value="0"></td>
</tr>
</table>
</td>
<td align="right">scrollFlat: </td>
<td><input type="checkbox" id="scrollFlat" checked="true">show scroll in flat?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">width: </td>
<td><input type="text" id="width" value="0"></td>
</tr>
</table>
</td>
<td align="right">selection: </td>
<td><input type="checkbox" id="selection" checked="true">allow user to select the page elements?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">height: </td>
<td><input type="text" id="height" value="0"></td>
</tr>
</table>
</td>
<td align="right">showInTaskbar: </td>
<td><input type="checkbox" id="showInTaskbar" checked="true">show in taskbar?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">center: </td>
<td><input type="checkbox" id="center" checked="true" onclick="center_clicked()">center screen?</td>
</tr>
</table>
</td>
<td align="right">singleInstance: </td>
<td><input type="checkbox" id="singleInstance">run as a single instance application?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">language: </td>
<td><select id="language">
<option value="JavaScript">JavaScript</option>
<option value="VBScript">VBScript</option>
</select></td>
</tr>
</table>
</td>
<td align="right">sysMenu: </td>
<td><input type="checkbox" id="sysMenu" checked="true">show system menu?</td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">commandLine: </td>
<td><input type="checkbox" id="commandLine">Receive arguments?</td>
</tr>
</table>
</td>
<td align="right">version: </td>
<td><input type="text" id="version" value="1.0"></td>
</tr>
<tr>
<td>
<table width="100%">
<col width="38%" />
<col />
<tr>
<td align="right">title: </td>
<td><input type="text" id="title"></td>
</tr>
</table>
</td>
<td align="right">windowState: </td>
<td><select id="windowState">
<option value="Normal">Normal</option>
<option value="Minimize">Minimize</option>
<option value="Maximize">Maximize</option>
</select></td>
</tr>
</table>
<center>
<input type="button" id="btnOk" value=" Ok " onclick="btnOk_clicked()">
<input type="button" id="btnCancel" value="Cancel" onclick="btnCancel_clicked()">
</center>
</body>
</html>

其执行界面:

aaarticlea/png;base64,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*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" alt="" />

上一篇:使用Java的嵌套循环打印出平行四边形、等腰三角形、棱形、矩形的星星图案(Java工程师面试必备)


下一篇:JAVA理解逻辑程序的书上全部重要的习题