Browse Source

Init 构建基础框架,基本界面已经完成;引用Json.Net与neolua的Nuget程序包。

Zony 1 year ago
parent
commit
d13f11c306

BIN
Icon/6.ico


BIN
Icon/Set.ico


BIN
Icon/discuz.ico


BIN
Icon/donate.ico


BIN
Icon/down.ico


BIN
Icon/plugins.ico


BIN
Icon/search.ico


+ 77 - 0
LibNet/Http/NetUtils.cs

@@ -0,0 +1,77 @@
+/*
+ * 描述:提供HTTP的POST/GET操作
+ * 作者:Zony
+ * 创建日期:2016/10/05
+ * 最后修改日期:2016/10/05
+ * 版本:v1.0
+ */
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LibNet.Http
+{
+    /// <summary>
+    /// 提供HTTP的POST/GET操作
+    /// </summary>
+    public class NetUtils
+    {
+        /// <summary>
+        /// 提供对HTTP访问的GET操作
+        /// </summary>
+        /// <param name="url">目标URL</param>
+        /// <param name="referer">标头</param>
+        /// <param name="encoding">编码方式</param>
+        /// <returns></returns>
+        public string HttpGet(string url,string referer,Encoding encoding)
+        {
+            try
+            {
+                HttpWebRequest _req = (HttpWebRequest)WebRequest.Create(url);
+                _req.Method = "get";
+                _req.ContentType = "application/x-www-form-urlencoded";
+
+                if (referer != null)
+                {
+                    _req.Referer = referer;
+                }
+
+                HttpWebResponse _res = (HttpWebResponse)_req.GetResponse();
+                StringBuilder _sb = new StringBuilder();
+
+                using (Stream _st = _res.GetResponseStream())
+                {
+                    using (StreamReader _sr = new StreamReader(_st, encoding))
+                    {
+                        string _line;
+                        while ((_line = _sr.ReadLine()) != null)
+                        {
+                            _sb.Append(_line);
+                        }
+                        return _sb.ToString();
+                    }
+                }
+            }catch
+            {
+                return null;
+            }
+        }
+
+        /// <summary>
+        /// 提供对HTTP访问的POST操作
+        /// </summary>
+        /// <param name="url">目标URL</param>
+        /// <param name="referer">标头</param>
+        /// <param name="encoding">编码方式</param>
+        /// <param name="data">提交的数据</param>
+        /// <returns></returns>
+        public string HttpPost(string url,string referer,Encoding encoding,string data)
+        {
+            return null;
+        }
+    }
+}

+ 54 - 0
LibNet/LibNet.csproj

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{226BB4D9-F34A-4A8A-A63D-482FA3C5E011}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>LibNet</RootNamespace>
+    <AssemblyName>LibNet</AssemblyName>
+    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Http\NetUtils.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 36 - 0
LibNet/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("LibNet")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LibNet")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//将 ComVisible 设置为 false 将使此程序集中的类型
+//对 COM 组件不可见。  如果需要从 COM 访问此程序集中的类型,
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("226bb4d9-f34a-4a8a-a63d-482fa3c5e011")]
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”: :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 16 - 0
LibPlugins/IPlug.cs

@@ -0,0 +1,16 @@
+/*
+ * 描述:插件公有接口。
+ * 作者:Zony
+ * 创建日期:2016/10/05
+ * 最后修改日期:2016/10/05
+ * 版本:v1.0
+ */
+
+namespace LibPlugins
+{
+    public interface IPlug
+    {
+        void Init();
+        PluginsInfo Info { get; set; }
+    }
+}

+ 55 - 0
LibPlugins/LibPlugins.csproj

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{491A4B32-0EE8-4DC8-9C53-DACD904BA142}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>LibPlugins</RootNamespace>
+    <AssemblyName>LibPlugins</AssemblyName>
+    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="IPlug.cs" />
+    <Compile Include="PluginsInfo.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 49 - 0
LibPlugins/PluginsInfo.cs

@@ -0,0 +1,49 @@
+/*
+ * 描述:底层插件信息。
+ * 作者:Zony
+ * 创建日期:2016/10/05
+ * 最后修改日期:2016/10/05
+ * 版本:v1.0
+ */
+
+using System;
+
+namespace LibPlugins
+{
+    /// <summary>
+    /// 底层插件描述信息。
+    /// </summary>
+    public class PluginsInfo : Attribute
+    {
+        public PluginsInfo() { }
+        public PluginsInfo(string PlugName,string Author,string Descript,int Version)
+        {
+            _PlugName = PlugName;
+            _Descript = Descript;
+            _Author = Author;
+            _Version = Version;
+        }
+
+        /// <summary>
+        /// 插件名称
+        /// </summary>
+        public string PlugName { get { return _PlugName; } }
+        /// <summary>
+        /// 作者
+        /// </summary>
+        public string Author { get { return _Author; } }
+        /// <summary>
+        /// 插件描述信息
+        /// </summary>
+        public string Descript { get { return _Descript; } }
+        /// <summary>
+        /// 插件版本
+        /// </summary>
+        public int Version { get { return _Version; } }
+
+        private string _PlugName;
+        private string _Author;
+        private string _Descript;
+        private int _Version;
+    }
+}

+ 36 - 0
LibPlugins/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("LibPlugins")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LibPlugins")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//将 ComVisible 设置为 false 将使此程序集中的类型
+//对 COM 组件不可见。  如果需要从 COM 访问此程序集中的类型,
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("491a4b32-0ee8-4dc8-9c53-dacd904ba142")]
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”: :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 12 - 0
ZonyLrcDownLoad 4.sln

@@ -5,6 +5,10 @@ VisualStudioVersion = 14.0.25420.1
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZonyLrcDownLoad 4", "ZonyLrcDownLoad 4\ZonyLrcDownLoad 4.csproj", "{DC7E98C0-A8F1-4178-9122-026B9B6148AC}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibPlugins", "LibPlugins\LibPlugins.csproj", "{491A4B32-0EE8-4DC8-9C53-DACD904BA142}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibNet", "LibNet\LibNet.csproj", "{226BB4D9-F34A-4A8A-A63D-482FA3C5E011}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -15,6 +19,14 @@ Global
 		{DC7E98C0-A8F1-4178-9122-026B9B6148AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{DC7E98C0-A8F1-4178-9122-026B9B6148AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{DC7E98C0-A8F1-4178-9122-026B9B6148AC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{491A4B32-0EE8-4DC8-9C53-DACD904BA142}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{491A4B32-0EE8-4DC8-9C53-DACD904BA142}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{491A4B32-0EE8-4DC8-9C53-DACD904BA142}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{491A4B32-0EE8-4DC8-9C53-DACD904BA142}.Release|Any CPU.Build.0 = Release|Any CPU
+		{226BB4D9-F34A-4A8A-A63D-482FA3C5E011}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{226BB4D9-F34A-4A8A-A63D-482FA3C5E011}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{226BB4D9-F34A-4A8A-A63D-482FA3C5E011}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{226BB4D9-F34A-4A8A-A63D-482FA3C5E011}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 0 - 39
ZonyLrcDownLoad 4/Form1.Designer.cs

@@ -1,39 +0,0 @@
-namespace ZonyLrcDownLoad_4
-{
-    partial class Form1
-    {
-        /// <summary>
-        /// 必需的设计器变量。
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// 清理所有正在使用的资源。
-        /// </summary>
-        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows 窗体设计器生成的代码
-
-        /// <summary>
-        /// 设计器支持所需的方法 - 不要修改
-        /// 使用代码编辑器修改此方法的内容。
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.components = new System.ComponentModel.Container();
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.Text = "Form1";
-        }
-
-        #endregion
-    }
-}
-

+ 27 - 0
ZonyLrcDownLoad 4/Plugins/BasePlugins.cs

@@ -0,0 +1,27 @@
+/*
+ * 描述:底层插件基类.
+ * 作者:Zony
+ * 创建日期:2016/10/05
+ * 最后修改日期:2016/10/05
+ * 版本:v1.0
+ */
+using LibPlugins;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ZonyLrcDownLoad_4.Plugins
+{
+    /// <summary>
+    /// 底层插件基类
+    /// </summary>
+    public class BasePlugins<T> where T : class
+    {
+        public List<T> Plugins { get; }
+        public List<PluginsInfo> PluginInfos {get;}
+
+
+    }
+}

+ 45 - 0
ZonyLrcDownLoad 4/Plugins/LuaPlugManager.cs

@@ -0,0 +1,45 @@
+/*
+ * 描述:Lua歌词源插件管理器。
+ * 作者:Zony
+ * 创建日期:2016/10/05
+ * 最后修改日期:2016/10/05
+ * 版本:v1.0
+ */
+using Neo.IronLua;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ZonyLrcDownLoad_4.Plugins
+{
+    /// <summary>
+    /// Lua歌词源插件管理器
+    /// </summary>
+    public static class LuaPlugManager
+    {
+        private static Lua m_manager;
+
+        static LuaPlugManager()
+        {
+            m_manager = new Lua();
+        }
+
+        /// <summary>
+        /// 加载歌词源插件
+        /// </summary>
+        public static void LoadPlugins()
+        {
+            string _dir = Environment.CurrentDirectory + @"\Plugins";
+            string[] _luaFiles = Directory.GetFiles(_dir, @"*.dow");
+            
+        }
+
+        private static void LoadPluginsInfo()
+        {
+            
+        }
+    }
+}

+ 2 - 1
ZonyLrcDownLoad 4/Program.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using ZonyLrcDownLoad_4.Windows;
 
 namespace ZonyLrcDownLoad_4
 {
@@ -16,7 +17,7 @@ namespace ZonyLrcDownLoad_4
         {
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
-            Application.Run(new Form1());
+            Application.Run(new WindowMain());
         }
     }
 }

+ 73 - 0
ZonyLrcDownLoad 4/Utils/FileUtils.cs

@@ -0,0 +1,73 @@
+/*
+ * 描述:文件操作辅助类。
+ * 作者:Zony
+ * 创建日期:2016/10/05
+ * 最后修改日期:2016/10/05
+ * 版本:v1.0
+ */
+using System.Collections.Generic;
+using System.IO;
+
+namespace ZonyLrcDownLoad_4.Utils
+{
+    /// <summary>
+    /// 文件操作辅助类
+    /// </summary>
+    public static class FileUtils
+    {
+        /// <summary>
+        /// 搜索文件,可指定多扩展名称
+        /// </summary>
+        /// <param name="rseultList">填充的路径键值对</param>
+        /// <param name="searchPath">目标搜索路径</param>
+        /// <param name="suffix">后缀名集合</param>
+        /// <returns></returns>
+        public static bool SearchFiles(ref Dictionary<int, string> rseultList,string searchPath,List<string> suffix)
+        {
+            int _count = 0;
+            int _invaildCount = 0;
+            
+            if(!Directory.Exists(searchPath))
+            {
+                return false;
+            }
+
+            try
+            {
+                foreach(string ext in suffix)
+                {
+                    string[] _files = Directory.GetFiles(searchPath, ext, SearchOption.AllDirectories);
+                    
+                    if(_files.Length > 0)
+                    {
+                        for(int i =0;i<_files.Length;i++,_count++)
+                        {
+                            rseultList.Add(_count, _files[i]);
+                        }
+                    }
+                    else
+                    {
+                        _invaildCount++;
+                    }
+                }
+
+                // 如果没有找到所有指定扩展的文件
+                if(_invaildCount == suffix.Count)
+                {
+                    return false;
+                }
+
+                return true;
+            }
+            catch
+            {
+            	return false;
+            }
+        }
+
+        public static bool WriteFile()
+        {
+            return false;
+        }
+    }
+}

+ 136 - 0
ZonyLrcDownLoad 4/Windows/WindowDiscuz.Designer.cs

@@ -0,0 +1,136 @@
+namespace ZonyLrcDownLoad_4.Windows
+{
+    partial class WindowDiscuz
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.textBox_DiscuzText = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.radioButton1 = new System.Windows.Forms.RadioButton();
+            this.radioButton2 = new System.Windows.Forms.RadioButton();
+            this.label2 = new System.Windows.Forms.Label();
+            this.textBox1 = new System.Windows.Forms.TextBox();
+            this.button1 = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // textBox_DiscuzText
+            // 
+            this.textBox_DiscuzText.Location = new System.Drawing.Point(12, 24);
+            this.textBox_DiscuzText.Multiline = true;
+            this.textBox_DiscuzText.Name = "textBox_DiscuzText";
+            this.textBox_DiscuzText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+            this.textBox_DiscuzText.Size = new System.Drawing.Size(499, 203);
+            this.textBox_DiscuzText.TabIndex = 0;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(12, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(59, 12);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "反馈内容:";
+            // 
+            // radioButton1
+            // 
+            this.radioButton1.AutoSize = true;
+            this.radioButton1.Location = new System.Drawing.Point(12, 233);
+            this.radioButton1.Name = "radioButton1";
+            this.radioButton1.Size = new System.Drawing.Size(89, 16);
+            this.radioButton1.TabIndex = 2;
+            this.radioButton1.TabStop = true;
+            this.radioButton1.Text = "BUG信息反馈";
+            this.radioButton1.UseVisualStyleBackColor = true;
+            // 
+            // radioButton2
+            // 
+            this.radioButton2.AutoSize = true;
+            this.radioButton2.Location = new System.Drawing.Point(107, 233);
+            this.radioButton2.Name = "radioButton2";
+            this.radioButton2.Size = new System.Drawing.Size(71, 16);
+            this.radioButton2.TabIndex = 2;
+            this.radioButton2.TabStop = true;
+            this.radioButton2.Text = "改进建议";
+            this.radioButton2.UseVisualStyleBackColor = true;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(10, 258);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(119, 12);
+            this.label2.TabIndex = 3;
+            this.label2.Text = "联系方式(QQ/Email):";
+            // 
+            // textBox1
+            // 
+            this.textBox1.Location = new System.Drawing.Point(135, 255);
+            this.textBox1.Name = "textBox1";
+            this.textBox1.Size = new System.Drawing.Size(166, 21);
+            this.textBox1.TabIndex = 4;
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(436, 253);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 5;
+            this.button1.Text = "提交反馈";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // WindowDiscuz
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(523, 289);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.textBox1);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.radioButton2);
+            this.Controls.Add(this.radioButton1);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.textBox_DiscuzText);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.Name = "WindowDiscuz";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "反馈信息";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox textBox_DiscuzText;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.RadioButton radioButton1;
+        private System.Windows.Forms.RadioButton radioButton2;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.Button button1;
+    }
+}

+ 3 - 3
ZonyLrcDownLoad 4/Form1.cs

@@ -8,11 +8,11 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 
-namespace ZonyLrcDownLoad_4
+namespace ZonyLrcDownLoad_4.Windows
 {
-    public partial class Form1 : Form
+    public partial class WindowDiscuz : Form
     {
-        public Form1()
+        public WindowDiscuz()
         {
             InitializeComponent();
         }

+ 120 - 0
ZonyLrcDownLoad 4/Windows/WindowDiscuz.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 166 - 0
ZonyLrcDownLoad 4/Windows/WindowDonate.Designer.cs

@@ -0,0 +1,166 @@
+namespace ZonyLrcDownLoad_4.Windows
+{
+    partial class WindowDonate
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.button1 = new System.Windows.Forms.Button();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.textBox1 = new System.Windows.Forms.TextBox();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox3.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(77, 327);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 7;
+            this.button1.Text = "确定";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Controls.Add(this.label4);
+            this.groupBox3.Controls.Add(this.label3);
+            this.groupBox3.Controls.Add(this.label2);
+            this.groupBox3.Location = new System.Drawing.Point(21, 225);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(200, 96);
+            this.groupBox3.TabIndex = 6;
+            this.groupBox3.TabStop = false;
+            this.groupBox3.Text = "作者信息";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(16, 70);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(161, 12);
+            this.label4.TabIndex = 2;
+            this.label4.Text = "支付宝:mo1995106@gmail.com";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(28, 49);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(137, 12);
+            this.label3.TabIndex = 1;
+            this.label3.Text = "E-mail:zony@myzony.com";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(54, 27);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(77, 12);
+            this.label2.TabIndex = 0;
+            this.label2.Text = "QQ:243387971";
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Controls.Add(this.textBox1);
+            this.groupBox2.Location = new System.Drawing.Point(21, 84);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(200, 135);
+            this.groupBox2.TabIndex = 5;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "十分感谢以下捐赠者";
+            // 
+            // textBox1
+            // 
+            this.textBox1.BackColor = System.Drawing.SystemColors.Control;
+            this.textBox1.Location = new System.Drawing.Point(8, 20);
+            this.textBox1.Multiline = true;
+            this.textBox1.Name = "textBox1";
+            this.textBox1.ReadOnly = true;
+            this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.textBox1.Size = new System.Drawing.Size(186, 109);
+            this.textBox1.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(21, 13);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(200, 65);
+            this.groupBox1.TabIndex = 4;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "作者的话";
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(6, 17);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(188, 42);
+            this.label1.TabIndex = 2;
+            this.label1.Text = "如果您觉得本工具帮助到您了,可以选择捐赠作者来让工具更加完善,作者也十分感谢您的支持。";
+            // 
+            // WindowDonate
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(242, 362);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.groupBox3);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.Name = "WindowDonate";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "捐赠";
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            this.groupBox1.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label1;
+    }
+}

+ 20 - 0
ZonyLrcDownLoad 4/Windows/WindowDonate.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ZonyLrcDownLoad_4.Windows
+{
+    public partial class WindowDonate : Form
+    {
+        public WindowDonate()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 120 - 0
ZonyLrcDownLoad 4/Windows/WindowDonate.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 198 - 0
ZonyLrcDownLoad 4/Windows/WindowMain.Designer.cs

@@ -0,0 +1,198 @@
+namespace ZonyLrcDownLoad_4.Windows
+{
+    partial class WindowMain
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WindowMain));
+            this.toolStrip_TopMenu = new System.Windows.Forms.ToolStrip();
+            this.toolStripButton_Search = new System.Windows.Forms.ToolStripButton();
+            this.toolStripButton_DownLoad = new System.Windows.Forms.ToolStripButton();
+            this.toolStripButton_Setting = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.toolStripButton_Discuz = new System.Windows.Forms.ToolStripButton();
+            this.toolStripButton_Donate = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.toolStripButton_Plugins = new System.Windows.Forms.ToolStripButton();
+            this.listView_Mp3Files = new System.Windows.Forms.ListView();
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+            this.toolStripStatusLabel_State = new System.Windows.Forms.ToolStripStatusLabel();
+            this.toolStripProgressBar_DownProgress = new System.Windows.Forms.ToolStripProgressBar();
+            this.toolStrip_TopMenu.SuspendLayout();
+            this.statusStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // toolStrip_TopMenu
+            // 
+            this.toolStrip_TopMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripButton_Search,
+            this.toolStripButton_DownLoad,
+            this.toolStripButton_Setting,
+            this.toolStripSeparator1,
+            this.toolStripButton_Discuz,
+            this.toolStripButton_Donate,
+            this.toolStripSeparator2,
+            this.toolStripButton_Plugins});
+            this.toolStrip_TopMenu.Location = new System.Drawing.Point(0, 0);
+            this.toolStrip_TopMenu.Name = "toolStrip_TopMenu";
+            this.toolStrip_TopMenu.Size = new System.Drawing.Size(575, 25);
+            this.toolStrip_TopMenu.TabIndex = 0;
+            this.toolStrip_TopMenu.Text = "toolStrip1";
+            // 
+            // toolStripButton_Search
+            // 
+            this.toolStripButton_Search.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton_Search.Image")));
+            this.toolStripButton_Search.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButton_Search.Name = "toolStripButton_Search";
+            this.toolStripButton_Search.Size = new System.Drawing.Size(76, 22);
+            this.toolStripButton_Search.Text = "扫描目录";
+            // 
+            // toolStripButton_DownLoad
+            // 
+            this.toolStripButton_DownLoad.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton_DownLoad.Image")));
+            this.toolStripButton_DownLoad.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButton_DownLoad.Name = "toolStripButton_DownLoad";
+            this.toolStripButton_DownLoad.Size = new System.Drawing.Size(76, 22);
+            this.toolStripButton_DownLoad.Text = "下载歌词";
+            // 
+            // toolStripButton_Setting
+            // 
+            this.toolStripButton_Setting.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton_Setting.Image")));
+            this.toolStripButton_Setting.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButton_Setting.Name = "toolStripButton_Setting";
+            this.toolStripButton_Setting.Size = new System.Drawing.Size(52, 22);
+            this.toolStripButton_Setting.Text = "设置";
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+            // 
+            // toolStripButton_Discuz
+            // 
+            this.toolStripButton_Discuz.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton_Discuz.Image")));
+            this.toolStripButton_Discuz.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButton_Discuz.Name = "toolStripButton_Discuz";
+            this.toolStripButton_Discuz.Size = new System.Drawing.Size(76, 22);
+            this.toolStripButton_Discuz.Text = "反馈信息";
+            this.toolStripButton_Discuz.Click += new System.EventHandler(this.toolStripButton_Discuz_Click);
+            // 
+            // toolStripButton_Donate
+            // 
+            this.toolStripButton_Donate.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton_Donate.Image")));
+            this.toolStripButton_Donate.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButton_Donate.Name = "toolStripButton_Donate";
+            this.toolStripButton_Donate.Size = new System.Drawing.Size(52, 22);
+            this.toolStripButton_Donate.Text = "捐赠";
+            this.toolStripButton_Donate.Click += new System.EventHandler(this.toolStripButton_Donate_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+            // 
+            // toolStripButton_Plugins
+            // 
+            this.toolStripButton_Plugins.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton_Plugins.Image")));
+            this.toolStripButton_Plugins.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.toolStripButton_Plugins.Name = "toolStripButton_Plugins";
+            this.toolStripButton_Plugins.Size = new System.Drawing.Size(52, 22);
+            this.toolStripButton_Plugins.Text = "插件";
+            this.toolStripButton_Plugins.Click += new System.EventHandler(this.toolStripButton_Plugins_Click);
+            // 
+            // listView_Mp3Files
+            // 
+            this.listView_Mp3Files.Location = new System.Drawing.Point(12, 28);
+            this.listView_Mp3Files.Name = "listView_Mp3Files";
+            this.listView_Mp3Files.Size = new System.Drawing.Size(551, 410);
+            this.listView_Mp3Files.TabIndex = 1;
+            this.listView_Mp3Files.UseCompatibleStateImageBehavior = false;
+            // 
+            // statusStrip1
+            // 
+            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripStatusLabel_State,
+            this.toolStripProgressBar_DownProgress});
+            this.statusStrip1.Location = new System.Drawing.Point(0, 450);
+            this.statusStrip1.Name = "statusStrip1";
+            this.statusStrip1.Size = new System.Drawing.Size(575, 22);
+            this.statusStrip1.TabIndex = 2;
+            this.statusStrip1.Text = "statusStrip1";
+            // 
+            // toolStripStatusLabel_State
+            // 
+            this.toolStripStatusLabel_State.AutoSize = false;
+            this.toolStripStatusLabel_State.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+            this.toolStripStatusLabel_State.Name = "toolStripStatusLabel_State";
+            this.toolStripStatusLabel_State.Size = new System.Drawing.Size(450, 17);
+            this.toolStripStatusLabel_State.Text = "状态:";
+            this.toolStripStatusLabel_State.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // toolStripProgressBar_DownProgress
+            // 
+            this.toolStripProgressBar_DownProgress.Name = "toolStripProgressBar_DownProgress";
+            this.toolStripProgressBar_DownProgress.Size = new System.Drawing.Size(100, 16);
+            // 
+            // WindowMain
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(575, 472);
+            this.Controls.Add(this.statusStrip1);
+            this.Controls.Add(this.listView_Mp3Files);
+            this.Controls.Add(this.toolStrip_TopMenu);
+            this.Name = "WindowMain";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "ZonyLrcDownLoad 4";
+            this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.WindowMain_FormClosed);
+            this.Load += new System.EventHandler(this.WindowMain_Load);
+            this.toolStrip_TopMenu.ResumeLayout(false);
+            this.toolStrip_TopMenu.PerformLayout();
+            this.statusStrip1.ResumeLayout(false);
+            this.statusStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ToolStrip toolStrip_TopMenu;
+        private System.Windows.Forms.ToolStripButton toolStripButton_Search;
+        private System.Windows.Forms.ToolStripButton toolStripButton_DownLoad;
+        private System.Windows.Forms.ToolStripButton toolStripButton_Setting;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripButton toolStripButton_Discuz;
+        private System.Windows.Forms.ToolStripButton toolStripButton_Donate;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private System.Windows.Forms.ToolStripButton toolStripButton_Plugins;
+        private System.Windows.Forms.ListView listView_Mp3Files;
+        private System.Windows.Forms.StatusStrip statusStrip1;
+        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_State;
+        private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar_DownProgress;
+    }
+}

+ 47 - 0
ZonyLrcDownLoad 4/Windows/WindowMain.cs

@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ZonyLrcDownLoad_4.Windows
+{
+    public partial class WindowMain : Form
+    {
+        public WindowMain()
+        {
+            InitializeComponent();
+        }
+
+        #region 界面交互
+        private void WindowMain_Load(object sender, EventArgs e)
+        {
+            CheckForIllegalCrossThreadCalls = false;
+        }
+
+        private void WindowMain_FormClosed(object sender, FormClosedEventArgs e)
+        {
+            Environment.Exit(0);
+        }
+
+        private void toolStripButton_Plugins_Click(object sender, EventArgs e)
+        {
+            new WindowPlugins().Show();
+        }
+
+        private void toolStripButton_Donate_Click(object sender, EventArgs e)
+        {
+            new WindowDonate().Show();
+        }
+
+        private void toolStripButton_Discuz_Click(object sender, EventArgs e)
+        {
+            new WindowDiscuz().Show();
+        }
+        #endregion
+    }
+}

+ 183 - 0
ZonyLrcDownLoad 4/Windows/WindowMain.resx

@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStrip_TopMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="toolStripButton_Search.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAD5SURBVDhPjVNLDoIwEOV67ryBB9AbeAM3bl2ydmlYuDGK
+        CYgYEUKImEjiTca8Om2YtEVeMqEz7bz5ErhQvTo6ZAXtTilF8YX2yY0e7Zv42g84RnFG+LLJoOk+6i6v
+        WzdRWjYEYdULEBzzUr5DRJfztl5SWCwsO0hEJqiTjwKr84QgrAqgL+qA6K6agXUy9RIAKgt0m3UL/wjQ
+        VJE+aoaTFl1C3xbe5+Y9xiwIcKmdfLLJZ5LANMMBnQWrFlQJ2DAsCdsEdFRWLZjRKyYHhjIQmWMc1/pp
+        PURP+jVrOBdv7CrD2ds3ZDHUVNyNCaJKQl8wpt8vnXkcg+AL3mUcUn5wdXsAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="toolStripButton_DownLoad.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACZSURBVDhPY8AHFDZ9+Q/CUC5pAFmjwFo8hhw5d+X/hn1H
+        UTBInHklQhOMveXgcRR1e0+e+88A04AOsBmADsB6sRkAcj66AdjCAqsB+AINPSxINoB7DREGgID4BkxD
+        iPYCDCAbgstVeA0AAZCf0Z2NDAgaQAigGDDlzM//pGCsBoBoYgBOA0jBGAaQA8B6QRkCxCAH7zh6+j8A
+        fyky1oE2SOcAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="toolStripButton_Setting.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADESURBVDhPYwCBtNqO/yF5VUThpKrW/2BNMADSDGUSDWJK
+        GhB6QKZCmUSDiMJa7AZsOnDs/4Z9R//joqHKaOwCfBiqDLcBxAKKXYACyHFB7fnP/yXWf4How+cCqDAK
+        qLr48z/rqi//mVd8BtMkuaDh8g+4WpAB7vu/EW8AyGYoEwxijn+H8IkxANlmEEg6CbQZBogxIPMMwoCU
+        U6iGMWDkLjQAsg3kX5AXUGxGBqC0DUoc6Hjqxr3/jbd//u+wF4dGBgYGAFqq8fZ23+rxAAAAAElFTkSu
+        QmCC
+</value>
+  </data>
+  <data name="toolStripButton_Discuz.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADASURBVDhPYxgcYNGG7f8TK1v+hxfU/I8orCVIR5fU/5+x
+        Yv1/uObq/hkQDgmgbebC/xMXrfzPALIZKkYyALmIISSvCm7A1kMnCBqGrAbkHRQDQGDvyXP/z1y9iWHQ
+        xZt3/+84ehpFHMMFMHDk3JX/IIOgXAw+DGB1AQiAnAlyBYgG2QpjQ6XhAKsL8IUDuhyGC/BphgFkNWAX
+        gBIFlE8yALsAlKJAiQIqRjQAJSK4PhAHZBoIg1xEDE2OpbQADAwA+DS/ZFPcUOUAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="toolStripButton_Donate.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACNSURBVDhPnZGxCoAwDET9LnFws4iDIJ38/y+wnasHBVOb
+        NKkPCq0kd2cySMRzT+FwKT/7oI3Rr30inKs5SatQFbG4iDXmiA9VLaadr2YKkR53SrGdvyJhm98+bd/4
+        1W9NWMayR0pC50RdKwHAJaHfLje1BQCXBM60GYgCQJsJaAoAbTuqAEB0FHIn+jXdGrt0TVPpMA0AAAAA
+        SUVORK5CYII=
+</value>
+  </data>
+  <data name="toolStripButton_Plugins.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACVSURBVDhPY8AG5q/b8j+urBGMF67f+h8qTByYvmzd/5Zp
+        8+GaaifO+g8yEMolDCIKazEUg1wCZRIG2AwIzasi3YDsxh64JpgByGI4AcyAsIIaDAOIcsmoAQgDkBWT
+        ZUBF77T/ffOXgzEoNYLEiDIA2enoAGY4XlDVNwOnIuQ8ghdgS/sk5QcQKO+Z+h/kHRDG7SoGBgAXvYYT
+        7VHWFgAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>182, 17</value>
+  </metadata>
+</root>

+ 174 - 0
ZonyLrcDownLoad 4/Windows/WindowPlugins.Designer.cs

@@ -0,0 +1,174 @@
+namespace ZonyLrcDownLoad_4.Windows
+{
+    partial class WindowPlugins
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.listView1 = new System.Windows.Forms.ListView();
+            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.listView2 = new System.Windows.Forms.ListView();
+            this.button1 = new System.Windows.Forms.Button();
+            this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.SuspendLayout();
+            // 
+            // listView1
+            // 
+            this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1,
+            this.columnHeader2,
+            this.columnHeader3,
+            this.columnHeader4});
+            this.listView1.Location = new System.Drawing.Point(12, 212);
+            this.listView1.Name = "listView1";
+            this.listView1.Size = new System.Drawing.Size(480, 196);
+            this.listView1.TabIndex = 0;
+            this.listView1.UseCompatibleStateImageBehavior = false;
+            this.listView1.View = System.Windows.Forms.View.Details;
+            // 
+            // columnHeader1
+            // 
+            this.columnHeader1.Text = "插件名称";
+            this.columnHeader1.Width = 164;
+            // 
+            // columnHeader2
+            // 
+            this.columnHeader2.Text = "版本";
+            // 
+            // columnHeader3
+            // 
+            this.columnHeader3.Text = "作者";
+            this.columnHeader3.Width = 76;
+            // 
+            // columnHeader4
+            // 
+            this.columnHeader4.Text = "描述";
+            this.columnHeader4.Width = 234;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(10, 197);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(59, 12);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "底层插件:";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(10, 9);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(83, 12);
+            this.label2.TabIndex = 2;
+            this.label2.Text = "歌词下载插件:";
+            // 
+            // listView2
+            // 
+            this.listView2.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader5,
+            this.columnHeader6,
+            this.columnHeader7,
+            this.columnHeader8});
+            this.listView2.Location = new System.Drawing.Point(12, 24);
+            this.listView2.Name = "listView2";
+            this.listView2.Size = new System.Drawing.Size(480, 170);
+            this.listView2.TabIndex = 3;
+            this.listView2.UseCompatibleStateImageBehavior = false;
+            this.listView2.View = System.Windows.Forms.View.Details;
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(201, 414);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(82, 32);
+            this.button1.TabIndex = 4;
+            this.button1.Text = "保存";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // columnHeader5
+            // 
+            this.columnHeader5.Text = "歌词源";
+            this.columnHeader5.Width = 105;
+            // 
+            // columnHeader6
+            // 
+            this.columnHeader6.Text = "版本";
+            // 
+            // columnHeader7
+            // 
+            this.columnHeader7.Text = "作者";
+            this.columnHeader7.Width = 76;
+            // 
+            // columnHeader8
+            // 
+            this.columnHeader8.Text = "描述";
+            this.columnHeader8.Width = 234;
+            // 
+            // WindowPlugins
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(504, 450);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.listView2);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.listView1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.Name = "WindowPlugins";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "WindowPlugins";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ListView listView1;
+        private System.Windows.Forms.ColumnHeader columnHeader1;
+        private System.Windows.Forms.ColumnHeader columnHeader2;
+        private System.Windows.Forms.ColumnHeader columnHeader3;
+        private System.Windows.Forms.ColumnHeader columnHeader4;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.ListView listView2;
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.ColumnHeader columnHeader5;
+        private System.Windows.Forms.ColumnHeader columnHeader6;
+        private System.Windows.Forms.ColumnHeader columnHeader7;
+        private System.Windows.Forms.ColumnHeader columnHeader8;
+    }
+}

+ 20 - 0
ZonyLrcDownLoad 4/Windows/WindowPlugins.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ZonyLrcDownLoad_4.Windows
+{
+    public partial class WindowPlugins : Form
+    {
+        public WindowPlugins()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 120 - 0
ZonyLrcDownLoad 4/Windows/WindowPlugins.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 61 - 5
ZonyLrcDownLoad 4/ZonyLrcDownLoad 4.csproj

@@ -33,6 +33,18 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Neo.Lua, Version=5.3.0.0, Culture=neutral, PublicKeyToken=fdb0cd4fe8a6e3b2, processorArchitecture=MSIL">
+      <HintPath>..\packages\NeoLua.1.2.8\lib\net45\Neo.Lua.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Neo.Lua.Desktop, Version=5.3.0.0, Culture=neutral, PublicKeyToken=fdb0cd4fe8a6e3b2, processorArchitecture=MSIL">
+      <HintPath>..\packages\NeoLua.1.2.8\lib\net45\Neo.Lua.Desktop.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />
@@ -46,14 +58,35 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Form1.cs">
+    <Compile Include="Plugins\BasePlugins.cs" />
+    <Compile Include="Plugins\LuaPlugManager.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Utils\FileUtils.cs" />
+    <Compile Include="Windows\WindowDiscuz.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Include="Form1.Designer.cs">
-      <DependentUpon>Form1.cs</DependentUpon>
+    <Compile Include="Windows\WindowDiscuz.Designer.cs">
+      <DependentUpon>WindowDiscuz.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Windows\WindowDonate.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Windows\WindowDonate.Designer.cs">
+      <DependentUpon>WindowDonate.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Windows\WindowMain.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Windows\WindowMain.Designer.cs">
+      <DependentUpon>WindowMain.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Windows\WindowPlugins.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Windows\WindowPlugins.Designer.cs">
+      <DependentUpon>WindowPlugins.cs</DependentUpon>
     </Compile>
-    <Compile Include="Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
@@ -63,6 +96,19 @@
       <AutoGen>True</AutoGen>
       <DependentUpon>Resources.resx</DependentUpon>
     </Compile>
+    <EmbeddedResource Include="Windows\WindowDiscuz.resx">
+      <DependentUpon>WindowDiscuz.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Windows\WindowDonate.resx">
+      <DependentUpon>WindowDonate.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Windows\WindowMain.resx">
+      <DependentUpon>WindowMain.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Windows\WindowPlugins.resx">
+      <DependentUpon>WindowPlugins.cs</DependentUpon>
+    </EmbeddedResource>
+    <None Include="packages.config" />
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -76,6 +122,16 @@
   <ItemGroup>
     <None Include="App.config" />
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\LibNet\LibNet.csproj">
+      <Project>{226bb4d9-f34a-4a8a-a63d-482fa3c5e011}</Project>
+      <Name>LibNet</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\LibPlugins\LibPlugins.csproj">
+      <Project>{491a4b32-0ee8-4dc8-9c53-dacd904ba142}</Project>
+      <Name>LibPlugins</Name>
+    </ProjectReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.

+ 5 - 0
ZonyLrcDownLoad 4/packages.config

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NeoLua" version="1.2.8" targetFramework="net452" />
+  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
+</packages>