用HTML界面來強化VBS和JS本地腳本的交互能力與友好性!!!
用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視窗是否顯示標題,預設值為Yes '6.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=>是否顯示最大化按鈕,預設值Yes '12.MinimizeButton:Yes/No=>是否顯示最小化按鈕,預設值Yes '13.Scroll:Yes/No=>是否顯示垂直滾動條,預設值是Yes '14.ScrollFlat:Yes/No=>設置滾動條是3D或者平面的 '15.Selection:Yes/No=>設置內容是否可以被滑鼠或鍵盤選中 '16.ShowInTaskbar:Yes/No=>是否在任務欄顯示任務圖標,預設值Yes '17.SingleInstance:Yes/No=>設置此HTA程式是否同時只能有一個 ' 運行實例【進程】,預設值No。當第二次啟動同一個HTA程式時, ' mshta.exe通過上面ApplicaitonName來區分是否名稱已占用 '18.SysMenu:Yes/No=>是否允許顯示標題欄右鍵菜單,預設值是Yes '19.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 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 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(<