引用 | 编辑
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 |