首页 > Web开发 > 详细

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

时间:2016-01-16 16:27:00      阅读:333      评论:0      收藏:0      [点我收藏+]

用HTML界面来强化VBS和JS本地脚本的交互能力与友好性!!!【详见代码注释】

1.JScript版

  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="No"
 18   Selection="Yes"
 19   ShowInTaskbar="Yes"
 20   SingleInstance="No"
 21   SysMenu="Yes"
 22   Version="1.0" 
 23   WindowState="Normal" />
 24 </Head>
 25 <Script language="JScript">
 26 //=====================================================
 27 //HTA是HTML Application的缩写(HTML应用程序),直接将HTML
 28 //保存成HTA的格式,就成了一个独立的应用软件,也可以嵌入
 29 //<HTA:APPLICATION>元素来增强对该应用程序的控制
 30 //=====================================================
 31 //以下是<HTA:APPLICATION>元素可用属性,可用来设置HTA窗口
 32 //的各种细节:
 33 //1.记住HTA:APPLICATION这个APPLICATION不可少,且这里必须全
 34 //  大写,否则以下属性无效
 35 //2.ApplicationName:string=>设置HTA程序的名称,在
 36 //  SingleInstance属性设置为"Yes"时有用
 37 //3.Border:enum=>设置HTA窗口的边框类型,默认值Thick
 38 //  所有允许的值:    Thick    粗边框
 39 //                    Dialog    对话框【大小不可调整】
 40 //                    None    无边框【无标题栏】
 41 //                    Thin    窄边框
 42 //4.BorderSytle:enum=>设置HTA窗口的边框风格,默认值是Normal
 43 //  所有允许的值:    Normal    普通
 44 //                    Complex    凹凸格式组合边框
 45 //                    Raised    凸出的3D边框
 46 //                    Static    3D边框格式
 47 //                    Sunken    凹进的3D边框
 48 //5.Caption:Yes/No=>设置HTA窗口是否显示标题,默认值为Yes
 49 //6.CommandLine:string=>此属性保存了HTA程序的启动参数,参数可以
 50 //  在Script块中通过<Id>.CommandLine来引用,如本程序则是
 51 //  Test.CommandLine。它的各个参数之间以空格分隔;包含空格的
 52 //  参数请在调用时,用引号引起来,否则会被当成多个参数;第一个
 53 //  参数总是HTA程序的文件路径;其参数需要自己手动解析;因为这个
 54 //  属性的存在,你可以方便地使用VBS总调用各种HTA界面,而后通过
 55 //  Window_OnUnload来记录下结果,以方便总调程序获取HTA交互结果
 56 //7.ContextMenu:Yes/No=>是否显示右键上下文菜单
 57 //8.Icon:stirng=>设置应用程序的图标文件路径
 58 //9.InnerBorder:Yes/No=>是否显示内部边框的3D边界
 59 //10.Navigable:Yes/No=>是否在本窗口加载新Navigate的链接
 60 //11.MaximizeButton:Yes/No=>是否显示最大化按钮,默认值Yes
 61 //12.MinimizeButton:Yes/No=>是否显示最小化按钮,默认值Yes
 62 //13.Scroll:Yes/No=>是否显示垂直滚动条,默认值是Yes
 63 //14.ScrollFlat:Yes/No=>设置滚动条是3D或者平面的
 64 //15.Selection:Yes/No=>设置内容是否可以被鼠标或键盘选中
 65 //16.ShowInTaskbar:Yes/No=>是否在任务栏显示任务图标,默认值Yes
 66 //17.SingleInstance:Yes/No=>设置此HTA程序是否同时只能有一个
 67 //   运行实例【进程】,默认值No。当第二次启动同一个HTA程序时,
 68 //   mshta.exe通过上面ApplicaitonName来区分是否名称已占用
 69 //18.SysMenu:Yes/No=>是否允许显示标题栏右键菜单,默认值是Yes
 70 //19.Version:string=>设置应用程序的版本,如"1.0",默认值为""
 71 //20.WindowState:enum=>设置HTA窗口的显示类型,默认值为Normal
 72 //   所有允许的值:    Normal        常规
 73 //                    Minimize    最小化
 74 //                    Maximize    最大化
 75 //用js对以上所有属性进行只读访问时,一定要使用骆驼命名法
 76 //=====================================================
 77 //参见Microsoft HTML Object Library库
 78 //1.以下事件是可以正常发生的,参见HTMLWindow2这个类的事件成
 79 //  员【它们以on为前缀】,有事件图标标识的事件成员都可以被
 80 //  HTA宿主程序捕获到该事件的消息,其它的以on为前缀的事件成
 81 //  员无法被捕获到。
 82 //2.可以通过IHTMLWindow2接口定义的其它方法属性来操纵HTA程序
 83 //  的窗口。
 84 //3.HTA中仍然可以使用Scripting.FileSystemObject对象来对文件
 85 //  系统进行读写操作,可利用Window_OnUnload事件来收集HTA表单
 86 //  的数据,记录为文本,方便常规的VBS脚本程序通过GUI界面来进
 87 //  行交互,提升交互体验与使用的方便性。
 88 //4.HTA中脚本宿主对象WScript/WshArguments/WshNamed/WshUnnamed
 89 //  对象是无法使用的,其它的如WshShell/WshEnvironment/
 90 //  WshShortcut/WshSpecialFolders/WshUrlShortcut/WshNetwork
 91 //  对象等依然可用
 92 //5.HTA窗口程序的每一个事件成员可以有一个IHTMLEventObj类型
 93 //  的参数,参数的type属性会包含事件名称字符串,是只读的
 94 //-----------------------------------------------------
 95 //HTA窗口的打印控制事件
 96 // window.onafterprint=function()
 97 // {
 98 //    此事件在HTA窗口的打印工作完成之后发生
 99     // alert("OnAfterPrint");
100 // }
101 // window.onbeforeprint=function()
102 // {
103 //    此事件在HTA窗口的打印工作开始之前发生
104     // alert("OnBeforePrint");
105 // }
106 //-----------------------------------------------------
107 // window.onblur=function()
108 // {
109 //    此事件在将键盘焦点从HTA窗口移开时发生
110     // alert("OnBlur");
111 // }
112 // window.onerror=function()
113 // {
114 //    此事件在HTA程序出现错误时发生
115     // alert("OnError");
116 // }
117 // window.onfocus=function()
118 // {
119 //    此事件在HTA窗口获得焦点时发生
120     // alert("OnFocus");
121 // }
122 // window.onhelp=function()
123 // {
124 //    此事件在HTA窗口有焦点时按下F1帮助键时发生
125     // alert("OnHelp");
126 // }
127 //-----------------------------------------------------
128 //HTA窗口的加载与销毁事件
129 function GetArgs(cmdArgs)
130 {
131 //本函数解析命令行参数
132 //1.左引号前面必须是空格,否则引号应视作参数内容,而非边界
133 //2.右引号后面必须是空格,否则引号应视作参数内容,而非边界
134 //3.最后面的那个参数,如果引号边界没有配对,即无右引号,那么
135 //  最后的那个参数的左引号当重新认定为内容,而非边界
136 //4.多个空格间隔两个参数,防止后面的空格间隔符被归入内容中
137 //5.防止命令行参数最后有多个无意义空格的情况
138     var args=new Array(‘‘),isComplete=true
139     for(var i=0;i<cmdArgs.length;i++)
140     {
141         var c=cmdArgs.charAt(i);
142         if(c==‘"‘)
143             if(isComplete)
144                 if(i==0)
145                     isComplete=!isComplete;
146                 else
147                     if(cmdArgs.charAt(i-1)==" ")
148                         isComplete=!isComplete;
149                     else
150                         args[args.length-1]+=c;
151             else 
152                 if(i==cmdArgs.length-1)
153                     isComplete=!isComplete;
154                 else
155                     if(cmdArgs.charAt(i+1)==" ")
156                         isComplete=!isComplete;
157                     else
158                         args[args.length-1]+=c;
159 
160         else
161             if(c==" "&&isComplete&&args[args.length-1]!="")
162                 args.push(‘‘)
163             else
164                 args[args.length-1]+=c;
165     }
166     if(!isComplete)
167     {
168         var arg=‘"‘+args.pop();
169         if(arg.indexOf(" ")!=-1)
170             args=args.concat(arg.split(" "));
171     }
172     if(args[args.length-1]=="")
173         args.pop();
174     return args
175 }
176 window.onload=function()
177 {
178     //此事件在HTA窗口被成功加载后发生
179     var width=300,height=300
180     this.resizeTo(width,height);
181     this.moveTo((this.screen.availWidth-width)/2,
182         (this.screen.availHeight-height)/2);
183     alert("OnLoad");
184     //让我们来看看本程序接收到哪些命令行参数
185     //你可以命令行执行HTATest.hta "hello world" 32
186     alert("Test.CommandLine: "+Test.commandLine);
187     alert("ApplicationName = "+Test.applicationName);
188     //其它属性也可只读访问,切记使用Id名来引用各个属性
189     var args=GetArgs(Test.commandLine);
190     for(var i=0;i<args.length;i++) 
191         alert(args[i]);
192 }
193 // window.onbeforeunload=function()
194 // {
195 //    此事件在HTA窗口被销毁前发生
196     // alert("OnBeforeUnload" );
197 // }
198 window.onunload=function()
199 {
200     //此事件在HTA窗口被销毁时发生,切记alert不再可用
201     var ws=new ActiveXObject("WScript.Shell")
202     ws.Popup("OnUnload");
203     //-------------------------------------
204     dPath=ws.SpecialFolders("Desktop")
205     pPath=ws.SpecialFolders("Programs")
206     //-------------------------------------
207     var sc=ws.CreateShortcut(dPath+"\\Programs.lnk")
208     sc.TargetPath=pPath
209     sc.WindowStyle=3
210     sc.Hotkey="Ctrl+Alt+j"
211     sc.Save();
212     //-------------------------------------
213     var sc=ws.CreateShortcut(dPath+"\\baidu.url")
214     sc.TargetPath="http://www.baidu.com"
215     sc.Save();
216     //-------------------------------------
217     var fso=new ActiveXObject("Scripting.FileSystemObject")
218     var txt=fso.CreateTextFile("Output.txt")
219     var nt=new ActiveXObject("WScript.Network")
220     txt.WriteLine("Domain = "+nt.UserDomain);
221     txt.WriteLine("Computer Name = "+nt.ComputerName);
222     txt.WriteLine("User Name = " + nt.UserName );
223     txt.WriteLine("=====================================");
224     var oDrives=nt.EnumNetworkDrives();
225     var oPrinters=nt.EnumPrinterConnections();
226     txt.WriteLine("Network drive mappings:");
227     for(var i=0;i<oDrives.length;i+=2)
228         txt.WriteLine("Drive【"+oDrives.item(i)+"】="+
229             oDrives.item(i+1));
230     txt.WriteLine("=====================================");
231     txt.WriteLine("Network printer mappings:");
232     for(var i=0;i<oPrinters.length;i+=2)
233         txt.WriteLine("Port【"+oPrinters.item(i)+"】="+
234             oPrinters.item(i+1));
235     txt.WriteLine("=====================================");
236     txt.Close();
237     ws.Run("Notepad.exe Output.txt")
238 }
239 //-----------------------------------------------------
240 // window.onresize=function()
241 // {
242 //    此事件在HTA窗口的大小改变时发生
243     // alert("OnResize");
244 // }
245 // window.onscroll=function() 
246 // {
247 //    此事件在对HTA窗口执行滚动操作时发生
248     // alert("OnScroll");
249 // }
250 //=====================================================
251 </Script>
252 <Body bgcolor="green">
253 </Body>
254 </Html>

2.VBScript版

<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="No"
  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窗口的各种细节:1.记住HTA:APPLICATION这个APPLICATION不可少,且这里必须全  大写,否则以下属性无效2.ApplicationName:string=>设置HTA程序的名称,在  SingleInstance属性设置为"Yes"时有用3.Border:enum=>设置HTA窗口的边框类型,默认值Thick  所有允许的值:    Thick    粗边框                    Dialog    对话框【大小不可调整】                    None    无边框【无标题栏】                    Thin    窄边框4.BorderSytle:enum=>设置HTA窗口的边框风格,默认值是Normal  所有允许的值:    Normal    普通                    Complex    凹凸格式组合边框                    Raised    凸出的3D边框                    Static    3D边框格式                    Sunken    凹进的3D边框5.Caption:Yes/No=>设置HTA窗口是否显示标题,默认值为Yes6.CommandLine:string=>此属性保存了HTA程序的启动参数,参数可以  在Script块中通过<Id>.CommandLine来引用,如本程序则是  Test.CommandLine。它的各个参数之间以空格分隔;包含空格的  参数请在调用时,用引号引起来,否则会被当成多个参数;第一个  参数总是HTA程序的文件路径;其参数需要自己手动解析;因为这个  属性的存在,你可以方便地使用VBS总调用各种HTA界面,而后通过  Window_OnUnload来记录下结果,以方便总调程序获取HTA交互结果7.ContextMenu:Yes/No=>是否显示右键上下文菜单8.Icon:stirng=>设置应用程序的图标文件路径9.InnerBorder:Yes/No=>是否显示内部边框的3D边界10.Navigable:Yes/No=>是否在本窗口加载新Navigate的链接11.MaximizeButton:Yes/No=>是否显示最大化按钮,默认值Yes12.MinimizeButton:Yes/No=>是否显示最小化按钮,默认值Yes13.Scroll:Yes/No=>是否显示垂直滚动条,默认值是Yes14.ScrollFlat:Yes/No=>设置滚动条是3D或者平面的15.Selection:Yes/No=>设置内容是否可以被鼠标或键盘选中16.ShowInTaskbar:Yes/No=>是否在任务栏显示任务图标,默认值Yes17.SingleInstance:Yes/No=>设置此HTA程序是否同时只能有一个   运行实例【进程】,默认值No。当第二次启动同一个HTA程序时,   mshta.exe通过上面ApplicaitonName来区分是否名称已占用18.SysMenu:Yes/No=>是否允许显示标题栏右键菜单,默认值是Yes19.Version:string=>设置应用程序的版本,如"1.0",默认值为""20.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  对象等依然可用5.HTA窗口程序的每一个事件成员可以有一个IHTMLEventObj类型  的参数,参数的type属性会包含事件名称字符串,是只读的-----------------------------------------------------HTA窗口的打印控制事件Sub Window_OnAfterPrint
    此事件在HTA窗口的打印工作完成之后发生    MsgBox "OnAfterPrint"End SubSub Window_OnBeforePrint
    此事件在HTA窗口的打印工作开始之前发生    MsgBox "OnBeforePrint"End Sub-----------------------------------------------------Sub Window_OnBlur
    此事件在将键盘焦点从HTA窗口移开时发生    MsgBox "OnBlur"End SubSub Window_OnError
    此事件在HTA程序出现错误时发生    MsgBox "OnError"End SubSub Window_OnFocus
    此事件在HTA窗口获得焦点时发生    MsgBox "OnFocus"End SubSub Window_OnHelp
    此事件在HTA窗口有焦点时按下F1帮助键时发生    MsgBox "OnHelp"End Sub-----------------------------------------------------HTA窗口的加载与销毁事件
Function GetArgs(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
    GetArgs=args
End Function

Sub Window_OnLoad
    此事件在HTA窗口被成功加载后发生
    Dim width,height
    width=300:height=300
    Me.ResizeTo width,height
    Me.MoveTo (Me.screen.AvailWidth-width)/2, _
        (Me.screen.AvailHeight-height)/2
    MsgBox "OnLoad"
    让我们来看看本程序接收到哪些命令行参数
    Dim item
    MsgBox "Test.CommandLine: " & Test.CommandLine
    For Each item In GetArgs(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=3
    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 = 0 to oDrives.Count - 1 Step 2
        txt.WriteLine "Drive 【" & oDrives.Item(i) & "】 = " & oDrives.Item(i+1)
    Next
    txt.WriteLine "====================================="
    txt.WriteLine "Network printer mappings:"
    For i = 0 to oPrinters.Count - 1 Step 2
        txt.WriteLine "Port 【" & oPrinters.Item(i) & "】 = " & oPrinters.Item(i+1)
    Next
    txt.WriteLine "====================================="
    txt.Close
    ws.Run "Notepad.exe Output.txt"
End Sub
-----------------------------------------------------Sub Window_OnResize
    此事件在HTA窗口的大小改变时发生    MsgBox "OnResize"End SubSub Window_OnScroll
    此事件在对HTA窗口执行滚动操作时发生    MsgBox "OnScroll"End Sub=====================================================
</Script>
<Body bgcolor="green">
</Body>
</Html>

 

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

原文:http://www.cnblogs.com/vitrox/p/5135642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!