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);
}
}