引用 | 編輯
n3ph223172
2011-08-08 21:18 |
樓主
▼ |
||
|
引用 | 編輯
ebolaman
2011-08-09 14:53 |
3樓
▲ ▼ |
||||||||||
研究了一下 CSO 的啟動器發現
他是以網頁的形式來放置按鈕等控制項 但是 HTML 有 onclick="external.Close" 的用法我就不知道 這要怎麼和程式本身整合 目前用了一個很笨的方法,是讓 a href 去連結 "Close", "Start", "Exit" 等字,讓 程式中的 Web_Browser1_Navigated 觸發並判斷連結 但是之後還要用 WebBrowser1.GoBack() 至於讀取條(Progress Bar) 的部分,只要把 圖片延長,用個函數即可 其他部分都可以用 Image 來覆蓋,這樣能解決 WebBrowser 無法與 VB.Net 整合的問題 (或是另有其他辦法?) 這是目前稍微模擬出來的介面,請參考 事實上是用兩個 WebBrowser 當作主頁面 程式碼中的 繪圖程序目前等於是沒有作用的,假如以 Image 控制項去取代 WebBrowser 的話,只需把 wb_back 去除即可 底下的程式碼的資源檔是從 CSOLauncher 提取出來的文件,並稍加修改 複製程式 Public Class frm_main '---------- Local variables ---------- 'Files & Folders Dim dataDir As String = System.IO.Directory.GetCurrentDirectory & "\HTML\" 'Status Dim stat_check_obj_ind As Integer Dim stat_wb_complete As Integer 'Background Dim rndTyp As Integer 'Graphics Dim srcRect, dstRect As Rectangle Dim g As Graphics '---------- Local objects ---------- Dim WithEvents wb, wb_back As New WebBrowser Private Sub frm_main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '----- Variables ----- 'Background Randomize() rndTyp = Rnd(1) 'Graphics g = Me.CreateGraphics() 'Status stat_wb_complete = 0 '----- Form ----- 'Size Me.Size = New Size(704, 466) 'Style Me.FormBorderStyle = 0 Me.BackColor = Color.White '----- Sub ----- AddHandler wb_back.Navigated, AddressOf local_event_wb_back_nav 'Build objects local_build_obj() End Sub Private Sub frm_main_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint local_redraw_bg() End Sub Private Sub timer_check_obj_stat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_check_obj_stat.Tick Dim flag As Boolean Select Case stat_check_obj_ind Case 1 'Web browser(Back) If wb_back.ReadyState = WebBrowserReadyState.Complete Then wb.Navigate("http://tw.beanfun.com/cso/www/game_login.aspx") local_new_objcheck(2) End If Case 2 'Web browser If wb.ReadyState = WebBrowserReadyState.Complete Then wb.Visible = True : wb_back.Visible = True : flag = True stat_wb_complete = 1 local_redraw_bg() End If End Select If flag Then timer_check_obj_stat.Enabled = False : stat_wb_complete = 0 End Sub Private Sub local_redraw_bg() If stat_wb_complete = 0 Then Exit Sub Dim b As Bitmap b = IIf(rndTyp = 0, My.Resources.BG01, My.Resources.BG02) dstRect = Me.ClientRectangle srcRect = New Rectangle(New Point(0, 0), b.Size) g.DrawImage(b, dstRect, srcRect, GraphicsUnit.Pixel) End Sub Private Sub local_build_obj() Dim arrList As New List(Of Control) Dim arrSize As New List(Of Size) Dim arrPoint As New List(Of Point) Dim i As Integer arrList.Add(wb) : arrList.Add(wb_back) arrSize.Add(New Size(672, 240)) : arrSize.Add(New Size(688, 430)) arrPoint.Add(New Point(8, 185)) : arrPoint.Add(New Point(0, 0)) '--- Web browser --- For i = 0 To arrList.Count - 1 arrList(i).Visible = False arrList(i).Parent = Me arrList(i).Size = arrSize(i) arrList(i).Location = arrPoint(i) wb.ScrollBarsEnabled = False : wb_back.ScrollBarsEnabled = False Next i wb_back.SendToBack() Dim tempPath As String = dataDir & "133.html" My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False) wb_back.Navigate("file://" & tempPath) local_new_objcheck(1) End Sub Private Sub local_new_objcheck(ByRef ind As Integer) stat_check_obj_ind = ind timer_check_obj_stat.Enabled = True End Sub Private Sub local_event_wb_back_nav() If stat_wb_complete <> 0 Then Exit Sub Dim flagDis As Boolean = True Select Case local_get_urlnav(wb_back.Url.ToString) Case "Start" wb_back.GoBack() Case "Exit" If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then End Else End If Case "Close" If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then End Else End If Case Else flagDis = False End Select If flagDis Then wb_back.GoBack() End If End Sub Private Function local_get_urlnav(ByRef url As String) As String Dim l As Long l = InStrRev(url, "/") local_get_urlnav = Mid(url, l + 1, Len(url) - l) End Function End Class
x1 |
引用 | 編輯
n3ph223172
2011-08-09 22:51 |
4樓
▲ ▼ |
下面是引用 ebolaman 於 2011-08-09 14:53 發表的 : 小弟想請問一下 為什麼當checkbox沒有打勾時 點擊開始遊戲,背景卻一直改變? x0 |
引用 | 編輯
ebolaman
2011-08-09 23:12 |
5樓
▲ ▼ |
下面是引用 n3ph223172 於 2011-08-09 22:51 發表的 : 其實你點的 開始遊戲 並不是 Image ,而是 WebBrowser 裡面的一個圖片而已 因此我設定 點下去會連結到 "Start" ,雖然說 VB.NET 可以攔截 "點下去" 這個動作,但我不知道要如何 "取消這個動作" 因此接下來就會讓 WebBrowser 連結到 "Start" 這個頁面,也就當然地會找不到網頁 因此我偷偷地加上一行 "wb_back.Goback()",讓 WebBrowser 又連結回來 原本的頁面 而這個 WebBrowser 讀取的 HTML 碼中,背景圖片是在載入中就 隨機決定的 因此才會不斷切換 因此解決辦法是,想辦法找出 VB.NET 中能用 HTML 碼控制外部的程序,我就看到 CSOLauncher 原本的程式的 HTML碼中是用 <span class="BtClose"><a href="javascript:_null()" onclick="external.OnCancel()"> Close</a></span> <span class="BtGamestart_d"><a href="javascript:_null()" id="startGame">遊戲結?</a></span> <span class="BtExit"><a href="javascript:_null()" id="exitGame" onclick="external.OnCancel()">賵?抰戩</a></span> 的用法,代表可以與 程式本身整合,攔截 "點下去" 時這個動作,然後再來觸發 程式中程序 另外一個辦法就是 不要用 Web Browser 改以 Image 這個控制項 來替代,好處是能正確地 攔截 "點下去" 這個動作,麻煩的是位置還要調整 我已經蒐尋了很久,到目前為止還是找不到如何用 WebBrowser 來引發程式中的程序 只要能修改 HTML 碼,讓 WebBrowser 中的東西被點下時,VB程式中能判斷是點下哪個,就好辦了 x1 |
引用 | 編輯
ebolaman
2011-08-10 09:12 |
6樓
▲ ▼ |
||||||||||
關於 VB.NET 好像是 VB 2005 的前身,這我也搞不太清楚
總之大家都習慣把 VB 分為兩階段,一個是 古老的 VB6 另外一個就是 VB.NET 至於該稱呼 VB.NET 還是 2005, 2008, 2010 這我就不知道 昨天又試了很多次,終於找到如何讓 WebBrowser 中的圖片被點下去時 VB 中可以一起被觸發 先要用這兩行來讓 程序被觸發時,可以一起觸發自己設定的函數 不過這次作的更新器模擬只有用到 Navigating 被觸發的時候 複製程式 AddHandler wb_back.Navigating, AddressOf local_event_wb_back_nav AddHandler wb_back.Document.Click, AddressOf local_event_wb_back_click 然後在函數內可以用 wb_back.Document.GetElementById(Name) 來取得特定 ID 的物件 wb_back.Document.GetElementById(Name).GetAttribute(Attr) 則可以取得 屬性,例如 Checkbox 勾了沒 wb_back.Document.InvokeScript(Name, Obj) 則可以觸發 網頁中的 JavaScript,也能取得特定函數的值 wb_back.Document.ActiveElement.Name 則可以取得目前物件的名稱 有了以上方法,我就寫了第二版的 模擬CSO更新器 底下的程式碼在 Form1 (frm_main) Form1 : 複製程式 Public Class frm_main '---------- Local structures ---------- Structure struc_prg Dim pack As Collection Dim curInd As Long Dim accum_total, accum_max As Long Dim cur_val, cur_max As Long Dim total_val, total_max As Long End Structure '---------- Local variables ---------- 'Files & Folders Dim dataDir As String = System.IO.Directory.GetCurrentDirectory & "\HTML\" 'Status Dim stat_check_obj_ind As Integer Dim stat_wb_complete As Integer 'Progress Dim prg As struc_prg '---------- Local objects ---------- Dim WithEvents wb_back As New WebBrowser Private Sub frm_main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i, i2 As Integer '----- Variables ----- 'Status stat_wb_complete = 0 'Size : Pack (@@@ Test @@@) prg.pack = New Collection Dim arrPack(,) = {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}} For i = 0 To arrPack.GetUpperBound(0) For i2 = 0 To arrPack.GetUpperBound(1) prg.pack.Add(arrPack(i, i2)) Next Next For i = 1 To prg.pack.Count / 3 prg.accum_max += prg.pack.Item(i * 3 - 1) Next prg.curInd = 0 '----- Form ----- 'Size Me.Size = New Size(704, 466) 'Style Me.FormBorderStyle = 0 Me.BackColor = Color.White '----- Sub ----- 'Build objects local_build_obj() End Sub Private Sub timer_check_obj_stat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_check_obj_stat.Tick Dim flag As Boolean Select Case stat_check_obj_ind Case 1 'Web browser(Back) If wb_back.ReadyState = WebBrowserReadyState.Complete Then flag = True wb_back.Visible = True stat_wb_complete = 1 local_new_pack() 'Test @@@ End If End Select If flag Then timer_check_obj_stat.Enabled = False End Sub Private Sub timer_simul_prg_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_simul_prg.Tick 'Test @@@ Dim objArr(1) As Object Randomize() prg.cur_val += (Fix(50 * Rnd()) + 30) If prg.cur_val >= prg.pack.Item(prg.curInd * 3 - 1) Then prg.accum_total += prg.pack.Item(prg.curInd * 3 - 1) timer_simul_prg.Enabled = False local_new_pack() Exit Sub End If Randomize() timer_simul_prg.Interval = IIf(Fix(10 * Rnd()) = 0, 500, Fix(50 * Rnd()) + 1) 'Set current progress objArr(0) = CObj(prg.cur_val) 'Value objArr(1) = CObj(prg.cur_max) 'Max local_wb_callScript("SetCurrentProgress", objArr) 'Status objArr(0) = CObj(prg.pack.Item(prg.curInd * 3 - 2) & " 安裝中...(" & prg.cur_val & "/" & prg.cur_max & ")") 'Value local_wb_callScript("SetStatusText", objArr) End Sub Private Sub local_build_obj() Dim arrList As New List(Of Control) Dim arrSize As New List(Of Size) Dim arrPoint As New List(Of Point) Dim i As Integer arrList.Add(wb_back) arrSize.Add(New Size(688, 430)) arrPoint.Add(New Point(0, 0)) '--- Web browser --- For i = 0 To arrList.Count - 1 arrList(i).Visible = False arrList(i).Parent = Me arrList(i).Size = arrSize(i) arrList(i).Location = arrPoint(i) wb_back.ScrollBarsEnabled = False 'wb_back.ScriptErrorsSuppressed = True Next i 'Write files Dim tempPath As String = dataDir & "133.html" My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False) 'Navigate URL wb_back.Navigate("file://" & tempPath) local_new_objcheck(1) 'Add handler AddHandler wb_back.Navigating, AddressOf local_event_wb_back_nav AddHandler wb_back.Document.Click, AddressOf local_event_wb_back_click End Sub Private Sub local_new_objcheck(ByRef ind As Integer) stat_check_obj_ind = ind timer_check_obj_stat.Enabled = True End Sub Private Sub local_event_wb_back_nav() If stat_wb_complete = 0 Then Exit Sub Select Case wb_back.Document.ActiveElement.Id Case "startGame" If wb_back.Document.GetElementById("agreement").GetAttribute("checked") = True Then If wb_back.Document.InvokeScript("get_CanStart") = 1 Then MsgBox("Game started.", MsgBoxStyle.Information, "Test") End End If End If Case "exitGame" If wb_back.Document.InvokeScript("get_CanStart") = 0 Then If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then End End If Else End End If Case "closeGame" If wb_back.Document.InvokeScript("get_CanStart") = 0 Then If MsgBox("更新作業進行中.請問要結束嗎?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then End End If Else End End If End Select End Sub Private Sub local_event_wb_back_click() Select Case wb_back.Document.ActiveElement.Name Case "" Case "agreement" End Select End Sub Private Sub local_renew_finishprg() local_wb_callScript("OnAllDone", Nothing) End Sub Private Sub local_wb_callScript(ByRef s As String, ByRef objArr As Object) wb_back.Document.InvokeScript(s, objArr) End Sub Private Sub local_new_pack() 'Test @@@ If prg.curInd = prg.pack.Count / 3 Then local_renew_finishprg() : Exit Sub Dim ObjArr(1) As Object prg.curInd += 1 'Status ObjArr(0) = CObj("正在安裝" & prg.pack.Item(prg.curInd * 3) & "...") local_wb_callScript("SetStatusText", ObjArr) prg.cur_val = 0 prg.cur_max = prg.pack.Item(prg.curInd * 3 - 1) 'Reset total progress ObjArr(0) = CObj(prg.accum_total) ObjArr(1) = CObj(prg.accum_max) local_wb_callScript("SetTotalProgress", ObjArr) 'Reset current progress ObjArr(0) = CObj(0) ObjArr(1) = CObj(prg.cur_max) local_wb_callScript("SetCurrentProgress", ObjArr) timer_simul_prg.Enabled = True End Sub End Class 必須加入 Timer : timer_check_obj_stat (Interval = 100, Enabled=0) , timer_simul_prg (Interval = 1000, Enabled=0) 必須加入 Resource : _133 (Files) 必須在程式執行資料夾放上 HTML資料夾(可以從底下的附件中找到) Resource : _133 如下,其中被我修改了一點點 Resource : _133 : 複製程式 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html;" /> <title>Counter-Strike Online</title> <style> body { background-color : gray; margin : 0; padding : 0; font:12px Tahoma,Dotum,絡遺,Gulim,Verdana,sans-serif,serif; } .FrameBody {background-color: transparent} img {border:0;} #Wrapper01 {position:relative;width:688px;height:430px;background:url(bg01.jpg) no-repeat;} #Wrapper02 {position:relative;width:688px;height:430px;background:url(bg02.jpg) no-repeat;} #NoticeFrame {position:absolute; left:8; top:185; width:671px; height:236px; z-index:3} #Install {position:absolute;top:145px;left:8px;width:671px;height:44px;} #BarTotalDiv {width:671px;height:6px;margin:0 0 0 0px;} #BarNowDiv {width:671px;height:6px;margin:5px 0 0 0px;} #InstallTxt {margin:6px 0 0 0;color:#FFFFFF;} #InstallTxt #InstallTxtPer {font-weight:bold;color:#C2B49A;float:right} .BtClose {position:absolute; left:673; top:6; width:13px; height:14px; z-index:3} .BtClose a {width:13;height:14px;text-indent:-9000px;display:block;} #Wrapper01 .BtClose {background:url(close_n.jpg) no-repeat;} #Wrapper02 .BtClose {background:url(close_n.jpg) no-repeat;} .BtGamestart {position:absolute; left:419px; top:115; width:154px; height:28px; z-index:1} .BtGamestart a {width:154px;height:28px;text-indent:-9000px;display:block;} .BtGamestart a:hover {width:154px;height:28px;text-indent:-9000px;display:block;} .BtGamestart_d {position:absolute; left:419px; top:115; width:154px; height:28px; z-index:1} .BtGamestart_d a {width:154px;height:28px;text-indent:-9000px;display:block;} .BtGamestart_d a:hover {width:154px;height:28px;text-indent:-9000px;display:block;} #Wrapper01 .BtGamestart_d {background:url(start_d.jpg) no-repeat;} #Wrapper02 .BtGamestart_d {background:url(start_d.jpg) no-repeat;} #Wrapper01 .BtGamestart {background:url(start_n.jpg) no-repeat;} #Wrapper02 .BtGamestart {background:url(start_n.jpg) no-repeat;} #Wrapper01 .BtGamestart a:hover{background:url(start_o.jpg) no-repeat;} #Wrapper02 .BtGamestart a:hover{background:url(start_o.jpg) no-repeat;} .BtExit {position:absolute; left:585; top:115; width:93px; height:28px; z-index:2} .BtExit a {width:93px;height:28px;text-indent:-9000px;display:block;} .BtExit a:hover {width:93;height:28;text-indent:-9000px;display:block;} #Wrapper01 .BtExit {background:url(exit_n.jpg) no-repeat;} #Wrapper02 .BtExit {background:url(exit_o.jpg) no-repeat;} .UserInfo{position:absolute;left:427px;top:63px;color:#c9f3ff;font:14px;} </style> <script language="javascript"> <!-- var CanStart; function SetNoticeUrl(url) { document.getElementById("NoticeFrame").src = url; //alert(NoticeFrame.src); } function _onGameStart() { } function get_CanStart() { return CanStart } function _null() {} function OnAllDone() { var e = document.getElementById("startGame"); if(agreement.checked) { e.parentElement.className = "BtGamestart"; e.onclick = _onGameStart; } CanStart=1 SetCurrentProgress(1, 1); SetTotalProgress(1, 1); lblStatus.innerText = ""; InstallTxtPer.innerText = "更新完成,請點選開始遊戲按扭"; //external.FlashWindow(); } function checkAgreement() { if(agreement.checked) { var barTotal = document.getElementById("barTotal"); if(barTotal.width == 671) { var sb = document.getElementById("startGame"); sb.parentElement.className = "BtGamestart"; sb.onclick = _onGameStart; } } else { var e = document.getElementById("startGame"); e.parentElement.className = "BtGamestart_d"; e.onclick = _null; } } function SetTotalProgress(cur, total) { //lblTotal.innerText = cur.toString() + "/" + total.toString(); var lblTotal = document.getElementById("InstallTxtPer"); if (lblTotal != null) { lblTotal.innerText = "進度 " + Math.round((cur/total * 100.0)) + "%"; } var barTotal = document.getElementById("barTotal"); if (barTotal != null) { barTotal.width = (cur/total) * barTotal.parentElement.offsetWidth; } } function SetCurrentProgress(cur, total) { barCurrent.width = cur/total * barCurrent.parentElement.offsetWidth; } var g_output = ""; function Output(s) { g_output += s + "<br>"; } function SetStatusText(name) {g_output //lblCurrent.innerText = name + " (" + cur + "/" + total + ")"; lblStatus.innerText = name; //barCurrent.width = 0; } // --> </script> </head> <body oncontextmenu="return false" onselectstart="return false;"> <script language="javascript"> <!-- var tag = '<div id="{0}">' document.write(tag.replace('{0}', Math.random() < 0.5 ? 'Wrapper01' : 'Wrapper02')); //--> </script> <div id="Install"> <div id="BarTotalDiv"><img id="barTotal" src="bar_total.gif" width="0%" height="6"></div> <div id="BarNowDiv"><img id="barCurrent" src="bar_now.gif" width="0%" height="6"></div> <div id="InstallTxt"><span id="InstallTxtPer">進度 0%</span><span id="lblStatus">Now Downloading...</span></div> </div> <span class="BtClose"><a href="javascript:_null()" id="closeGame">Close</a></span> <span class="BtGamestart_d"><a href="javascript:_null()" id="startGame">Start</a></span> <span class="BtExit"><a href="javascript:_null()" id="exitGame">Exit</a></span> <span class="UserInfo"><a href="http://tw.beanfun.com/cso/support_06.aspx" target="_blank">[遊戲服務合約書]</a></span> <span style="position:absolute;right:30px;top:63px;color:#ffffff;font:14px;"><input name="agreement" type="checkbox" value="0" onClick="checkAgreement()">我已閱讀並同意</span> <span style="position:absolute;right:30px;top:83px;color:#b4b4b4;">我已閱讀並同意遊戲服務合約書</span> <iframe src="http://tw.beanfun.com/cso/www/game_login.aspx" id="NoticeFrame" frameborder="0" width="100%" height="100%" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="true"></iframe> </body> </html> 可以下載看看,我已經把 進度列 等全部模擬完成 接下來你只要去修改 操控進度列的函數(在程式中),就能輕易達到更新的效果 不過這全拜 CSO 更新器是以 "HTML" 方式來執行所賜,所以在程式中,其實只用了一個 WebBrowser 而已 那些 Image 全部都是在 WebBrowser 裡面,因此位置、大小、觸發程序 都已經被 HTML碼設定好了 VB程式中只需要 攔截觸發,呼叫函數,還有判斷函數的值就行了,那些進度列的樣式都已經被設定好了,真方便 現在已經幾乎與 CSO 更新器一模一樣,只差進度列更新時不太一樣 CSOLauncher_Simulation 程式下載:
x1 |
引用 | 編輯
n3ph223172
2011-08-10 12:59 |
7樓
▲ ▼ |
下面是引用 ebolaman 於 2011-08-10 09:12 發表的 第二版 遊戲更新器 模擬: 感謝大大詳細的指導,在送上500元。 但您提到的"現在已經幾乎與 CSO 更新器一模一樣,只差進度列更新時不太一樣" 哪裡不一樣呢? 另外由於本人是個VB新手 因此大大提到的"必須加入 Timer : timer_check_obj_stat (Interval = 100, Enabled=0) , timer_simul_prg (Interval = 1000, Enabled=0)" 小弟不曉得加在哪裡… 而若依照大大的form底下的代碼: 會有以下錯誤: 複製程式 錯誤 1 Handles 子句需要 WithEvents 變數,該變數定義於包含型別或它的一種基底型別中。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 70 111 WindowsApplication1 錯誤 2 'timer_check_obj_stat' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 86 22 WindowsApplication1 錯誤 3 Handles 子句需要 WithEvents 變數,該變數定義於包含型別或它的一種基底型別中。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 90 106 WindowsApplication1 錯誤 4 'timer_simul_prg' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 101 13 WindowsApplication1 錯誤 5 'timer_simul_prg' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 107 9 WindowsApplication1 錯誤 6 'timer_check_obj_stat' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 162 9 WindowsApplication1 錯誤 7 'timer_simul_prg' 未宣告。由於其保護層級,可能無法對其進行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 239 9 WindowsApplication1 x0 |
引用 | 編輯
ebolaman
2011-08-10 13:51 |
8樓
▲ ▼ |
下面是引用 n3ph223172 於 2011-08-10 12:59 發表的 Re:第二版 遊戲更新器 模擬: 介面已經完全一樣 就是更新時的文字 "檔案下載中..." "更新中" "解壓縮中..." 等文字不太一樣 複製程式 Dim arrPack(,) = {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}} 上面的模擬器我是用了這樣子 去稍微模擬 進度列是 用 Timer 去跑的,所以並不是真正的下載並安裝,還要改成你說的 FTP 下載 那些下載時說明的文字,就得要自己去打 你可以看看 CSOLauncher.exe 的資源檔的 String 部分,大概分為 下載、解壓縮、安裝、驗證 四個部分而已 還有,要操控 WebBrowser 中的進度列與狀態文字,用以下方法達成 (都能在上面回覆中的程式碼找到) 複製程式 'Set total progress ObjArr(0) = CObj(prg.accum_total) '藍色桿子的 目前數值 ObjArr(1) = CObj(prg.accum_max) '藍色桿子的 總數值 local_wb_callScript("SetTotalProgress", ObjArr) 'Set current progress ObjArr(0) = CObj(prg.cur_val) '灰色桿子的 目前數值 ObjArr(1) = CObj(prg.cur_max) '灰色桿子的 總數值 local_wb_callScript("SetCurrentProgress", ObjArr) 'Set status ObjArr(0) = CObj("Installing...") '狀態文字 local_wb_callScript("SetStatusText", objArr) x1 |
引用 | 編輯
ebolaman
2011-08-10 14:00 |
9樓
▲ ▼ |
||||||||||
直接給你 VB 2010 專案吧
x0 |
引用 | 編輯
n3ph223172
2011-08-10 16:52 |
10樓
▲ ▼ |
引用 | 編輯
ebolaman
2011-08-10 17:14 |
11樓
▲ ▼ |
這個 file:// 是連結到 WebBrowser 所使用的連結
你會發現 有一個資料夾 HTML,沒錯,WebBrowser 的網址是連到那個資料夾裡的 133.html 並非 檔案下載 複製程式 'Write files Dim tempPath As String = dataDir & "133.html" My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False) 'Navigate URL wb_back.Navigate("file://" & tempPath) local_new_objcheck(1) [/pre] 關於 檔案判斷、FTP 下載 的部分,我完全沒做 你看到的進度列都是模擬出來的,所以還要再加上去 連上網路下載檔案的功能,現在只是 介面 的部分完成而已 關於 FTP 下載的部分,這裡有幾篇可以參考: http://tw.myblog.yahoo.com/jw!t7pzMwuaAwLmvvVP5J4M/article?mid=2596 http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/63796964-f88a-40cf-91eb-08e71e98fa83/ http://www.codeproject.com/KB/IP/FtpClient.aspx?fid=225949&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=201 很抱歉我也是初學而已,對於 VB2010 種種的類型、宣告,還不是很熟悉 不過既然網路上範例與教學那麼多,只要研究一下應該是能做出來的 x0 |
引用 | 編輯
n3ph223172
2011-08-10 17:17 |
12樓
▲ ▼ |
下面是引用 ebolaman 於 2011-08-10 17:14 發表的 : 哦,原來阿。 Dim arrPack(,) = {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}} 那請問當中的 {{"Server Info", 100, "伺服器訊息"}, {"Map", 3000, "地圖檔"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}} 裡面3引號分別指的是? x0 |
引用 | 編輯
ebolaman
2011-08-10 17:51 |
13樓
▲ ▼ |
下面是引用 n3ph223172 於 2011-08-10 17:17 發表的 : Server Info, Map, Amxx, Plugin 是更新時所採用的 ID,就像身分證一樣,讓 更新程式知道即將要更新什麼 如果有來自 FTP 直接指示要更新哪個位置、哪個檔案 這樣更好 100, 3000, 888, 1999 是要更新的大小,當然是我亂打的 伺服器訊息, 地圖檔, 插件平台, 插件 是更新時要顯示的 狀態文字 當然最好的作法是,不要用這個陣列的方法,而是將更新的目錄儲存在 FTP 上,這樣萬一更新資料有變動,就不用再編輯 這個遊戲更新器,而是更新 FTP 上的更新目錄 x0 |
引用 | 編輯
n3ph223172
2011-08-10 21:51 |
14樓
▲ ▼ |
下面是引用 ebolaman 於 2011-08-10 17:51 發表的 : 感謝詳細解說。 基本上小弟就是想以這種方法更新。 小弟希望不是(xxxx/xxxx),而是XXXKB/s。 另外大大您的FTP文章小弟參考過了,小弟對於FTP這個是懂非懂。 有聽朋友說FTP只能下載單檔,是真的嗎? 小弟找到資料:http://ycc.tsu.edu.tw/S1/UpDownFile.htm 也是看的不怎麼懂… 總覺得跟小弟要弄的方法不一樣? x0 |
引用 | 編輯
ebolaman
2011-08-10 22:32 |
15樓
▲ ▼ |
下面是引用 n3ph223172 於 2011-08-10 21:51 發表的 : FTP 反正也只是不同地方的檔案,最難的就是 "如何取得檔案",之後判斷檔案、判斷要不要更新、檔案大小、狀態列文字 等都是很簡單的 抱歉我對 FTP 也是 完全不懂~ 不過你可以給我 FTP 的網址,我來做看看 也請提供 狀態文字 要如何顯示(我看 CSO 的啟動器的狀態文字是分為 下載、解壓縮、安裝 大概這三階段,要做 XXXKB/s 應該是 OK),檔案要如何更新,FTP 帳密(可以創一個暫時測試用的)等更詳細的資訊。 還有我覺得更好的是以 Hash Code 來決定檔案是否要更新,如果單純判斷 檔案大小,尤其是檔案特別小,更新的時候卻又剛剛好檔案大小沒變,會造成沒有更新的錯誤,而 Hash Code 就沒這個問題 x1 |
引用 | 編輯
ebolaman
2011-08-11 21:43 |
17樓
▲ ▼ |
好了,下載檔案、檢查 Md5、解壓縮、複製檔案、呼叫遊戲、檢查重複程序 的功能都已經做好
GIF 動畫展示: 其中 ICSharpCode.SharpZipLib.dll, MySharpZip.dll 這兩個 DLL 我沒辦法把他弄到 EXE 本身裡面,所以只好與 Launcher 放在同一個資料夾 預設的 FTP 是連線到 ftp://192.168.2.104 ,可以用你所提供的網頁中介紹的軟體 PCMan's FTP Server 來模擬本機的 FTP 下載,程式碼中可以修改 預設的 FTP 逾時是一分鐘,網頁逾時是半分鐘,可以調整 至於 FTP 上的資料夾,必須先建立個 CS_Update 資料夾,然後在底下置放一個索引文件 Index.txt 接著在 CS_Update 資料夾下就可以放置 cstrike 資料夾 (允許子資料夾),之後就能放更新的文件 但更新的文件必須全部是 zip 壓縮檔,並與原來檔名一樣(例如 cstrike.exe -> cstrike.exe.zip) 例如,檔案分配如下 (我設定本機的 FTP 指向 Desktop\TempFTP\ ): 複製程式 Index.txt Desktop\TempFTP\CS_Update\Index.txt mp.dll.zip Desktop\TempFTP\CS_Update\cstrike\mp.dll.zip temp.zip Desktop\TempFTP\CS_Update\cstrike\temp.zip test.zip Desktop\TempFTP\CS_Update\cstrike\test.zip 而 index.txt 的內容: 複製程式 [Update] "\cstrike\temp" 23677 MD5MD5MD5MD5MD5MD5MD5MD5MD5MD5MD "\cstrike\mp.dll" 548 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "\cstrike\test" 17760 715BD382F69BF50C6A4B3A05080AC3A4 [Remove] "Test" index.txt 的 [Update] 底下的,一開始是 檔案路徑,接著是 "壓縮檔" 的檔案大小,再來是 "解壓縮後檔案" 的 Md5,三個項目以空白鍵分開,檔案路徑必須被雙引號夾起來 "壓縮檔" 的檔案大小 是為了 顯示進度列,"解壓縮後檔案" 的 Md5 是為了檢查是否要更新 推薦的 Hash Codes 產生器/讀取器: HashMyFiles (其他還有 HashCalc, HashX, Hash Codes, Arpoon Checksum, ExactFile 等 Hash/Checksum 的免費軟體) 而更新的過程: (1) 下載 Index.txt 知道更新的目錄 (索引清單) (2) 開始檢查已經存在檔案的 Md5 並與索引清單對比,不相符的下載ZIP檔案 (下載到 %Temp%\ 中) (3) 全部下載完後解壓縮 (在 %Temp%\ 中) (4) 複製檔案(會覆蓋)到Launcher 本身資料夾底下的資料夾 (包含子資料夾) (5) 刪除檔案 (只刪除 index.txt [Remove] 標頭底下提供的清單,這個設計到時候可能不需要,只是為了客戶端 檔案簡潔之用 (例:把舊的檔案刪除)) 採用 ZIP 壓縮檔好處是能節省 下載時間,如果你覺得一個檔案一個檔案 壓縮成 ZIP 檔案很煩 可以用免費軟體 ArcThemAll 把選取的檔案一次 每個都加入到 個別的 ZIP 檔案 而新的資料我改存到 %Temp% 中,你可以在程式執行中在 %Temp% 下找到 CSOLnchr_Simu_XXX 的資料夾 (會在 Launcher 關閉時被刪除) 還有,我剛剛執行似乎有發現一個 BUG,就是 Launcher 本身可以重複啟動 其他功能請自行修改,我已經幫你完成幾乎所有部分了 CSOLauncher Simulation VB 2010 專案下載: Sorry this attachment is not available for download right now. x1 |
引用 | 編輯
ebolaman
2011-08-11 22:20 |
18樓
▲ ▼ |
關於 禁止Launcher 重複執行
請將 frm_main.vb 中的 Sub : local_check_existExe 修改成 複製程式 Private Sub local_check_existExe() 'Check current process If (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1) Then Me.Close() : Exit Sub 'Check game process If Process.GetProcessesByName(cFile.get_filename_major(exe.gameExe)).Length <> 0 Then local_show_errDlg("Err_exist_gameExe", exe.gameExe) End Sub 就可以防止重複執行程式了 (但不能防止 同時間 啟動) (P.S. 還有另外一種 Mutex 的方法) x1 |
引用 | 編輯
n3ph223172
2011-08-11 22:39 |
19樓
▲ ▼ |
引用 | 編輯
n3ph223172
2011-08-11 22:50 |
21樓
▲ ▼ |
下面是引用 ebolaman 於 2011-08-11 22:46 發表的 : 小弟也有意願想碰VB6。 畢竟寫出來的東西不用配備高。 像2010寫出來的就得.NET 4.0.. 許多朋友都沒到這麼高呢。 x0 |
引用 | 編輯
n3ph223172
2011-08-12 01:37 |
22樓
▲ ▼ |
小弟請問下,若打包成rar可以下載嗎?
x0 |
引用 | 編輯
ebolaman
2011-08-12 08:37 |
23樓
▲ ▼ |
下面是引用 n3ph223172 於 2011-08-12 01:37 發表的 : 似乎已經有很多人做好了,有直接呼叫 RAR 來解壓縮的: http://www.kodyaz.com/articles/how-to-unrar-rar-files-using-vb.net-extract-code.aspx 有用本身的 Class 來解壓縮的: http://www.vbforums.com/showthread.php?t=530685 改成 RAR 的話可以,但是程式碼必須修改 x0 |
引用 | 編輯
ebolaman
2011-08-12 12:43 |
24樓
▲ ▼ |
||||||||||||||||||||
這次改成了呼叫 WinRAR 來解壓縮
缺點是,不知道沒裝 WinRAR 的人能不能解壓縮,不過應該都會有吧,不然當初怎麼下載遊戲的 另外原本需要的兩個 DLL 現在也不用了 另外我還做了一個小程式,叫作 Find And RAR 把這個小程式放在 FTP 目錄下,然後執行,就能將每個檔案,分別 壓縮起來 (RAR型式,且包含副檔名) 可以方便 FTP伺服端 檔案的操作
x1 |
引用 | 編輯
n3ph223172
2011-08-12 23:48 |
25樓
▲ ▼ |
下面是引用 ebolaman 於 2011-08-12 12:43 發表的 CSOLauncher Simulation 第三版: 真的太感謝了,小弟真的第一次遇到像大大這麼熱心也這麼用心的人。 小弟再試試第三版在向大大反應!^^ x0 |
引用 | 編輯
n3ph223172
2011-08-13 01:21 |
26樓
▲ ▼ |
引用 | 編輯
ebolaman
2011-08-13 09:10 |
27樓
▲ ▼ |
下面是引用 n3ph223172 於 2011-08-13 01:21 發表的 : 有可能是 FTP連線出錯 (位址不正確、帳密不正確,有的帳號必須加入 @XXXX) 或是找不到 FTP端 的檔案 (Index.txt 內容錯誤) 如何偵錯: 在 [Class] >> cls_net.vb >> Function ftp_download 中 最底下的 Err_1: 下加上 MsgBox(Err.Description) 改成這樣,然後再執行一次 複製程式 Err_1: MsgBox(Err.Description) Return Err.Number P.S. 我明天到下禮拜天都會不在,到時候可能要你自己研究一下了.. x0 |
引用 | 編輯
n3ph223172
2011-08-13 13:00 |
28樓
▲ ▼ |
下面是引用 ebolaman 於 2011-08-13 09:10 發表的 : 測試後: 請問是要連同TempFTP資料夾放進去,還是放CS_Update進去即可? 小弟僅將大大您的源碼資料夾內附的測試檔案上傳至FTP空間。 所有東西並未修改過 包含Index.txt 但同時小弟覺得大大填的MD5碼怪怪的,是不是跟無法取得的問題是不是相連的? x0 |
引用 | 編輯
n3ph223172
2011-08-13 13:43 |
29樓
▲ |
解決了
小弟請另外一位朋友協助,後來是"I"ndex.txt檔名的問題 x0 |