using System; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using System.IO; using System.Net; using System.Threading.Tasks; using Ionic.Zip; using System.Runtime.InteropServices; namespace winform1 { public partial class Form1 : Form { private Point m_mousePos; private bool m_isMouseDown; //要下载的文件的url private const string m_url = "https://codechina.csdn.net/linxinfa/winform-download-demo/-/raw/master/winform1/res/QQGameUnityDemo.zip"; private const long m_totalSize = 21388019; private const string m_md5 = "44BB65977FBF90062E8A3F5521D84A11"; //下载到本地的文件名 private const string m_saveFile = "./qgame_unity_demo.zip"; //解压目录 private const string m_unzipFile = "./qgame_unity_demo"; private const string m_exePath = "./qgame_unity_demo/QQGameUnityDemo/QQGameDemo.exe"; public Form1() { InitializeComponent(); InitUi(); if (!TryOpenUnityDemoExe()) { StartDownload(); } } private void InitUi() { //隐藏标题栏 this.FormBorderStyle = FormBorderStyle.None; //背景图 pictureBg.SizeMode = PictureBoxSizeMode.StretchImage; //窗口移动控制 pictureBg.MouseDown += OnMouseDown; pictureBg.MouseUp += OnMouseUp; pictureBg.MouseMove += OnMouseMove; progressBar.MouseDown += OnMouseDown; progressBar.MouseUp += OnMouseUp; progressBar.MouseMove += OnMouseMove; //提示语 tipsLbl.Parent = pictureBg; processLbl.Parent = pictureBg; processLbl.Text = "0%"; //进度条 progressBar.Minimum = 0; } private bool TryOpenUnityDemoExe() { if (File.Exists(m_saveFile) && DownloadThread.GetMD5FromFile(m_saveFile) != m_md5) { return false; } if (File.Exists(m_exePath)) { WinExec(m_exePath, 1); System.Environment.Exit(0); return true; } return false; } #region 隐藏标题栏后支持移动窗口 /// /// 鼠标按下,开启移动 /// /// protected void OnMouseDown(object sender, MouseEventArgs e) { m_mousePos = Cursor.Position; m_isMouseDown = true; } /// /// 鼠标抬起,关闭移动 /// /// protected void OnMouseUp(object sender, MouseEventArgs e) { m_isMouseDown = false; this.Focus(); } /// /// 移动窗口 /// /// private void OnMouseMove(object sender, MouseEventArgs e) { if (m_isMouseDown) { Point tempPos = Cursor.Position; this.Location = new Point(Location.X + (tempPos.X - m_mousePos.X), Location.Y + (tempPos.Y - m_mousePos.Y)); m_mousePos = Cursor.Position; } } #endregion #region 更新进度条 /// /// 被委托调用,专门设置进度条最大值 /// /// public void UpdateProgressMaxValue(int maxValue) { progressBar.Maximum = maxValue; UpdateTipsLbl("正在下载,请耐心等待"); } public void UpdateTipsLbl(string txt) { tipsLbl.Text = txt; } /// /// 被委托调用,专门设置进度条当前值 /// /// private void UpdateProgressCurValue(int curValue) { progressBar.Value = curValue; string nowValueStr = string.Format("{0:F}", (float)curValue / progressBar.Maximum * 100); processLbl.Text = nowValueStr + "%"; } #endregion private void StartDownload() { DownloadThread method = new DownloadThread(); //先订阅一下事件 method.eventDownloadStart += OnEventDownloadStart; method.eventDownloadIng += OnEventDownloadIng; method.eventCheckingMd5 += OnEventCheckMd5; method.eventDownloadDone += OnEventDownloadDone; //开启一个线程进行下载 Task task = new Task(() => { method.RunMethod(m_url, m_saveFile, m_totalSize, m_md5); }); task.Start(); } private void UnZipFile(string file) { using (ZipFile zip = new ZipFile(file)) { zip.ExtractAll(m_unzipFile); } } /// 线程开始事件,设置进度条最大值 /// 但是不能直接操作进度条,需要一个委托来替我完成 void OnEventDownloadStart(long totalSize) { Invoke(new Action(UpdateProgressMaxValue), (int)totalSize); } /// 线程执行中的事件,设置进度条当前进度 /// 但是不能直接操作进度条,需要一个委托来替我完成 void OnEventDownloadIng(long curDownloadSize) { Invoke(new Action(UpdateProgressCurValue), (int)curDownloadSize); } void OnEventCheckMd5() { Invoke(new Action(UpdateTipsLbl), "正在校验文件,请稍等"); } /// /// 线程完成事件 /// void OnEventDownloadDone() { //解压文件 UnZipFile(m_saveFile); //尝试打开下载的exe TryOpenUnityDemoExe(); } [DllImport("kernel32.dll")] public static extern int WinExec(string exeName, int operType); } }