From 89ded427ce3fa3e2428ad22b557b6bfe69c17e61 Mon Sep 17 00:00:00 2001 From: sinspired Date: Sat, 23 Aug 2025 21:17:56 +0800 Subject: [PATCH 01/92] =?UTF-8?q?perf:=20=E5=8A=A0=E5=BF=AB=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=9D=A1=E5=88=B7=E6=96=B0,=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 118 ++++++++++++++++++++++++++++++++++ Form1.Designer.cs | 2 +- 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..ab09315 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,118 @@ +name: Build and Release + +on: + push: + tags: + - 'v*' # 推送 tag 时触发,如 v1.0.0 + workflow_dispatch: # 允许手动触发 + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v2 + + - name: Setup NuGet + uses: NuGet/setup-nuget@v2 + + - name: Restore NuGet packages + run: nuget restore subs-check.win.gui.sln + + - name: Build project + run: msbuild subs-check.win.gui.csproj /p:Configuration=Release + + - name: Package artifact + run: | + mkdir release + cp -r bin/Release/*.exe bin/Release/*.dll release/ + shell: bash + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: subs-check-win + path: release/ + if-no-files-found: error # 如果没有文件,报错 + + release: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: subs-check-win + path: release + + - name: Prepare tags (delete local tags then fetch remote tags cleanly) + id: tags + run: | + # current tag 从触发环境取 + CURRENT_TAG="${GITHUB_REF#refs/tags/}" + echo "current_tag=$CURRENT_TAG" >> $GITHUB_OUTPUT + + # 找到上一个 tag(按创建时间倒序,排除当前) + PREV_TAG=$(git tag --sort=-creatordate | grep -v "^${CURRENT_TAG}$" | head -n1 || true) + echo "prev_tag=$PREV_TAG" >> $GITHUB_OUTPUT + shell: bash + + - name: Generate changelog (no file, put into step output) + id: changelog + run: | + CURRENT="${{ steps.tags.outputs.current_tag }}" + PREV="${{ steps.tags.outputs.prev_tag }}" + + if [ -z "$CURRENT" ]; then + echo "No current tag detected from GITHUB_REF; aborting changelog generation." >&2 + printf '%s\n' "body<> $GITHUB_OUTPUT + printf '%s\n' "## Changelog" >> $GITHUB_OUTPUT + printf '%s\n' "- Unable to determine current tag from environment." >> $GITHUB_OUTPUT + printf '%s\n' "EOF" >> $GITHUB_OUTPUT + exit 0 + fi + + # 尝试获取 tag 的日期(短格式),失败则忽略 + TAG_DATE=$(git log -1 --format=%ad --date=short "$CURRENT" 2>/dev/null || true) + + if [ -z "$PREV" ]; then + # 首次发布或没有上一个 tag:取最近 20 条提交(短哈希 + 标题 + 作者) + LOG=$(git log --pretty=format:'- %h %s (%an)' --no-merges -n 20) + else + LOG=$(git log --pretty=format:'- %h %s (%an)' --no-merges "$PREV".."$CURRENT") + fi + + if [ -z "$LOG" ]; then + LOG="- No notable changes found (commits may be merge/empty or follow a different convention)." + fi + + HEADER="## Changelog" + printf '%s\n' "body<> $GITHUB_OUTPUT + printf '%s\n' "$HEADER" >> $GITHUB_OUTPUT + printf '%s\n' "$LOG" >> $GITHUB_OUTPUT + printf '%s\n' "EOF" >> $GITHUB_OUTPUT + shell: bash + + - name: Create ZIP archive + run: | + cd release + zip -r subs-check-win.zip . + shell: bash # Zip the contents of the release directory + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + body: ${{ steps.changelog.outputs.body }} + files: release/subs-check-win.zip + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Form1.Designer.cs b/Form1.Designer.cs index ff3352c..4b6f68b 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -1422,7 +1422,7 @@ private void InitializeComponent() // // timer4 // - this.timer4.Interval = 1000; + this.timer4.Interval = 100; this.timer4.Tick += new System.EventHandler(this.timer4_Tick); // // Form1 From 77551dca22cf952b7b761b4bf76a63147c146a6d Mon Sep 17 00:00:00 2001 From: sinspired Date: Sun, 24 Aug 2025 23:28:22 +0800 Subject: [PATCH 02/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=AB=98dpi?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.manifest | 15 ++++++++ app1.manifest | 78 +++++++++++++++++++++++++++++++++++++++ subs-check.win.gui.csproj | 5 +++ 3 files changed, 98 insertions(+) create mode 100644 app.manifest create mode 100644 app1.manifest diff --git a/app.manifest b/app.manifest new file mode 100644 index 0000000..02907c0 --- /dev/null +++ b/app.manifest @@ -0,0 +1,15 @@ + + + + subs-check.win.gui + + + + + + true + + PerMonitorV2 + + + diff --git a/app1.manifest b/app1.manifest new file mode 100644 index 0000000..1c9790a --- /dev/null +++ b/app1.manifest @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index eae8cb8..cc238bf 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -39,6 +39,9 @@ subs_check.win.gui.Program + + app1.manifest + packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll @@ -113,6 +116,8 @@ Designer Resources.Designer.cs + + SettingsSingleFileGenerator From b1fb2c6f272e098bbccfc89e087193b38851ac01 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 25 Aug 2025 01:25:26 +0800 Subject: [PATCH 03/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E6=97=A5=E5=BF=97=E5=BC=82=E5=B8=B8=E9=87=8D=E7=BB=98?= =?UTF-8?q?=E9=97=AA=E7=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 356 +++++++++++++++++++++++-------------- Form1.cs | 363 ++++++++++++++++++++++++++------------ app.manifest | 89 ++++++++-- app1.manifest | 78 -------- subs-check.win.gui.csproj | 4 +- 5 files changed, 548 insertions(+), 342 deletions(-) delete mode 100644 app1.manifest diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 4b6f68b..42da483 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -154,9 +154,11 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.button2); this.groupBox1.Controls.Add(this.button1); this.groupBox1.Controls.Add(this.label8); - this.groupBox1.Location = new System.Drawing.Point(13, 13); + this.groupBox1.Location = new System.Drawing.Point(24, 23); + this.groupBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(174, 484); + this.groupBox1.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox1.Size = new System.Drawing.Size(319, 847); this.groupBox1.TabIndex = 0; this.groupBox1.TabStop = false; this.groupBox1.Text = "参数设置"; @@ -164,9 +166,10 @@ private void InitializeComponent() // checkBox5 // this.checkBox5.AutoSize = true; - this.checkBox5.Location = new System.Drawing.Point(91, 428); + this.checkBox5.Location = new System.Drawing.Point(167, 749); + this.checkBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox5.Name = "checkBox5"; - this.checkBox5.Size = new System.Drawing.Size(72, 16); + this.checkBox5.Size = new System.Drawing.Size(120, 25); this.checkBox5.TabIndex = 30; this.checkBox5.Text = "开机自启"; this.checkBox5.UseVisualStyleBackColor = true; @@ -175,9 +178,10 @@ private void InitializeComponent() // textBox11 // this.textBox11.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBox11.Location = new System.Drawing.Point(9, 343); + this.textBox11.Location = new System.Drawing.Point(16, 600); + this.textBox11.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox11.Name = "textBox11"; - this.textBox11.Size = new System.Drawing.Size(154, 21); + this.textBox11.Size = new System.Drawing.Size(281, 31); this.textBox11.TabIndex = 21; this.textBox11.Text = "0 */2 * * *"; this.textBox11.Visible = false; @@ -187,9 +191,10 @@ private void InitializeComponent() // button7 // this.button7.Enabled = false; - this.button7.Location = new System.Drawing.Point(7, 399); + this.button7.Location = new System.Drawing.Point(13, 698); + this.button7.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button7.Name = "button7"; - this.button7.Size = new System.Drawing.Size(75, 23); + this.button7.Size = new System.Drawing.Size(138, 40); this.button7.TabIndex = 30; this.button7.Text = "🔀未启动"; this.button7.UseVisualStyleBackColor = true; @@ -198,9 +203,10 @@ private void InitializeComponent() // button6 // this.button6.Enabled = false; - this.button6.Location = new System.Drawing.Point(88, 399); + this.button6.Location = new System.Drawing.Point(161, 698); + this.button6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button6.Name = "button6"; - this.button6.Size = new System.Drawing.Size(75, 23); + this.button6.Size = new System.Drawing.Size(138, 40); this.button6.TabIndex = 29; this.button6.Text = "访问WebUI"; this.button6.UseVisualStyleBackColor = true; @@ -213,17 +219,19 @@ private void InitializeComponent() this.comboBox4.Items.AddRange(new object[] { "通用订阅", "Clash"}); - this.comboBox4.Location = new System.Drawing.Point(8, 372); + this.comboBox4.Location = new System.Drawing.Point(15, 651); + this.comboBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox4.Name = "comboBox4"; - this.comboBox4.Size = new System.Drawing.Size(74, 20); + this.comboBox4.Size = new System.Drawing.Size(132, 29); this.comboBox4.TabIndex = 19; // // button3 // this.button3.Enabled = false; - this.button3.Location = new System.Drawing.Point(88, 370); + this.button3.Location = new System.Drawing.Point(161, 648); + this.button3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.Size = new System.Drawing.Size(138, 40); this.button3.TabIndex = 18; this.button3.Text = "复制订阅"; this.button3.UseVisualStyleBackColor = true; @@ -232,11 +240,12 @@ private void InitializeComponent() // textBox1 // this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBox1.Location = new System.Drawing.Point(9, 179); + this.textBox1.Location = new System.Drawing.Point(16, 313); + this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ReadOnly = true; - this.textBox1.Size = new System.Drawing.Size(154, 185); + this.textBox1.Size = new System.Drawing.Size(281, 322); this.textBox1.TabIndex = 17; this.textBox1.Text = resources.GetString("textBox1.Text"); this.textBox1.WordWrap = false; @@ -252,15 +261,17 @@ private void InitializeComponent() "gist", "r2", "webdav"}); - this.comboBox1.Location = new System.Drawing.Point(105, 135); + this.comboBox1.Location = new System.Drawing.Point(192, 236); + this.comboBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(58, 20); + this.comboBox1.Size = new System.Drawing.Size(103, 29); this.comboBox1.TabIndex = 16; this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); // // numericUpDown4 // - this.numericUpDown4.Location = new System.Drawing.Point(105, 106); + this.numericUpDown4.Location = new System.Drawing.Point(192, 186); + this.numericUpDown4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown4.Maximum = new decimal(new int[] { 20480, 0, @@ -272,7 +283,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown4.Name = "numericUpDown4"; - this.numericUpDown4.Size = new System.Drawing.Size(58, 21); + this.numericUpDown4.Size = new System.Drawing.Size(106, 31); this.numericUpDown4.TabIndex = 13; this.numericUpDown4.Value = new decimal(new int[] { 1024, @@ -283,7 +294,8 @@ private void InitializeComponent() // // numericUpDown3 // - this.numericUpDown3.Location = new System.Drawing.Point(105, 77); + this.numericUpDown3.Location = new System.Drawing.Point(192, 135); + this.numericUpDown3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown3.Maximum = new decimal(new int[] { 10000, 0, @@ -295,7 +307,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown3.Name = "numericUpDown3"; - this.numericUpDown3.Size = new System.Drawing.Size(58, 21); + this.numericUpDown3.Size = new System.Drawing.Size(106, 31); this.numericUpDown3.TabIndex = 12; this.numericUpDown3.Value = new decimal(new int[] { 5000, @@ -306,7 +318,8 @@ private void InitializeComponent() // // numericUpDown2 // - this.numericUpDown2.Location = new System.Drawing.Point(105, 48); + this.numericUpDown2.Location = new System.Drawing.Point(192, 84); + this.numericUpDown2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown2.Maximum = new decimal(new int[] { 1440, 0, @@ -318,7 +331,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown2.Name = "numericUpDown2"; - this.numericUpDown2.Size = new System.Drawing.Size(58, 21); + this.numericUpDown2.Size = new System.Drawing.Size(106, 31); this.numericUpDown2.TabIndex = 11; this.numericUpDown2.Value = new decimal(new int[] { 120, @@ -329,7 +342,8 @@ private void InitializeComponent() // // numericUpDown1 // - this.numericUpDown1.Location = new System.Drawing.Point(105, 19); + this.numericUpDown1.Location = new System.Drawing.Point(192, 33); + this.numericUpDown1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown1.Maximum = new decimal(new int[] { 1024, 0, @@ -341,7 +355,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown1.Name = "numericUpDown1"; - this.numericUpDown1.Size = new System.Drawing.Size(58, 21); + this.numericUpDown1.Size = new System.Drawing.Size(106, 31); this.numericUpDown1.TabIndex = 10; this.numericUpDown1.Value = new decimal(new int[] { 32, @@ -353,36 +367,40 @@ private void InitializeComponent() // label7 // this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(7, 137); + this.label7.Location = new System.Drawing.Point(13, 240); + this.label7.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(65, 12); + this.label7.Size = new System.Drawing.Size(115, 21); this.label7.TabIndex = 8; this.label7.Text = "保存方法:"; // // label6 // this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(7, 108); + this.label6.Location = new System.Drawing.Point(13, 189); + this.label6.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(101, 12); + this.label6.Size = new System.Drawing.Size(181, 21); this.label6.TabIndex = 5; this.label6.Text = "测速下限(KB/s):"; // // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(7, 79); + this.label3.Location = new System.Drawing.Point(13, 138); + this.label3.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(101, 12); + this.label3.Size = new System.Drawing.Size(179, 21); this.label3.TabIndex = 4; this.label3.Text = "超时时间(毫秒):"; // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(7, 50); + this.label2.Location = new System.Drawing.Point(13, 88); + this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(101, 12); + this.label2.Size = new System.Drawing.Size(179, 21); this.label2.TabIndex = 3; this.label2.Text = "检查间隔(分钟):"; this.label2.DoubleClick += new System.EventHandler(this.切换cron表达式); @@ -390,17 +408,19 @@ private void InitializeComponent() // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(7, 21); + this.label1.Location = new System.Drawing.Point(13, 37); + this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(77, 12); + this.label1.Size = new System.Drawing.Size(136, 21); this.label1.TabIndex = 2; this.label1.Text = "并发线程数:"; // // button2 // - this.button2.Location = new System.Drawing.Point(88, 450); + this.button2.Location = new System.Drawing.Point(161, 788); + this.button2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.Size = new System.Drawing.Size(138, 40); this.button2.TabIndex = 1; this.button2.Text = "高级设置∧"; this.button2.UseVisualStyleBackColor = true; @@ -409,9 +429,10 @@ private void InitializeComponent() // button1 // this.button1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.button1.Location = new System.Drawing.Point(7, 428); + this.button1.Location = new System.Drawing.Point(13, 749); + this.button1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 45); + this.button1.Size = new System.Drawing.Size(138, 79); this.button1.TabIndex = 0; this.button1.Text = "▶️ 启动"; this.button1.UseVisualStyleBackColor = true; @@ -420,16 +441,18 @@ private void InitializeComponent() // label8 // this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(7, 164); + this.label8.Location = new System.Drawing.Point(13, 287); + this.label8.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(161, 12); + this.label8.Size = new System.Drawing.Size(284, 21); this.label8.TabIndex = 9; this.label8.Text = "节点池订阅链接(点击编辑):"; this.label8.Click += new System.EventHandler(this.textBox1_DoubleClick); // // numericUpDown6 // - this.numericUpDown6.Location = new System.Drawing.Point(281, 19); + this.numericUpDown6.Location = new System.Drawing.Point(515, 33); + this.numericUpDown6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown6.Maximum = new decimal(new int[] { 65535, 0, @@ -441,7 +464,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown6.Name = "numericUpDown6"; - this.numericUpDown6.Size = new System.Drawing.Size(58, 21); + this.numericUpDown6.Size = new System.Drawing.Size(106, 31); this.numericUpDown6.TabIndex = 15; this.numericUpDown6.Value = new decimal(new int[] { 8199, @@ -452,7 +475,8 @@ private void InitializeComponent() // // numericUpDown5 // - this.numericUpDown5.Location = new System.Drawing.Point(281, 45); + this.numericUpDown5.Location = new System.Drawing.Point(515, 79); + this.numericUpDown5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown5.Maximum = new decimal(new int[] { 10, 0, @@ -464,7 +488,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown5.Name = "numericUpDown5"; - this.numericUpDown5.Size = new System.Drawing.Size(58, 21); + this.numericUpDown5.Size = new System.Drawing.Size(106, 31); this.numericUpDown5.TabIndex = 14; this.numericUpDown5.Value = new decimal(new int[] { 10, @@ -475,24 +499,27 @@ private void InitializeComponent() // label4 // this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(191, 21); + this.label4.Location = new System.Drawing.Point(350, 37); + this.label4.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(89, 12); + this.label4.Size = new System.Drawing.Size(159, 21); this.label4.TabIndex = 7; this.label4.Text = "HTTP服务端口:"; // // label5 // this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(191, 48); + this.label5.Location = new System.Drawing.Point(350, 84); + this.label5.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(89, 12); + this.label5.Size = new System.Drawing.Size(158, 21); this.label5.TabIndex = 6; this.label5.Text = "测速时间(秒):"; // // numericUpDown7 // - this.numericUpDown7.Location = new System.Drawing.Point(441, 19); + this.numericUpDown7.Location = new System.Drawing.Point(808, 33); + this.numericUpDown7.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown7.Maximum = new decimal(new int[] { 65535, 0, @@ -504,7 +531,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown7.Name = "numericUpDown7"; - this.numericUpDown7.Size = new System.Drawing.Size(58, 21); + this.numericUpDown7.Size = new System.Drawing.Size(106, 31); this.numericUpDown7.TabIndex = 21; this.numericUpDown7.Value = new decimal(new int[] { 8299, @@ -516,30 +543,45 @@ private void InitializeComponent() // label20 // this.label20.AutoSize = true; - this.label20.Location = new System.Drawing.Point(345, 21); + this.label20.Location = new System.Drawing.Point(632, 37); + this.label20.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label20.Name = "label20"; - this.label20.Size = new System.Drawing.Size(95, 12); + this.label20.Size = new System.Drawing.Size(172, 21); this.label20.TabIndex = 20; this.label20.Text = "Sub-Store端口:"; // + // 进度显示标签,需在groupBox2 上方,避免groupBox2标题刷新导致日志界面无意义重绘 + // + this.LogLabelNodeInfo = new System.Windows.Forms.Label(); + this.LogLabelNodeInfo.AutoSize = true; + this.LogLabelNodeInfo.Location = new System.Drawing.Point(0, 0); // 放在标题右边 + this.LogLabelNodeInfo.Name = "LogLabelNodeInfo"; + this.LogLabelNodeInfo.Size = new System.Drawing.Size(0, 21); + this.LogLabelNodeInfo.TabIndex = 22; + this.LogLabelNodeInfo.Text = "实时日志"; + // // groupBox2 // this.groupBox2.Controls.Add(this.linkLabel1); this.groupBox2.Controls.Add(this.button5); this.groupBox2.Controls.Add(this.richTextBox1); - this.groupBox2.Location = new System.Drawing.Point(193, 13); + this.groupBox2.Location = new System.Drawing.Point(354, 23); + this.groupBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(600, 484); + this.groupBox2.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox2.Size = new System.Drawing.Size(1100, 847); this.groupBox2.TabIndex = 1; this.groupBox2.TabStop = false; - this.groupBox2.Text = "实时日志"; + this.groupBox2.Text = ""; + this.groupBox2.Controls.Add(this.LogLabelNodeInfo); // // linkLabel1 // this.linkLabel1.AutoSize = true; - this.linkLabel1.Location = new System.Drawing.Point(460, 2); + this.linkLabel1.Location = new System.Drawing.Point(843, 4); + this.linkLabel1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(137, 12); + this.linkLabel1.Size = new System.Drawing.Size(250, 21); this.linkLabel1.TabIndex = 21; this.linkLabel1.TabStop = true; this.linkLabel1.Text = "关于 SubsCheck Win GUI"; @@ -547,9 +589,10 @@ private void InitializeComponent() // // button5 // - this.button5.Location = new System.Drawing.Point(515, 450); + this.button5.Location = new System.Drawing.Point(944, 788); + this.button5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button5.Name = "button5"; - this.button5.Size = new System.Drawing.Size(75, 23); + this.button5.Size = new System.Drawing.Size(138, 40); this.button5.TabIndex = 20; this.button5.Text = "更新内核"; this.button5.UseVisualStyleBackColor = true; @@ -559,10 +602,11 @@ private void InitializeComponent() // richTextBox1 // this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.richTextBox1.Location = new System.Drawing.Point(3, 17); + this.richTextBox1.Location = new System.Drawing.Point(6, 29); + this.richTextBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.richTextBox1.Name = "richTextBox1"; this.richTextBox1.ReadOnly = true; - this.richTextBox1.Size = new System.Drawing.Size(594, 464); + this.richTextBox1.Size = new System.Drawing.Size(1088, 813); this.richTextBox1.TabIndex = 0; this.richTextBox1.Text = ""; this.richTextBox1.DoubleClick += new System.EventHandler(this.richTextBox1_DoubleClick); @@ -589,9 +633,11 @@ private void InitializeComponent() this.groupBox3.Controls.Add(this.label5); this.groupBox3.Controls.Add(this.numericUpDown7); this.groupBox3.Controls.Add(this.label20); - this.groupBox3.Location = new System.Drawing.Point(13, 503); + this.groupBox3.Location = new System.Drawing.Point(24, 880); + this.groupBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(780, 103); + this.groupBox3.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox3.Size = new System.Drawing.Size(1430, 180); this.groupBox3.TabIndex = 2; this.groupBox3.TabStop = false; this.groupBox3.Text = "高级设置"; @@ -599,9 +645,10 @@ private void InitializeComponent() // // button8 // - this.button8.Location = new System.Drawing.Point(695, 43); + this.button8.Location = new System.Drawing.Point(1274, 75); + this.button8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button8.Name = "button8"; - this.button8.Size = new System.Drawing.Size(75, 23); + this.button8.Size = new System.Drawing.Size(138, 40); this.button8.TabIndex = 29; this.button8.Text = "补充参数"; this.button8.UseVisualStyleBackColor = true; @@ -611,10 +658,11 @@ private void InitializeComponent() // this.textBox10.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.textBox10.Enabled = false; - this.textBox10.Location = new System.Drawing.Point(141, 73); + this.textBox10.Location = new System.Drawing.Point(258, 128); + this.textBox10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox10.Name = "textBox10"; this.textBox10.PasswordChar = '*'; - this.textBox10.Size = new System.Drawing.Size(110, 21); + this.textBox10.Size = new System.Drawing.Size(200, 31); this.textBox10.TabIndex = 6; this.textBox10.Text = "admin"; this.textBox10.Enter += new System.EventHandler(this.textBox10_Enter); @@ -623,9 +671,10 @@ private void InitializeComponent() // checkBox4 // this.checkBox4.AutoSize = true; - this.checkBox4.Location = new System.Drawing.Point(9, 75); + this.checkBox4.Location = new System.Drawing.Point(16, 131); + this.checkBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox4.Name = "checkBox4"; - this.checkBox4.Size = new System.Drawing.Size(138, 16); + this.checkBox4.Size = new System.Drawing.Size(240, 25); this.checkBox4.TabIndex = 28; this.checkBox4.Text = "启用WebUI API密钥:"; this.checkBox4.UseVisualStyleBackColor = true; @@ -634,7 +683,8 @@ private void InitializeComponent() // numericUpDown8 // this.numericUpDown8.Enabled = false; - this.numericUpDown8.Location = new System.Drawing.Point(122, 45); + this.numericUpDown8.Location = new System.Drawing.Point(224, 79); + this.numericUpDown8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown8.Maximum = new decimal(new int[] { 65535, 0, @@ -646,7 +696,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDown8.Name = "numericUpDown8"; - this.numericUpDown8.Size = new System.Drawing.Size(58, 21); + this.numericUpDown8.Size = new System.Drawing.Size(106, 31); this.numericUpDown8.TabIndex = 22; this.numericUpDown8.Value = new decimal(new int[] { 100, @@ -657,9 +707,10 @@ private void InitializeComponent() // checkBox3 // this.checkBox3.AutoSize = true; - this.checkBox3.Location = new System.Drawing.Point(9, 48); + this.checkBox3.Location = new System.Drawing.Point(16, 84); + this.checkBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox3.Name = "checkBox3"; - this.checkBox3.Size = new System.Drawing.Size(108, 16); + this.checkBox3.Size = new System.Drawing.Size(183, 25); this.checkBox3.TabIndex = 27; this.checkBox3.Text = "节点保存数目:"; this.checkBox3.UseVisualStyleBackColor = true; @@ -667,9 +718,10 @@ private void InitializeComponent() // // button4 // - this.button4.Location = new System.Drawing.Point(695, 71); + this.button4.Location = new System.Drawing.Point(1274, 124); + this.button4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button4.Name = "button4"; - this.button4.Size = new System.Drawing.Size(75, 23); + this.button4.Size = new System.Drawing.Size(138, 40); this.button4.TabIndex = 26; this.button4.Text = "检查更新"; this.button4.UseVisualStyleBackColor = true; @@ -680,9 +732,10 @@ private void InitializeComponent() this.checkBox1.AutoSize = true; this.checkBox1.Checked = true; this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBox1.Location = new System.Drawing.Point(9, 20); + this.checkBox1.Location = new System.Drawing.Point(16, 35); + this.checkBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(96, 16); + this.checkBox1.Size = new System.Drawing.Size(162, 25); this.checkBox1.TabIndex = 22; this.checkBox1.Text = "节点地址查询"; this.checkBox1.UseVisualStyleBackColor = true; @@ -691,9 +744,10 @@ private void InitializeComponent() // checkBox2 // this.checkBox2.AutoSize = true; - this.checkBox2.Location = new System.Drawing.Point(106, 20); + this.checkBox2.Location = new System.Drawing.Point(194, 35); + this.checkBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox2.Name = "checkBox2"; - this.checkBox2.Size = new System.Drawing.Size(84, 16); + this.checkBox2.Size = new System.Drawing.Size(141, 25); this.checkBox2.TabIndex = 25; this.checkBox2.Text = "流媒体检测"; this.checkBox2.UseVisualStyleBackColor = true; @@ -721,18 +775,20 @@ private void InitializeComponent() "line_Full_WithIcon.yaml", "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/添加直连规则.yam" + "l"}); - this.comboBox5.Location = new System.Drawing.Point(414, 73); + this.comboBox5.Location = new System.Drawing.Point(759, 128); + this.comboBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox5.Name = "comboBox5"; - this.comboBox5.Size = new System.Drawing.Size(275, 20); + this.comboBox5.Size = new System.Drawing.Size(501, 29); this.comboBox5.TabIndex = 24; this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); // // label19 // this.label19.AutoSize = true; - this.label19.Location = new System.Drawing.Point(260, 76); + this.label19.Location = new System.Drawing.Point(477, 133); + this.label19.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label19.Name = "label19"; - this.label19.Size = new System.Drawing.Size(149, 12); + this.label19.Size = new System.Drawing.Size(265, 21); this.label19.TabIndex = 23; this.label19.Text = "Clash订阅 覆写配置文件:"; // @@ -1166,18 +1222,20 @@ private void InitializeComponent() "tube.20140301.xyz", "vps.pansen626.com", "wfgithub.xiaonuomi.ie.eu.org"}); - this.comboBox3.Location = new System.Drawing.Point(600, 19); + this.comboBox3.Location = new System.Drawing.Point(1100, 33); + this.comboBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox3.Name = "comboBox3"; - this.comboBox3.Size = new System.Drawing.Size(170, 20); + this.comboBox3.Size = new System.Drawing.Size(308, 29); this.comboBox3.TabIndex = 21; this.comboBox3.Leave += new System.EventHandler(this.comboBox3_Leave); // // label10 // this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(505, 21); + this.label10.Location = new System.Drawing.Point(926, 37); + this.label10.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(89, 12); + this.label10.Size = new System.Drawing.Size(163, 21); this.label10.TabIndex = 20; this.label10.Text = "Github Proxy:"; // @@ -1191,9 +1249,10 @@ private void InitializeComponent() "p.zip", "https://github.com/VSCodium/vscodium/releases/download/1.98.0.25067/codium-1.98.0" + ".25067-el9.aarch64.rpm"}); - this.comboBox2.Location = new System.Drawing.Point(414, 45); + this.comboBox2.Location = new System.Drawing.Point(759, 79); + this.comboBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox2.Name = "comboBox2"; - this.comboBox2.Size = new System.Drawing.Size(275, 20); + this.comboBox2.Size = new System.Drawing.Size(501, 29); this.comboBox2.TabIndex = 19; this.comboBox2.Text = "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + "Waifu2x-Extension-GUI-v2.21.12-Portable.7z"; @@ -1201,17 +1260,19 @@ private void InitializeComponent() // label9 // this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(344, 48); + this.label9.Location = new System.Drawing.Point(631, 84); + this.label9.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(65, 12); + this.label9.Size = new System.Drawing.Size(115, 21); this.label9.TabIndex = 18; this.label9.Text = "测速地址:"; // // progressBar1 // - this.progressBar1.Location = new System.Drawing.Point(13, 3); + this.progressBar1.Location = new System.Drawing.Point(24, 5); + this.progressBar1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(780, 3); + this.progressBar1.Size = new System.Drawing.Size(1430, 5); this.progressBar1.TabIndex = 3; // // timer2 @@ -1227,9 +1288,11 @@ private void InitializeComponent() this.groupBox4.Controls.Add(this.label12); this.groupBox4.Controls.Add(this.textBox2); this.groupBox4.Controls.Add(this.label11); - this.groupBox4.Location = new System.Drawing.Point(13, 612); + this.groupBox4.Location = new System.Drawing.Point(24, 1071); + this.groupBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox4.Name = "groupBox4"; - this.groupBox4.Size = new System.Drawing.Size(780, 51); + this.groupBox4.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox4.Size = new System.Drawing.Size(1430, 89); this.groupBox4.TabIndex = 4; this.groupBox4.TabStop = false; this.groupBox4.Text = "Gist 上传参数"; @@ -1237,26 +1300,29 @@ private void InitializeComponent() // // textBox4 // - this.textBox4.Location = new System.Drawing.Point(467, 18); + this.textBox4.Location = new System.Drawing.Point(856, 32); + this.textBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox4.Name = "textBox4"; - this.textBox4.Size = new System.Drawing.Size(306, 21); + this.textBox4.Size = new System.Drawing.Size(558, 31); this.textBox4.TabIndex = 5; // // label13 // this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(359, 21); + this.label13.Location = new System.Drawing.Point(658, 37); + this.label13.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(113, 12); + this.label13.Size = new System.Drawing.Size(205, 21); this.label13.TabIndex = 4; this.label13.Text = "API Mirror(可选):"; // // textBox3 // - this.textBox3.Location = new System.Drawing.Point(253, 18); + this.textBox3.Location = new System.Drawing.Point(464, 32); + this.textBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox3.Name = "textBox3"; this.textBox3.PasswordChar = '*'; - this.textBox3.Size = new System.Drawing.Size(100, 21); + this.textBox3.Size = new System.Drawing.Size(180, 31); this.textBox3.TabIndex = 3; this.textBox3.Enter += new System.EventHandler(this.textBox3_Enter); this.textBox3.Leave += new System.EventHandler(this.textBox3_Leave); @@ -1264,25 +1330,28 @@ private void InitializeComponent() // label12 // this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(168, 21); + this.label12.Location = new System.Drawing.Point(308, 37); + this.label12.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(89, 12); + this.label12.Size = new System.Drawing.Size(163, 21); this.label12.TabIndex = 2; this.label12.Text = "Github Token:"; // // textBox2 // - this.textBox2.Location = new System.Drawing.Point(62, 18); + this.textBox2.Location = new System.Drawing.Point(114, 32); + this.textBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox2.Name = "textBox2"; - this.textBox2.Size = new System.Drawing.Size(100, 21); + this.textBox2.Size = new System.Drawing.Size(180, 31); this.textBox2.TabIndex = 1; // // label11 // this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(7, 21); + this.label11.Location = new System.Drawing.Point(13, 37); + this.label11.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(59, 12); + this.label11.Size = new System.Drawing.Size(108, 21); this.label11.TabIndex = 0; this.label11.Text = "Gist ID:"; // @@ -1299,9 +1368,11 @@ private void InitializeComponent() this.groupBox5.Controls.Add(this.label15); this.groupBox5.Controls.Add(this.textBox7); this.groupBox5.Controls.Add(this.label16); - this.groupBox5.Location = new System.Drawing.Point(13, 669); + this.groupBox5.Location = new System.Drawing.Point(24, 1171); + this.groupBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox5.Name = "groupBox5"; - this.groupBox5.Size = new System.Drawing.Size(780, 51); + this.groupBox5.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox5.Size = new System.Drawing.Size(1430, 89); this.groupBox5.TabIndex = 6; this.groupBox5.TabStop = false; this.groupBox5.Text = "R2 上传参数"; @@ -1309,10 +1380,11 @@ private void InitializeComponent() // // textBox6 // - this.textBox6.Location = new System.Drawing.Point(467, 18); + this.textBox6.Location = new System.Drawing.Point(856, 32); + this.textBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox6.Name = "textBox6"; this.textBox6.PasswordChar = '*'; - this.textBox6.Size = new System.Drawing.Size(306, 21); + this.textBox6.Size = new System.Drawing.Size(558, 31); this.textBox6.TabIndex = 3; this.textBox6.Text = "1234567890"; this.textBox6.Enter += new System.EventHandler(this.textBox3_Enter); @@ -1321,17 +1393,19 @@ private void InitializeComponent() // label15 // this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(382, 21); + this.label15.Location = new System.Drawing.Point(700, 37); + this.label15.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(89, 12); + this.label15.Size = new System.Drawing.Size(163, 21); this.label15.TabIndex = 2; this.label15.Text = "Worker Token:"; // // textBox7 // - this.textBox7.Location = new System.Drawing.Point(88, 18); + this.textBox7.Location = new System.Drawing.Point(161, 32); + this.textBox7.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox7.Name = "textBox7"; - this.textBox7.Size = new System.Drawing.Size(285, 21); + this.textBox7.Size = new System.Drawing.Size(519, 31); this.textBox7.TabIndex = 1; this.textBox7.Text = "https://example.worker.dev"; this.textBox7.Leave += new System.EventHandler(this.textBox7_Leave); @@ -1339,9 +1413,10 @@ private void InitializeComponent() // label16 // this.label16.AutoSize = true; - this.label16.Location = new System.Drawing.Point(7, 21); + this.label16.Location = new System.Drawing.Point(13, 37); + this.label16.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label16.Name = "label16"; - this.label16.Size = new System.Drawing.Size(77, 12); + this.label16.Size = new System.Drawing.Size(141, 21); this.label16.TabIndex = 0; this.label16.Text = "Worker URL:"; // @@ -1353,9 +1428,11 @@ private void InitializeComponent() this.groupBox6.Controls.Add(this.label17); this.groupBox6.Controls.Add(this.textBox9); this.groupBox6.Controls.Add(this.label18); - this.groupBox6.Location = new System.Drawing.Point(13, 726); + this.groupBox6.Location = new System.Drawing.Point(24, 1270); + this.groupBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox6.Name = "groupBox6"; - this.groupBox6.Size = new System.Drawing.Size(780, 51); + this.groupBox6.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox6.Size = new System.Drawing.Size(1430, 89); this.groupBox6.TabIndex = 6; this.groupBox6.TabStop = false; this.groupBox6.Text = "Webdav 上传参数"; @@ -1363,27 +1440,30 @@ private void InitializeComponent() // // textBox5 // - this.textBox5.Location = new System.Drawing.Point(467, 18); + this.textBox5.Location = new System.Drawing.Point(856, 32); + this.textBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox5.Name = "textBox5"; - this.textBox5.Size = new System.Drawing.Size(306, 21); + this.textBox5.Size = new System.Drawing.Size(558, 31); this.textBox5.TabIndex = 5; this.textBox5.Text = "https://example.com/dav/"; // // label14 // this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(382, 21); + this.label14.Location = new System.Drawing.Point(700, 37); + this.label14.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(77, 12); + this.label14.Size = new System.Drawing.Size(141, 21); this.label14.TabIndex = 4; this.label14.Text = "Webdav URL:"; // // textBox8 // - this.textBox8.Location = new System.Drawing.Point(257, 18); + this.textBox8.Location = new System.Drawing.Point(471, 32); + this.textBox8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox8.Name = "textBox8"; this.textBox8.PasswordChar = '*'; - this.textBox8.Size = new System.Drawing.Size(110, 21); + this.textBox8.Size = new System.Drawing.Size(198, 31); this.textBox8.TabIndex = 3; this.textBox8.Text = "admin"; this.textBox8.Enter += new System.EventHandler(this.textBox3_Enter); @@ -1392,26 +1472,29 @@ private void InitializeComponent() // label17 // this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(186, 21); + this.label17.Location = new System.Drawing.Point(341, 37); + this.label17.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(65, 12); + this.label17.Size = new System.Drawing.Size(119, 21); this.label17.TabIndex = 2; this.label17.Text = "Password:"; // // textBox9 // - this.textBox9.Location = new System.Drawing.Point(70, 18); + this.textBox9.Location = new System.Drawing.Point(128, 32); + this.textBox9.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox9.Name = "textBox9"; - this.textBox9.Size = new System.Drawing.Size(110, 21); + this.textBox9.Size = new System.Drawing.Size(198, 31); this.textBox9.TabIndex = 1; this.textBox9.Text = "admin"; // // label18 // this.label18.AutoSize = true; - this.label18.Location = new System.Drawing.Point(7, 21); + this.label18.Location = new System.Drawing.Point(13, 37); + this.label18.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label18.Name = "label18"; - this.label18.Size = new System.Drawing.Size(65, 12); + this.label18.Size = new System.Drawing.Size(119, 21); this.label18.TabIndex = 0; this.label18.Text = "Username:"; // @@ -1422,16 +1505,15 @@ private void InitializeComponent() // // timer4 // - this.timer4.Interval = 100; this.timer4.Tick += new System.EventHandler(this.timer4_Tick); // // Form1 // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(800, 784); + this.ClientSize = new System.Drawing.Size(1467, 1372); this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox4); @@ -1440,6 +1522,7 @@ private void InitializeComponent() this.Controls.Add(this.groupBox1); this.Controls.Add(this.progressBar1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.MaximizeBox = false; this.Name = "Form1"; this.Text = "SubsCheck Win GUI"; @@ -1473,6 +1556,7 @@ private void InitializeComponent() private System.Windows.Forms.Timer timer1; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label LogLabelNodeInfo; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button1; private System.Windows.Forms.GroupBox groupBox3; diff --git a/Form1.cs b/Form1.cs index fa095ad..a0e0424 100644 --- a/Form1.cs +++ b/Form1.cs @@ -16,7 +16,7 @@ namespace subs_check.win.gui { - public partial class Form1: Form + public partial class Form1 : Form { //string 版本号; string 标题; @@ -33,6 +33,13 @@ public partial class Form1: Form private string nextCheckTime = null;// 用于存储下次检查时间 string WebUIapiKey = "CMLiussss"; int downloading = 0; + + // ——用于避免无意义的重复 UI 重绘—— + private string _lastStateType = null; // checking / idle / error + private string _lastLogLabelNodeInfoText = string.Empty; + private string _lastNotifyText = string.Empty; + private int _lastProgressBarValue = -1; + public Form1() { InitializeComponent(); @@ -57,7 +64,7 @@ public Form1() toolTip1.SetToolTip(comboBox1, "测速结果的保存方法。"); toolTip1.SetToolTip(textBox2, "Gist ID:注意!非Github用户名!"); toolTip1.SetToolTip(textBox3, "Github TOKEN"); - + toolTip1.SetToolTip(comboBox4, "通用订阅:内置了Sub-Store程序,自适应订阅格式。\nClash订阅:带规则的 Mihomo、Clash 订阅格式。"); toolTip1.SetToolTip(comboBox5, "生成带规则的 Clash 订阅所需的覆写规则文件"); @@ -71,6 +78,26 @@ public Form1() SetupNotifyIconContextMenu(); } + //临时禁用/恢复控件重绘 + [System.Runtime.InteropServices.DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + private const int WM_SETREDRAW = 0x000B; + + private void SuspendRedraw(Control c) + { + if (c != null && c.IsHandleCreated) + SendMessage(c.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); + } + + private void ResumeRedraw(Control c) + { + if (c != null && c.IsHandleCreated) + { + SendMessage(c.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); + c.Invalidate(); + } + } + private void SetupNotifyIconContextMenu() { // 创建上下文菜单 @@ -189,7 +216,8 @@ private async void timer1_Tick(object sender, EventArgs e)//初始化 button1_Click(this, EventArgs.Empty); this.Hide(); notifyIcon1.Visible = true; - } else await CheckGitHubVersionAsync(); + } + else await CheckGitHubVersionAsync(); } private async Task CheckGitHubVersionAsync() @@ -203,7 +231,7 @@ private async Task CheckGitHubVersionAsync() } var result = await 获取版本号("https://api.github.com/repos/cmliu/SubsCheck-Win-GUI/releases/latest"); - if (result.Item1 != "未知版本") + if (result.Item1 != "未知版本") { string latestVersion = result.Item1; if (latestVersion != 当前GUI版本号) @@ -554,7 +582,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["enable-web-ui"] = true; // 保存listen-port - if (checkBox4.Checked) + if (checkBox4.Checked) { WebUIapiKey = textBox10.Text; config["listen-port"] = $@":{numericUpDown6.Value}"; @@ -672,7 +700,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 } else if (comboBox5.Text.StartsWith(githubRawPrefix)) config["mihomo-overwrite-url"] = githubProxyURL + comboBox5.Text; else config["mihomo-overwrite-url"] = comboBox5.Text != "" ? comboBox5.Text : $"http://127.0.0.1:{numericUpDown6.Value}/ACL4SSR_Online_Full.yaml"; - + config["rename-node"] = checkBox1.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBox2.Checked;//是否开启流媒体检测 config["keep-success-proxies"] = false; @@ -743,7 +771,7 @@ private void button2_Click(object sender, EventArgs e) private async void button1_Click(object sender, EventArgs e) { button1.Enabled = false; - if (button1.Text == "▶️ 启动") + if (button1.Text == "▶️ 启动") { if (checkBox4.Checked && textBox10.Text == "请输入密钥") { @@ -751,7 +779,7 @@ private async void button1_Click(object sender, EventArgs e) return; } run = 1; - if (button3.Enabled==false) + if (button3.Enabled == false) { string executablePath = Path.GetDirectoryName(Application.ExecutablePath); string allyamlFilePath = Path.Combine(executablePath, "output", "all.yaml"); @@ -780,7 +808,7 @@ private async void button1_Click(object sender, EventArgs e) await KillNodeProcessAsync(); await SaveConfig(); - if (run == 1) + if (run == 1) { // 更新菜单项的启用状态 startMenuItem.Enabled = false; @@ -850,7 +878,7 @@ private async Task DownloadSubsCheckEXE() } var result = await 获取版本号("https://api.github.com/repos/beck-8/subs-check/releases/latest", true); - if (result.Item1 != "未知版本") + if (result.Item1 != "未知版本") { // 创建不使用系统代理的 HttpClientHandler HttpClientHandler handler = new HttpClientHandler @@ -860,7 +888,7 @@ private async Task DownloadSubsCheckEXE() }; // 使用自定义 handler 创建 HttpClient - using (HttpClient client = new HttpClient(handler)) + using (HttpClient client = new HttpClient(handler)) { try { @@ -1076,7 +1104,7 @@ private async Task DownloadSubsCheckEXE() "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - } + } } catch (Exception ex) { @@ -1351,107 +1379,180 @@ private void StopSubsCheckProcess() } } } - + private void SubsCheckProcess_OutputDataReceived(object sender, DataReceivedEventArgs e) { - if (!string.IsNullOrEmpty(e.Data)) + if (string.IsNullOrEmpty(e.Data)) return; + + var state = this.Tag as Tuple, System.Windows.Forms.Timer>; + if (state == null) { - // 由于此事件在另一个线程中触发,需要使用 Invoke 在 UI 线程上更新控件 + // 首次初始化在 UI 线程完成 BeginInvoke(new Action(() => { - // 过滤ANSI转义序列 - string cleanText = RemoveAnsiEscapeCodes(e.Data); + var st2 = this.Tag as Tuple, System.Windows.Forms.Timer>; + if (st2 != null) + { + st2.Item1.Enqueue(e.Data); + // 启动定时器(如果尚未运行) + if (!st2.Item2.Enabled) st2.Item2.Start(); + return; + } - // 检查是否包含"下次检查时间"信息 - if (cleanText.Contains("下次检查时间:")) + var q = new System.Collections.Concurrent.ConcurrentQueue(); + var t = new System.Windows.Forms.Timer { Interval = 200 }; // 可调:80-200ms + t.Tick += (s, ev) => { - if (button3.Enabled == false) + // 若无新日志,立即停表避免空转重绘 + if (q.IsEmpty) { - string executablePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); - string outputFolderPath = System.IO.Path.Combine(executablePath, "output"); - if (System.IO.Directory.Exists(outputFolderPath)) - { - string allyamlFilePath = System.IO.Path.Combine(outputFolderPath, "all.yaml"); - if (System.IO.File.Exists(allyamlFilePath)) button3.Enabled = true; - } + try { if (t.Enabled) t.Stop(); } catch { } + return; } - // 提取完整的下次检查时间信息 - int startIndex = cleanText.IndexOf("下次检查时间:"); - nextCheckTime = cleanText.Substring(startIndex); - } - if (!cleanText.StartsWith("[GIN]")) - { - // 如果不是进度行,则添加到日志中 - richTextBox1.AppendText(cleanText + "\r\n"); - // 滚动到最底部 - richTextBox1.SelectionStart = richTextBox1.Text.Length; - richTextBox1.ScrollToCaret(); - } + var sb = new System.Text.StringBuilder(); - /* - // 检查是否是进度信息行 - if (cleanText.StartsWith("进度: [")) - { - // 解析百分比 - int percentIndex = cleanText.IndexOf('%'); - if (percentIndex > 0) + while (q.TryDequeue(out var rawLine)) { - // 查找百分比前面的数字部分 - int startIndex = cleanText.LastIndexOfAny(new char[] { ' ', '>' }, percentIndex) + 1; - string percentText = cleanText.Substring(startIndex, percentIndex - startIndex); + string clean = RemoveAnsiEscapeCodes(rawLine); - if (double.TryParse(percentText, out double percentValue)) + // 过滤掉空白行与 [GIN] 行,避免无意义刷新 + if (string.IsNullOrWhiteSpace(clean)) continue; + if (clean.StartsWith("[GIN]")) continue; + + // 一次性“下次检查时间” + if (clean.Contains("下次检查时间:")) { - // 更新进度条,将百分比值(0-100)设置给进度条 - progressBar1.Value = (int)Math.Round(percentValue); + if (!button3.Enabled) + { + string executablePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); + string outputFolderPath = System.IO.Path.Combine(executablePath, "output"); + if (System.IO.Directory.Exists(outputFolderPath)) + { + string allyamlFilePath = System.IO.Path.Combine(outputFolderPath, "all.yaml"); + if (System.IO.File.Exists(allyamlFilePath)) button3.Enabled = true; + } + } + int startIndex = clean.IndexOf("下次检查时间:"); + var lineOnly = clean.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)[0]; + nextCheckTime = lineOnly.Substring(startIndex); } + + sb.AppendLine(clean); } - // 解析节点信息部分(例如:(12/6167) 可用: 0) - int infoStartIndex = cleanText.IndexOf('('); - if (infoStartIndex > 0) + // 若本轮没有有效输出,停止计时器并退出 + if (sb.Length == 0) { - string fullNodeInfo = cleanText.Substring(infoStartIndex); - - // 提取最重要的信息:节点数量和可用数量 - int endIndex = fullNodeInfo.IndexOf("2025-"); // 查找日期部分开始位置 - if (endIndex > 0) - { - nodeInfo = fullNodeInfo.Substring(0, endIndex).Trim(); - } - else - { - // 如果找不到日期部分,则取前30个字符 - nodeInfo = fullNodeInfo.Length > 30 ? fullNodeInfo.Substring(0, 30) + "..." : fullNodeInfo; - } + try { if (q.IsEmpty && t.Enabled) t.Stop(); } catch { } + return; + } - groupBox2.Text = "实时日志 " + nodeInfo; + // 批量追加时暂时禁用重绘,减少闪烁 + SuspendRedraw(richTextBox1); + try + { + richTextBox1.AppendText(sb.ToString()); + richTextBox1.SelectionStart = richTextBox1.TextLength; + richTextBox1.ScrollToCaret(); + } + finally + { + ResumeRedraw(richTextBox1); + } - // 确保通知图标文本不超过63个字符 - string notifyText = "SubsCheck: " + nodeInfo; - if (notifyText.Length > 63) - { - notifyText = notifyText.Substring(0, 60) + "..."; - } - notifyIcon1.Text = notifyText; + // 若已消费完,停止定时器 + if (q.IsEmpty) + { + try { if (t.Enabled) t.Stop(); } catch { } } + }; - // 更新lastProgressLine,但不向richTextBox添加文本 - lastProgressLine = cleanText; - } - else - { - // 如果不是进度行,则添加到日志中 - richTextBox1.AppendText(cleanText + "\r\n"); - // 滚动到最底部 - richTextBox1.SelectionStart = richTextBox1.Text.Length; - richTextBox1.ScrollToCaret(); - } - */ + t.Start(); + this.Tag = Tuple.Create(q, t); + + // 入队并确保定时器在 UI 线程已启动 + q.Enqueue(e.Data); })); + + return; + } + + // 已初始化:直接入队(非 UI 线程安全) + state.Item1.Enqueue(e.Data); + + // 确保定时器正在运行(使用 BeginInvoke 在 UI 线程安全地检查/启动) + BeginInvoke(new Action(() => + { + Tuple, Timer> st = this.Tag as Tuple, System.Windows.Forms.Timer>; + if (st != null && !st.Item2.Enabled) + { + st.Item2.Start(); + } + })); + } + + + /* + // 检查是否是进度信息行 + if (cleanText.StartsWith("进度: [")) + { + // 解析百分比 + int percentIndex = cleanText.IndexOf('%'); + if (percentIndex > 0) + { + // 查找百分比前面的数字部分 + int startIndex = cleanText.LastIndexOfAny(new char[] { ' ', '>' }, percentIndex) + 1; + string percentText = cleanText.Substring(startIndex, percentIndex - startIndex); + + if (double.TryParse(percentText, out double percentValue)) + { + // 更新进度条,将百分比值(0-100)设置给进度条 + progressBar1.Value = (int)Math.Round(percentValue); + } } + + // 解析节点信息部分(例如:(12/6167) 可用: 0) + int infoStartIndex = cleanText.IndexOf('('); + if (infoStartIndex > 0) + { + string fullNodeInfo = cleanText.Substring(infoStartIndex); + + // 提取最重要的信息:节点数量和可用数量 + int endIndex = fullNodeInfo.IndexOf("2025-"); // 查找日期部分开始位置 + if (endIndex > 0) + { + nodeInfo = fullNodeInfo.Substring(0, endIndex).Trim(); + } + else + { + // 如果找不到日期部分,则取前30个字符 + nodeInfo = fullNodeInfo.Length > 30 ? fullNodeInfo.Substring(0, 30) + "..." : fullNodeInfo; + } + + groupBox2.Text = "实时日志 " + nodeInfo; + + // 确保通知图标文本不超过63个字符 + string notifyText = "SubsCheck: " + nodeInfo; + if (notifyText.Length > 63) + { + notifyText = notifyText.Substring(0, 60) + "..."; + } + notifyIcon1.Text = notifyText; + } + + // 更新lastProgressLine,但不向richTextBox添加文本 + lastProgressLine = cleanText; } + else + { + // 如果不是进度行,则添加到日志中 + richTextBox1.AppendText(cleanText + "\r\n"); + // 滚动到最底部 + richTextBox1.SelectionStart = richTextBox1.Text.Length; + richTextBox1.ScrollToCaret(); + } + */ // 添加一个方法来过滤ANSI转义序列 @@ -1664,7 +1765,7 @@ private void timer2_Tick(object sender, EventArgs e) private void comboBox3_Leave(object sender, EventArgs e) { // 检查是否有内容 - if (string.IsNullOrWhiteSpace(comboBox3.Text)) + if (string.IsNullOrWhiteSpace(comboBox3.Text)) { comboBox3.Text = "自动选择"; return; @@ -1728,7 +1829,7 @@ private void 判断保存类型() private void comboBox1_TextChanged(object sender, EventArgs e) { 判断保存类型(); - if(!(comboBox1.Text == "本地" || comboBox1.Text == "") && button2.Text == "高级设置∨") button2_Click(sender, e); + if (!(comboBox1.Text == "本地" || comboBox1.Text == "") && button2.Text == "高级设置∨") button2_Click(sender, e); } private void textBox3_Enter(object sender, EventArgs e) @@ -1757,7 +1858,7 @@ private void textBox10_Enter(object sender, EventArgs e) private void textBox10_Leave(object sender, EventArgs e) { - + if (textBox10.Text == "") { textBox10.PasswordChar = '\0'; @@ -2101,7 +2202,8 @@ private async Task KillNodeProcessAsync() try { // 使用Task.Run将可能耗时的操作放在后台线程执行 - string processPath = await Task.Run(() => { + string processPath = await Task.Run(() => + { try { return process.MainModule?.FileName; @@ -2119,7 +2221,8 @@ private async Task KillNodeProcessAsync() // 找到匹配的进程,终止它 Log($"发现匹配路径的 node.exe 进程(ID: {process.Id}),正在强制结束..."); - await Task.Run(() => { + await Task.Run(() => + { process.Kill(); process.WaitForExit(); }); @@ -2202,7 +2305,7 @@ private void checkBox2_CheckedChanged(object sender, EventArgs e) private async void timer3_Tick(object sender, EventArgs e) { - if (button1.Text == "⏹️ 停止") + if (button1.Text == "⏹️ 停止") { Log("subs-check.exe 运行时满24小时,自动重启清理内存占用。"); // 停止 subs-check.exe 程序 @@ -2242,7 +2345,8 @@ private void button4_Click(object sender, EventArgs e) checkUpdatesForm.最新GUI版本号 = 最新GUI版本号; // 为 CheckUpdates 的 button2 添加点击事件处理程序 - checkUpdatesForm.FormClosed += (s, args) => { + checkUpdatesForm.FormClosed += (s, args) => + { // 移除事件处理,避免内存泄漏 if (checkUpdatesForm.DialogResult == DialogResult.OK) { @@ -2404,7 +2508,7 @@ private void numericUpDown1_ValueChanged(object sender, EventArgs e) private void checkBox4_CheckedChanged(object sender, EventArgs e) { - if(checkBox4.Checked) textBox10.Enabled = true; + if (checkBox4.Checked) textBox10.Enabled = true; else textBox10.Enabled = false; } @@ -2538,38 +2642,71 @@ private async void timer4_Tick(object sender, EventArgs e) if (状态类型 == "checking") { - button7.Text = "⏸️ 暂停"; + button7.Text = button7.Text == "⏸️ 暂停" ? button7.Text : "⏸️ 暂停"; nodeInfo = $"({进度百分比}/{节点总数}) 可用: {可用节点数量}"; - int nodeTotal = int.Parse(节点总数); - if (nodeTotal > 0) { - int 进度条百分比 = int.Parse(进度百分比) * 100 / nodeTotal; - progressBar1.Value = 进度条百分比; + + int.TryParse(节点总数, out int nodeTotal); + int.TryParse(进度百分比, out int curr); + + if (nodeTotal > 0) + { + int 进度条百分比 = curr * 100 / nodeTotal; + if (进度条百分比 < 0) 进度条百分比 = 0; + if (进度条百分比 > 100) 进度条百分比 = 100; + + if (_lastProgressBarValue != 进度条百分比) + { + _lastProgressBarValue = 进度条百分比; + progressBar1.Value = 进度条百分比; + } + if (!button7.Enabled) button7.Enabled = true; } - - // 确保通知图标文本不超过63个字符 + + // 仅在文本变化时更新 NotifyIcon,避免频繁重绘 string notifyText = "SubsCheck: " + nodeInfo; - if (notifyText.Length > 63) + if (notifyText.Length > 63) notifyText = notifyText.Substring(0, 60) + "..."; + if (_lastNotifyText != notifyText) { - notifyText = notifyText.Substring(0, 60) + "..."; + _lastNotifyText = notifyText; + notifyIcon1.Text = notifyText; } - notifyIcon1.Text = notifyText; - textBox1.Enabled = false; + + if (textBox1.Enabled) textBox1.Enabled = false; // 仅在需要时改变 } else if (状态类型 == "idle") { - button7.Text = "⏯️ 开始"; - progressBar1.Value = 100; + if (button7.Text != "⏯️ 开始") button7.Text = "⏯️ 开始"; + + if (_lastProgressBarValue != 100) + { + _lastProgressBarValue = 100; + progressBar1.Value = 100; + } + nodeInfo = $"等待{nextCheckTime}"; - notifyIcon1.Text = "SubsCheck: 已就绪\n" + nextCheckTime; ; - textBox1.Enabled = true; + string idleNotify = "SubsCheck: 已就绪\n" + nextCheckTime; + if (_lastNotifyText != idleNotify) + { + _lastNotifyText = idleNotify; + notifyIcon1.Text = idleNotify; + } + + if (!textBox1.Enabled) textBox1.Enabled = true; } else if (状态类型 == "error") { - button7.Text = "🔀 未知"; + if (button7.Text != "🔀 未知") button7.Text = "🔀 未知"; nodeInfo = 状态文本; } - groupBox2.Text = $"实时日志 {nodeInfo}"; + + // 仅在标题文字确实变化时更新,避免父容器反复重绘引起的闪烁 + string groupTitle = $"实时日志 {nodeInfo}"; + if (_lastLogLabelNodeInfoText != groupTitle) + { + _lastLogLabelNodeInfoText = groupTitle; + LogLabelNodeInfo.Text = groupTitle; + } } private async void button7_Click(object sender, EventArgs e) diff --git a/app.manifest b/app.manifest index 02907c0..d442713 100644 --- a/app.manifest +++ b/app.manifest @@ -1,15 +1,78 @@  - - - subs-check.win.gui - - - - - - true - - PerMonitorV2 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + diff --git a/app1.manifest b/app1.manifest deleted file mode 100644 index 1c9790a..0000000 --- a/app1.manifest +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - - - - - - - diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index cc238bf..520dccb 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -39,8 +39,9 @@ subs_check.win.gui.Program + - app1.manifest + app.manifest @@ -117,7 +118,6 @@ Resources.Designer.cs - SettingsSingleFileGenerator From c58ef3ccd9c83635e74143f39d135324a5b3ffc3 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 25 Aug 2025 05:54:11 +0800 Subject: [PATCH 04/92] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20subs-check?= =?UTF-8?q?=20=E5=86=85=E6=A0=B8=E6=9C=80=E6=96=B0=E7=89=B9=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E8=BF=9B=E5=BA=A6=E6=9D=A1=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 174 ++++++++++++++++++++++++++++++++++++---------- Form1.cs | 72 +++++++++++++++---- Form1.resx | 9 ++- 3 files changed, 199 insertions(+), 56 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 42da483..0e1633a 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -63,7 +63,13 @@ private void InitializeComponent() this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.button5 = new System.Windows.Forms.Button(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.LogLabelNodeInfo = new System.Windows.Forms.Label(); this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.numericUpDown10 = new System.Windows.Forms.NumericUpDown(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.label22 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.numericUpDown9 = new System.Windows.Forms.NumericUpDown(); this.button8 = new System.Windows.Forms.Button(); this.textBox10 = new System.Windows.Forms.TextBox(); this.checkBox4 = new System.Windows.Forms.CheckBox(); @@ -112,6 +118,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit(); this.groupBox2.SuspendLayout(); this.groupBox3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).BeginInit(); this.groupBox4.SuspendLayout(); this.groupBox5.SuspendLayout(); @@ -475,7 +483,7 @@ private void InitializeComponent() // // numericUpDown5 // - this.numericUpDown5.Location = new System.Drawing.Point(515, 79); + this.numericUpDown5.Location = new System.Drawing.Point(515, 78); this.numericUpDown5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown5.Maximum = new decimal(new int[] { 10, @@ -509,7 +517,7 @@ private void InitializeComponent() // label5 // this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(350, 84); + this.label5.Location = new System.Drawing.Point(350, 83); this.label5.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(158, 21); @@ -550,21 +558,13 @@ private void InitializeComponent() this.label20.TabIndex = 20; this.label20.Text = "Sub-Store端口:"; // - // 进度显示标签,需在groupBox2 上方,避免groupBox2标题刷新导致日志界面无意义重绘 - // - this.LogLabelNodeInfo = new System.Windows.Forms.Label(); - this.LogLabelNodeInfo.AutoSize = true; - this.LogLabelNodeInfo.Location = new System.Drawing.Point(0, 0); // 放在标题右边 - this.LogLabelNodeInfo.Name = "LogLabelNodeInfo"; - this.LogLabelNodeInfo.Size = new System.Drawing.Size(0, 21); - this.LogLabelNodeInfo.TabIndex = 22; - this.LogLabelNodeInfo.Text = "实时日志"; - // // groupBox2 // + this.groupBox2.CausesValidation = false; this.groupBox2.Controls.Add(this.linkLabel1); this.groupBox2.Controls.Add(this.button5); this.groupBox2.Controls.Add(this.richTextBox1); + this.groupBox2.Controls.Add(this.LogLabelNodeInfo); this.groupBox2.Location = new System.Drawing.Point(354, 23); this.groupBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox2.Name = "groupBox2"; @@ -572,8 +572,6 @@ private void InitializeComponent() this.groupBox2.Size = new System.Drawing.Size(1100, 847); this.groupBox2.TabIndex = 1; this.groupBox2.TabStop = false; - this.groupBox2.Text = ""; - this.groupBox2.Controls.Add(this.LogLabelNodeInfo); // // linkLabel1 // @@ -601,7 +599,10 @@ private void InitializeComponent() // // richTextBox1 // + this.richTextBox1.BackColor = System.Drawing.Color.WhiteSmoke; this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBox1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.richTextBox1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.richTextBox1.Location = new System.Drawing.Point(6, 29); this.richTextBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.richTextBox1.Name = "richTextBox1"; @@ -611,8 +612,22 @@ private void InitializeComponent() this.richTextBox1.Text = ""; this.richTextBox1.DoubleClick += new System.EventHandler(this.richTextBox1_DoubleClick); // + // LogLabelNodeInfo + // + this.LogLabelNodeInfo.AutoSize = true; + this.LogLabelNodeInfo.Location = new System.Drawing.Point(0, 0); + this.LogLabelNodeInfo.Name = "LogLabelNodeInfo"; + this.LogLabelNodeInfo.Size = new System.Drawing.Size(94, 21); + this.LogLabelNodeInfo.TabIndex = 22; + this.LogLabelNodeInfo.Text = "实时日志"; + // // groupBox3 // + this.groupBox3.Controls.Add(this.numericUpDown10); + this.groupBox3.Controls.Add(this.checkBox6); + this.groupBox3.Controls.Add(this.label22); + this.groupBox3.Controls.Add(this.label21); + this.groupBox3.Controls.Add(this.numericUpDown9); this.groupBox3.Controls.Add(this.button8); this.groupBox3.Controls.Add(this.textBox10); this.groupBox3.Controls.Add(this.checkBox4); @@ -637,15 +652,84 @@ private void InitializeComponent() this.groupBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox3.Name = "groupBox3"; this.groupBox3.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox3.Size = new System.Drawing.Size(1430, 180); + this.groupBox3.Size = new System.Drawing.Size(1430, 216); this.groupBox3.TabIndex = 2; this.groupBox3.TabStop = false; this.groupBox3.Text = "高级设置"; this.groupBox3.Visible = false; // + // numericUpDown10 + // + this.numericUpDown10.Enabled = false; + this.numericUpDown10.Location = new System.Drawing.Point(224, 119); + this.numericUpDown10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDown10.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDown10.Name = "numericUpDown10"; + this.numericUpDown10.Size = new System.Drawing.Size(106, 31); + this.numericUpDown10.TabIndex = 37; + this.numericUpDown10.Value = new decimal(new int[] { + 12, + 0, + 0, + 0}); + // + // checkBox6 + // + this.checkBox6.AutoSize = true; + this.checkBox6.Location = new System.Drawing.Point(17, 127); + this.checkBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.Size = new System.Drawing.Size(207, 25); + this.checkBox6.TabIndex = 36; + this.checkBox6.Text = "带宽限制(MB/s):"; + this.checkBox6.UseVisualStyleBackColor = true; + this.checkBox6.CheckedChanged += new System.EventHandler(this.checkBox6_CheckedChanged); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(13, 181); + this.label22.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(0, 21); + this.label22.TabIndex = 33; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(350, 129); + this.label21.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(159, 21); + this.label21.TabIndex = 31; + this.label21.Text = "测速大小(MB):"; + // + // numericUpDown9 + // + this.numericUpDown9.Location = new System.Drawing.Point(515, 124); + this.numericUpDown9.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDown9.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDown9.Name = "numericUpDown9"; + this.numericUpDown9.Size = new System.Drawing.Size(106, 31); + this.numericUpDown9.TabIndex = 30; + this.numericUpDown9.Value = new decimal(new int[] { + 20, + 0, + 0, + 0}); + // // button8 // - this.button8.Location = new System.Drawing.Point(1274, 75); + this.button8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button8.Location = new System.Drawing.Point(1126, 165); this.button8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button8.Name = "button8"; this.button8.Size = new System.Drawing.Size(138, 40); @@ -658,7 +742,7 @@ private void InitializeComponent() // this.textBox10.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.textBox10.Enabled = false; - this.textBox10.Location = new System.Drawing.Point(258, 128); + this.textBox10.Location = new System.Drawing.Point(258, 170); this.textBox10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox10.Name = "textBox10"; this.textBox10.PasswordChar = '*'; @@ -671,7 +755,7 @@ private void InitializeComponent() // checkBox4 // this.checkBox4.AutoSize = true; - this.checkBox4.Location = new System.Drawing.Point(16, 131); + this.checkBox4.Location = new System.Drawing.Point(16, 173); this.checkBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox4.Name = "checkBox4"; this.checkBox4.Size = new System.Drawing.Size(240, 25); @@ -683,7 +767,7 @@ private void InitializeComponent() // numericUpDown8 // this.numericUpDown8.Enabled = false; - this.numericUpDown8.Location = new System.Drawing.Point(224, 79); + this.numericUpDown8.Location = new System.Drawing.Point(224, 78); this.numericUpDown8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown8.Maximum = new decimal(new int[] { 65535, @@ -707,7 +791,7 @@ private void InitializeComponent() // checkBox3 // this.checkBox3.AutoSize = true; - this.checkBox3.Location = new System.Drawing.Point(16, 84); + this.checkBox3.Location = new System.Drawing.Point(17, 81); this.checkBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox3.Name = "checkBox3"; this.checkBox3.Size = new System.Drawing.Size(183, 25); @@ -718,13 +802,16 @@ private void InitializeComponent() // // button4 // - this.button4.Location = new System.Drawing.Point(1274, 124); + this.button4.BackColor = System.Drawing.Color.LimeGreen; + this.button4.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button4.ForeColor = System.Drawing.SystemColors.HighlightText; + this.button4.Location = new System.Drawing.Point(1276, 165); this.button4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button4.Name = "button4"; this.button4.Size = new System.Drawing.Size(138, 40); this.button4.TabIndex = 26; this.button4.Text = "检查更新"; - this.button4.UseVisualStyleBackColor = true; + this.button4.UseVisualStyleBackColor = false; this.button4.Click += new System.EventHandler(this.button4_Click); // // checkBox1 @@ -732,7 +819,7 @@ private void InitializeComponent() this.checkBox1.AutoSize = true; this.checkBox1.Checked = true; this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBox1.Location = new System.Drawing.Point(16, 35); + this.checkBox1.Location = new System.Drawing.Point(17, 35); this.checkBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox1.Name = "checkBox1"; this.checkBox1.Size = new System.Drawing.Size(162, 25); @@ -744,7 +831,7 @@ private void InitializeComponent() // checkBox2 // this.checkBox2.AutoSize = true; - this.checkBox2.Location = new System.Drawing.Point(194, 35); + this.checkBox2.Location = new System.Drawing.Point(198, 35); this.checkBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox2.Name = "checkBox2"; this.checkBox2.Size = new System.Drawing.Size(141, 25); @@ -775,17 +862,17 @@ private void InitializeComponent() "line_Full_WithIcon.yaml", "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/添加直连规则.yam" + "l"}); - this.comboBox5.Location = new System.Drawing.Point(759, 128); + this.comboBox5.Location = new System.Drawing.Point(895, 125); this.comboBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox5.Name = "comboBox5"; - this.comboBox5.Size = new System.Drawing.Size(501, 29); + this.comboBox5.Size = new System.Drawing.Size(517, 29); this.comboBox5.TabIndex = 24; this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); // // label19 // this.label19.AutoSize = true; - this.label19.Location = new System.Drawing.Point(477, 133); + this.label19.Location = new System.Drawing.Point(633, 129); this.label19.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label19.Name = "label19"; this.label19.Size = new System.Drawing.Size(265, 21); @@ -1222,7 +1309,7 @@ private void InitializeComponent() "tube.20140301.xyz", "vps.pansen626.com", "wfgithub.xiaonuomi.ie.eu.org"}); - this.comboBox3.Location = new System.Drawing.Point(1100, 33); + this.comboBox3.Location = new System.Drawing.Point(1104, 33); this.comboBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox3.Name = "comboBox3"; this.comboBox3.Size = new System.Drawing.Size(308, 29); @@ -1249,10 +1336,10 @@ private void InitializeComponent() "p.zip", "https://github.com/VSCodium/vscodium/releases/download/1.98.0.25067/codium-1.98.0" + ".25067-el9.aarch64.rpm"}); - this.comboBox2.Location = new System.Drawing.Point(759, 79); + this.comboBox2.Location = new System.Drawing.Point(741, 79); this.comboBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox2.Name = "comboBox2"; - this.comboBox2.Size = new System.Drawing.Size(501, 29); + this.comboBox2.Size = new System.Drawing.Size(671, 29); this.comboBox2.TabIndex = 19; this.comboBox2.Text = "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + "Waifu2x-Extension-GUI-v2.21.12-Portable.7z"; @@ -1260,7 +1347,7 @@ private void InitializeComponent() // label9 // this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(631, 84); + this.label9.Location = new System.Drawing.Point(631, 83); this.label9.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label9.Name = "label9"; this.label9.Size = new System.Drawing.Size(115, 21); @@ -1269,11 +1356,15 @@ private void InitializeComponent() // // progressBar1 // - this.progressBar1.Location = new System.Drawing.Point(24, 5); - this.progressBar1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.progressBar1.Location = new System.Drawing.Point(0, 0); + this.progressBar1.Margin = new System.Windows.Forms.Padding(0); this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(1430, 5); + this.progressBar1.Size = new System.Drawing.Size(1466, 10); + this.progressBar1.Step = 1; + this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous; this.progressBar1.TabIndex = 3; + this.toolTip1.SetToolTip(this.progressBar1, "检测进度"); + this.progressBar1.Visible = false; // // timer2 // @@ -1288,7 +1379,7 @@ private void InitializeComponent() this.groupBox4.Controls.Add(this.label12); this.groupBox4.Controls.Add(this.textBox2); this.groupBox4.Controls.Add(this.label11); - this.groupBox4.Location = new System.Drawing.Point(24, 1071); + this.groupBox4.Location = new System.Drawing.Point(24, 1106); this.groupBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox4.Name = "groupBox4"; this.groupBox4.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1368,7 +1459,7 @@ private void InitializeComponent() this.groupBox5.Controls.Add(this.label15); this.groupBox5.Controls.Add(this.textBox7); this.groupBox5.Controls.Add(this.label16); - this.groupBox5.Location = new System.Drawing.Point(24, 1171); + this.groupBox5.Location = new System.Drawing.Point(24, 1205); this.groupBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox5.Name = "groupBox5"; this.groupBox5.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1428,7 +1519,7 @@ private void InitializeComponent() this.groupBox6.Controls.Add(this.label17); this.groupBox6.Controls.Add(this.textBox9); this.groupBox6.Controls.Add(this.label18); - this.groupBox6.Location = new System.Drawing.Point(24, 1270); + this.groupBox6.Location = new System.Drawing.Point(24, 1304); this.groupBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox6.Name = "groupBox6"; this.groupBox6.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1513,7 +1604,7 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(1467, 1372); + this.ClientSize = new System.Drawing.Size(1466, 1406); this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox4); @@ -1539,6 +1630,8 @@ private void InitializeComponent() this.groupBox2.PerformLayout(); this.groupBox3.ResumeLayout(false); this.groupBox3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).EndInit(); this.groupBox4.ResumeLayout(false); this.groupBox4.PerformLayout(); @@ -1625,6 +1718,11 @@ private void InitializeComponent() private System.Windows.Forms.LinkLabel linkLabel1; private System.Windows.Forms.Button button8; private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.NumericUpDown numericUpDown9; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.NumericUpDown numericUpDown10; } } diff --git a/Form1.cs b/Form1.cs index a0e0424..3d98b5e 100644 --- a/Form1.cs +++ b/Form1.cs @@ -9,7 +9,6 @@ using System.Linq; using System.Net.Http; using System.Net.NetworkInformation; -using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; @@ -35,10 +34,8 @@ public partial class Form1 : Form int downloading = 0; // ——用于避免无意义的重复 UI 重绘—— - private string _lastStateType = null; // checking / idle / error private string _lastLogLabelNodeInfoText = string.Empty; private string _lastNotifyText = string.Empty; - private int _lastProgressBarValue = -1; public Form1() { @@ -54,6 +51,8 @@ public Form1() toolTip1.SetToolTip(numericUpDown5, "下载测试时间(s):与下载链接大小相关,默认最大测试10s。"); toolTip1.SetToolTip(numericUpDown6, "本地监听端口:用于直接返回测速结果的节点信息,方便 Sub-Store 实现订阅转换。"); toolTip1.SetToolTip(numericUpDown7, "Sub-Store监听端口:用于订阅订阅转换。\n注意:除非你知道你在干什么,否则不要将你的 Sub-Store 暴露到公网,否则可能会被滥用"); + toolTip1.SetToolTip(numericUpDown9, "下载测试限制(MB):当达到下载数据大小时,停止下载,可节省测速流量,减少测速测死的概率"); + toolTip1.SetToolTip(numericUpDown10, "总下载速度限制(MB/s):建议设置为 <=带宽/8, 比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20"); toolTip1.SetToolTip(textBox1, "节点池订阅地址:支持 Link、Base64、Clash 格式的订阅链接。"); toolTip1.SetToolTip(checkBox1, "以节点IP查询位置重命名节点。\n质量差的节点可能造成IP查询失败,造成整体检查速度稍微变慢。"); toolTip1.SetToolTip(checkBox2, "是否开启流媒体检测,其中IP欺诈依赖'节点地址查询',内核版本需要 v2.0.8 以上\n\n示例:美国1 | ⬇️ 5.6MB/s |0%|Netflix|Disney|Openai\n风控值:0% (使用ping0.cc标准)\n流媒体解锁:Netflix、Disney、Openai"); @@ -69,8 +68,11 @@ public Form1() toolTip1.SetToolTip(comboBox5, "生成带规则的 Clash 订阅所需的覆写规则文件"); toolTip1.SetToolTip(checkBox3, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); + toolTip1.SetToolTip(checkBox6, "总的下载速度限制,不选代表不限制"); toolTip1.SetToolTip(numericUpDown8, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); + toolTip1.SetToolTip(numericUpDown10, "总的下载速度限制,不选代表不限制"); + toolTip1.SetToolTip(textBox11, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); toolTip1.SetToolTip(checkBox5, "开机启动:勾选后,程序将在Windows启动时自动运行"); @@ -295,6 +297,12 @@ private async void ReadConfig()//读取配置文件 int? downloadtimeoutValue = 读取config整数(config, "download-timeout"); if (downloadtimeoutValue.HasValue) numericUpDown5.Value = downloadtimeoutValue.Value; + int? downloadLimitSizeValue = 读取config整数(config, "download-mb"); + if (downloadLimitSizeValue.HasValue) numericUpDown9.Value = downloadLimitSizeValue.Value; + + int? downloadLimitSpeedValue = 读取config整数(config, "total-speed-limit"); + if (downloadLimitSpeedValue.HasValue) numericUpDown10.Value = downloadLimitSpeedValue.Value; + string speedTestUrl = 读取config字符串(config, "speed-test-url"); if (speedTestUrl != null) comboBox2.Text = speedTestUrl; @@ -447,6 +455,22 @@ private async void ReadConfig()//读取配置文件 } } + int? totalspeedlimit = 读取config整数(config, "total-speed-limit"); + if (totalspeedlimit.HasValue) + { + if (totalspeedlimit.Value == 0) + { + checkBox6.Checked = false; + numericUpDown10.Enabled = false; + } + else + { + checkBox6.Checked = true; + numericUpDown10.Enabled = true; + numericUpDown10.Value = totalspeedlimit.Value; + } + } + string enablewebui = 读取config字符串(config, "enable-web-ui"); if (enablewebui != null && enablewebui == "true") checkBox4.Checked = true; else checkBox4.Checked = false; @@ -557,6 +581,9 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["timeout"] = (int)numericUpDown3.Value; config["min-speed"] = (int)numericUpDown4.Value; config["download-timeout"] = (int)numericUpDown5.Value; + config["download-mb"] = (int)numericUpDown9.Value; + config["total-speed-limit"] = (int)numericUpDown10.Value; + if (!string.IsNullOrEmpty(comboBox2.Text)) config["speed-test-url"] = comboBox2.Text; @@ -714,6 +741,10 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 if (checkBox3.Checked) config["success-limit"] = (int)numericUpDown8.Value; else config["success-limit"] = 0; + //下载速度限制,为0代表不限制 + if (checkBox6.Checked) config["total-speed-limit"] = (int)numericUpDown10.Value; + else config["total-speed-limit"] = 0; + // 使用YamlDotNet序列化配置 var serializer = new YamlDotNet.Serialization.SerializerBuilder() .WithIndentedSequences() // 使序列化结果更易读 @@ -792,6 +823,8 @@ private async void button1_Click(object sender, EventArgs e) numericUpDown3.Enabled = false; numericUpDown4.Enabled = false; numericUpDown5.Enabled = false; + numericUpDown9.Enabled = false; + numericUpDown10.Enabled = false; numericUpDown6.Enabled = false; numericUpDown7.Enabled = false; comboBox1.Enabled = false; @@ -828,7 +861,8 @@ private async void button1_Click(object sender, EventArgs e) run = 0; Log("任务停止"); progressBar1.Value = 0; - groupBox2.Text = "实时日志"; + progressBar1.Visible = false; + LogLabelNodeInfo.Text = "实时日志"; notifyIcon1.Text = "SubsCheck: 未运行"; // 停止 subs-check.exe 程序 StopSubsCheckProcess(); @@ -842,6 +876,8 @@ private async void button1_Click(object sender, EventArgs e) numericUpDown3.Enabled = true; numericUpDown4.Enabled = true; numericUpDown5.Enabled = true; + numericUpDown9.Enabled = true; + numericUpDown10.Enabled = true; numericUpDown6.Enabled = true; numericUpDown7.Enabled = true; comboBox1.Enabled = true; @@ -1054,6 +1090,7 @@ private async Task DownloadSubsCheckEXE() MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); progressBar1.Value = 0; + progressBar1.Visible = false; } // 解压文件 @@ -1263,7 +1300,8 @@ private async void StartSubsCheckProcess() { // 重置进度条 progressBar1.Value = 0; - groupBox2.Text = "实时日志"; + progressBar1.Visible = true; + LogLabelNodeInfo.Text = "实时日志"; using (MemoryStream ms = new MemoryStream(Properties.Resources.going)) { notifyIcon1.Icon = new Icon(ms); @@ -1581,6 +1619,8 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) numericUpDown3.Enabled = true; numericUpDown4.Enabled = true; numericUpDown5.Enabled = true; + numericUpDown9.Enabled = true; + numericUpDown10.Enabled = true; numericUpDown6.Enabled = true; textBox1.Enabled = true; groupBox3.Enabled = true; @@ -2319,6 +2359,8 @@ private async void timer3_Tick(object sender, EventArgs e) numericUpDown3.Enabled = false; numericUpDown4.Enabled = false; numericUpDown5.Enabled = false; + numericUpDown9.Enabled = false; + numericUpDown10.Enabled = false; numericUpDown6.Enabled = false; numericUpDown7.Enabled = false; comboBox1.Enabled = false; @@ -2368,6 +2410,12 @@ private void checkBox3_CheckedChanged(object sender, EventArgs e) else numericUpDown8.Enabled = false; } + private void checkBox6_CheckedChanged(object sender, EventArgs e) + { + if (checkBox6.Checked) numericUpDown10.Enabled = true; + else numericUpDown10.Enabled = false; + } + private async void comboBox5_SelectedIndexChanged(object sender, EventArgs e) { if (comboBox5.Text.Contains("[内置]")) await ProcessComboBox5Selection(true); @@ -2411,6 +2459,7 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) // 重置进度条 progressBar1.Value = 0; + progressBar1.Visible = true; // 添加GitHub代理前缀如果有 string fullDownloadUrl = githubProxyURL + downloadUrl; @@ -2479,6 +2528,7 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) Log($"{displayName} 覆写配置文件 下载失败: {ex.Message}", true); // 出错时重置进度条 progressBar1.Value = 0; + progressBar1.Visible = false; } } else @@ -2654,11 +2704,7 @@ private async void timer4_Tick(object sender, EventArgs e) if (进度条百分比 < 0) 进度条百分比 = 0; if (进度条百分比 > 100) 进度条百分比 = 100; - if (_lastProgressBarValue != 进度条百分比) - { - _lastProgressBarValue = 进度条百分比; - progressBar1.Value = 进度条百分比; - } + progressBar1.Value = 进度条百分比; if (!button7.Enabled) button7.Enabled = true; } @@ -2678,11 +2724,7 @@ private async void timer4_Tick(object sender, EventArgs e) { if (button7.Text != "⏯️ 开始") button7.Text = "⏯️ 开始"; - if (_lastProgressBarValue != 100) - { - _lastProgressBarValue = 100; - progressBar1.Value = 100; - } + progressBar1.Value = 100; nodeInfo = $"等待{nextCheckTime}"; string idleNotify = "SubsCheck: 已就绪\n" + nextCheckTime; diff --git a/Form1.resx b/Form1.resx index c367db0..404b1ff 100644 --- a/Form1.resx +++ b/Form1.resx @@ -3474,18 +3474,21 @@ https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta-2.y https://raw.githubusercontent.com/go4sharing/sub/main/sub.yaml https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt - - 228, 17 - 320, 17 + + 228, 17 + 423, 17 515, 17 + + 117 + AAABAAoAEBAAAAEAIABoBAAApgAAABgYAAABACAAiAkAAA4FAAAgIAAAAQAgAKgQAACWDgAAMDAAAAEA From eaee86a26ada0a9fd56ec79c11d9a69cc6e6072b Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 25 Aug 2025 20:01:49 +0800 Subject: [PATCH 05/92] =?UTF-8?q?fix:=20=E5=AF=B9=E9=BD=90=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 3 ++- Form1.resx | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 0e1633a..d5a2886 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -661,7 +661,7 @@ private void InitializeComponent() // numericUpDown10 // this.numericUpDown10.Enabled = false; - this.numericUpDown10.Location = new System.Drawing.Point(224, 119); + this.numericUpDown10.Location = new System.Drawing.Point(224, 124); this.numericUpDown10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDown10.Maximum = new decimal(new int[] { 1000, @@ -803,6 +803,7 @@ private void InitializeComponent() // button4 // this.button4.BackColor = System.Drawing.Color.LimeGreen; + this.button4.FlatAppearance.BorderSize = 0; this.button4.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.button4.ForeColor = System.Drawing.SystemColors.HighlightText; this.button4.Location = new System.Drawing.Point(1276, 165); diff --git a/Form1.resx b/Form1.resx index 404b1ff..eb9e3e1 100644 --- a/Form1.resx +++ b/Form1.resx @@ -3480,6 +3480,9 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 228, 17 + + 320, 17 + 423, 17 From 3fe1348da92d8ba4e5db29ebbc49b394f038745c Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 25 Aug 2025 20:28:19 +0800 Subject: [PATCH 06/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=8B?= =?UTF-8?q?=E9=80=9F=E5=9C=B0=E5=9D=80=E4=B8=8B=E6=8B=89=E6=A1=86=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=AD=A3=E7=A1=AE=E6=98=BE=E7=A4=BA=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=B5=8B=E9=80=9F=E5=9C=B0=E5=9D=80=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.cs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Form1.cs b/Form1.cs index 3d98b5e..dc0f15f 100644 --- a/Form1.cs +++ b/Form1.cs @@ -304,7 +304,11 @@ private async void ReadConfig()//读取配置文件 if (downloadLimitSpeedValue.HasValue) numericUpDown10.Value = downloadLimitSpeedValue.Value; string speedTestUrl = 读取config字符串(config, "speed-test-url"); - if (speedTestUrl != null) comboBox2.Text = speedTestUrl; + if (speedTestUrl != null) + { + comboBox2.Items.Add(speedTestUrl); + comboBox2.Text = speedTestUrl; + } string savemethod = 读取config字符串(config, "save-method"); if (savemethod != null) @@ -1802,6 +1806,20 @@ private void timer2_Tick(object sender, EventArgs e) button3.Text = "复制订阅"; } + private void comboBox2_Leave(object sender, EventArgs e) + { + // 检查是否有内容 + if (string.IsNullOrWhiteSpace(comboBox2.Text)) + { + return; + } + + string input = comboBox2.Text.Trim(); + + // 更新 comboBox2 的文本和选项 + comboBox2.Items.Add(input); + comboBox2.Text = input; + } private void comboBox3_Leave(object sender, EventArgs e) { // 检查是否有内容 From 8b4f2819568cc7915f28ef129e82d22deaac2a48 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 26 Aug 2025 00:46:41 +0800 Subject: [PATCH 07/92] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8location?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E6=9B=BF=E4=BB=A3cron=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E7=A1=AC=E7=BC=96=E7=A0=81=E4=BD=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 77 ++++++++++++++++++++++++++++------------------- Form1.cs | 43 +++++++++++++++----------- 2 files changed, 72 insertions(+), 48 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index d5a2886..cdb3084 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -34,12 +34,11 @@ private void InitializeComponent() this.timer1 = new System.Windows.Forms.Timer(this.components); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.checkBox5 = new System.Windows.Forms.CheckBox(); - this.textBox11 = new System.Windows.Forms.TextBox(); + this.textBoxCron = new System.Windows.Forms.TextBox(); this.button7 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button(); this.comboBox4 = new System.Windows.Forms.ComboBox(); this.button3 = new System.Windows.Forms.Button(); - this.textBox1 = new System.Windows.Forms.TextBox(); this.comboBox1 = new System.Windows.Forms.ComboBox(); this.numericUpDown4 = new System.Windows.Forms.NumericUpDown(); this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); @@ -49,10 +48,12 @@ private void InitializeComponent() this.label6 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); + this.labelCron = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.button2 = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button(); this.label8 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); this.numericUpDown6 = new System.Windows.Forms.NumericUpDown(); this.numericUpDown5 = new System.Windows.Forms.NumericUpDown(); this.label4 = new System.Windows.Forms.Label(); @@ -143,12 +144,11 @@ private void InitializeComponent() // groupBox1 // this.groupBox1.Controls.Add(this.checkBox5); - this.groupBox1.Controls.Add(this.textBox11); + this.groupBox1.Controls.Add(this.textBoxCron); this.groupBox1.Controls.Add(this.button7); this.groupBox1.Controls.Add(this.button6); this.groupBox1.Controls.Add(this.comboBox4); this.groupBox1.Controls.Add(this.button3); - this.groupBox1.Controls.Add(this.textBox1); this.groupBox1.Controls.Add(this.comboBox1); this.groupBox1.Controls.Add(this.numericUpDown4); this.groupBox1.Controls.Add(this.numericUpDown3); @@ -158,10 +158,12 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.label6); this.groupBox1.Controls.Add(this.label3); this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.labelCron); this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.button2); this.groupBox1.Controls.Add(this.button1); this.groupBox1.Controls.Add(this.label8); + this.groupBox1.Controls.Add(this.textBox1); this.groupBox1.Location = new System.Drawing.Point(24, 23); this.groupBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox1.Name = "groupBox1"; @@ -183,18 +185,18 @@ private void InitializeComponent() this.checkBox5.UseVisualStyleBackColor = true; this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); // - // textBox11 + // textBoxCron // - this.textBox11.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBox11.Location = new System.Drawing.Point(16, 600); - this.textBox11.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.textBox11.Name = "textBox11"; - this.textBox11.Size = new System.Drawing.Size(281, 31); - this.textBox11.TabIndex = 21; - this.textBox11.Text = "0 */2 * * *"; - this.textBox11.Visible = false; - this.textBox11.DoubleClick += new System.EventHandler(this.切换cron表达式); - this.textBox11.Leave += new System.EventHandler(this.textBox11_Leave); + this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxCron.Location = new System.Drawing.Point(79, 603); + this.textBoxCron.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxCron.Name = "textBoxCron"; + this.textBoxCron.Size = new System.Drawing.Size(219, 31); + this.textBoxCron.TabIndex = 21; + this.textBoxCron.Text = "0 */2 * * *"; + this.textBoxCron.Visible = false; + this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); // // button7 // @@ -245,21 +247,6 @@ private void InitializeComponent() this.button3.UseVisualStyleBackColor = true; this.button3.Click += new System.EventHandler(this.button3_Click); // - // textBox1 - // - this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBox1.Location = new System.Drawing.Point(16, 313); - this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.textBox1.Multiline = true; - this.textBox1.Name = "textBox1"; - this.textBox1.ReadOnly = true; - this.textBox1.Size = new System.Drawing.Size(281, 322); - this.textBox1.TabIndex = 17; - this.textBox1.Text = resources.GetString("textBox1.Text"); - this.textBox1.WordWrap = false; - this.textBox1.Click += new System.EventHandler(this.textBox1_DoubleClick); - this.textBox1.DoubleClick += new System.EventHandler(this.textBox1_DoubleClick); - // // comboBox1 // this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -413,6 +400,18 @@ private void InitializeComponent() this.label2.Text = "检查间隔(分钟):"; this.label2.DoubleClick += new System.EventHandler(this.切换cron表达式); // + // labelCron + // + this.labelCron.AutoSize = true; + this.labelCron.Location = new System.Drawing.Point(13, 608); + this.labelCron.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelCron.Name = "labelCron"; + this.labelCron.Size = new System.Drawing.Size(73, 21); + this.labelCron.TabIndex = 40; + this.labelCron.Text = "计划:"; + this.labelCron.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.labelCron.Visible = false; + // // label1 // this.label1.AutoSize = true; @@ -457,6 +456,21 @@ private void InitializeComponent() this.label8.Text = "节点池订阅链接(点击编辑):"; this.label8.Click += new System.EventHandler(this.textBox1_DoubleClick); // + // textBox1 + // + this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBox1.Location = new System.Drawing.Point(16, 313); + this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ReadOnly = true; + this.textBox1.Size = new System.Drawing.Size(281, 322); + this.textBox1.TabIndex = 17; + this.textBox1.Text = resources.GetString("textBox1.Text"); + this.textBox1.WordWrap = false; + this.textBox1.Click += new System.EventHandler(this.textBox1_DoubleClick); + this.textBox1.DoubleClick += new System.EventHandler(this.textBox1_DoubleClick); + // // numericUpDown6 // this.numericUpDown6.Location = new System.Drawing.Point(515, 33); @@ -1661,6 +1675,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label labelCron; private System.Windows.Forms.Label label1; private System.Windows.Forms.NumericUpDown numericUpDown6; private System.Windows.Forms.NumericUpDown numericUpDown5; @@ -1715,7 +1730,7 @@ private void InitializeComponent() private System.Windows.Forms.Button button6; private System.Windows.Forms.Timer timer4; private System.Windows.Forms.Button button7; - private System.Windows.Forms.TextBox textBox11; + private System.Windows.Forms.TextBox textBoxCron; private System.Windows.Forms.LinkLabel linkLabel1; private System.Windows.Forms.Button button8; private System.Windows.Forms.CheckBox checkBox5; diff --git a/Form1.cs b/Form1.cs index dc0f15f..a7389c9 100644 --- a/Form1.cs +++ b/Form1.cs @@ -73,7 +73,9 @@ public Form1() toolTip1.SetToolTip(numericUpDown10, "总的下载速度限制,不选代表不限制"); - toolTip1.SetToolTip(textBox11, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); + toolTip1.SetToolTip(labelCron, "双击切换 使用「分钟倒计时」"); + + toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); toolTip1.SetToolTip(checkBox5, "开机启动:勾选后,程序将在Windows启动时自动运行"); // 设置通知图标的上下文菜单 @@ -506,10 +508,12 @@ private async void ReadConfig()//读取配置文件 string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { - textBox11.Text = cronexpression; - string cronDescription = GetCronExpressionDescription(textBox11.Text); - textBox11.Location = new Point(9, 48); - textBox11.Visible = true; + textBoxCron.Text = cronexpression; + string cronDescription = GetCronExpressionDescription(textBoxCron.Text); + labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); + textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDown2.Location.Y); + labelCron.Visible = true; + textBoxCron.Visible = true; label2.Visible = false; numericUpDown2.Visible = false; } @@ -581,7 +585,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 // 从UI控件获取值并添加到字典中 config["concurrent"] = (int)numericUpDown1.Value; config["check-interval"] = (int)numericUpDown2.Value; - if (textBox11.Visible) config["cron-expression"] = textBox11.Text; + if (textBoxCron.Visible) config["cron-expression"] = textBoxCron.Text; config["timeout"] = (int)numericUpDown3.Value; config["min-speed"] = (int)numericUpDown4.Value; config["download-timeout"] = (int)numericUpDown5.Value; @@ -823,7 +827,8 @@ private async void button1_Click(object sender, EventArgs e) numericUpDown1.Enabled = false; numericUpDown2.Enabled = false; - textBox11.Enabled = false; + labelCron.Enabled = false; + textBoxCron.Enabled = false; numericUpDown3.Enabled = false; numericUpDown4.Enabled = false; numericUpDown5.Enabled = false; @@ -876,7 +881,8 @@ private async void button1_Click(object sender, EventArgs e) button3.Enabled = false; numericUpDown1.Enabled = true; numericUpDown2.Enabled = true; - textBox11.Enabled = true; + labelCron.Enabled = true; + textBoxCron.Enabled = true; numericUpDown3.Enabled = true; numericUpDown4.Enabled = true; numericUpDown5.Enabled = true; @@ -2847,12 +2853,12 @@ private async Task SendApiRequestAsync(string endpoint, string operationNa } } - private void textBox11_Leave(object sender, EventArgs e) + private void textBoxCron_Leave(object sender, EventArgs e) { - if (IsValidCronExpression(textBox11.Text)) + if (IsValidCronExpression(textBoxCron.Text)) { // 计算并显示cron表达式的说明 - string cronDescription = GetCronExpressionDescription(textBox11.Text); + string cronDescription = GetCronExpressionDescription(textBoxCron.Text); // 可以用工具提示或者消息框显示,这里使用消息框 //MessageBox.Show(cronDescription, "Cron表达式说明", MessageBoxButtons.OK, MessageBoxIcon.Information); Log($"Cron表达式说明 {cronDescription}"); @@ -2861,8 +2867,8 @@ private void textBox11_Leave(object sender, EventArgs e) { MessageBox.Show("请输入有效的cron表达式,例如:*/30 * * * *", "无效的cron表达式", MessageBoxButtons.OK, MessageBoxIcon.Warning); - textBox11.Focus(); - textBox11.Text = "0 */2 * * *"; // 恢复默认值 + textBoxCron.Focus(); + textBoxCron.Text = "0 */2 * * *"; // 恢复默认值 } } @@ -3077,17 +3083,20 @@ private string ParseCronPart(string part, string unit, int min, int max, bool is private void 切换cron表达式(object sender, EventArgs e) { - if (textBox11.Visible) + if (textBoxCron.Visible) { - textBox11.Visible = false; + labelCron.Visible = false; + textBoxCron.Visible = false; label2.Visible = true; numericUpDown2.Visible = true; Log("下次检查时间间隔 使用分钟倒计时"); } else { - textBox11.Location = new Point(9, 48); - textBox11.Visible = true; + labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); + textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDown2.Location.Y); + labelCron.Visible = true; + textBoxCron.Visible = true; label2.Visible = false; numericUpDown2.Visible = false; Log("下次检查时间间隔 使用cron表达式"); From ca8898bc32d157e78610bb1711a71bbd4dafa132 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 26 Aug 2025 00:45:27 +0800 Subject: [PATCH 08/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E6=B5=81=E6=B0=B4=E7=BA=BF=E5=B9=B6=E5=8F=91=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 241 ++++++++++++++++++++++++++++++++++++++++++++-- Form1.cs | 11 +++ Form1.resx | 5 +- 3 files changed, 244 insertions(+), 13 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index cdb3084..0791945 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -33,7 +33,9 @@ private void InitializeComponent() this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.timer1 = new System.Windows.Forms.Timer(this.components); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.switchArch = new System.Windows.Forms.CheckBox(); this.textBoxCron = new System.Windows.Forms.TextBox(); this.button7 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button(); @@ -109,6 +111,17 @@ private void InitializeComponent() this.label18 = new System.Windows.Forms.Label(); this.timer3 = new System.Windows.Forms.Timer(this.components); this.timer4 = new System.Windows.Forms.Timer(this.components); + this.groupBox7 = new System.Windows.Forms.GroupBox(); + this.numericUpDown13 = new System.Windows.Forms.NumericUpDown(); + this.label25 = new System.Windows.Forms.Label(); + this.numericUpDown12 = new System.Windows.Forms.NumericUpDown(); + this.label24 = new System.Windows.Forms.Label(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.numericUpDown11 = new System.Windows.Forms.NumericUpDown(); + this.label23 = new System.Windows.Forms.Label(); + this.groupBox8 = new System.Windows.Forms.GroupBox(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); @@ -125,6 +138,11 @@ private void InitializeComponent() this.groupBox4.SuspendLayout(); this.groupBox5.SuspendLayout(); this.groupBox6.SuspendLayout(); + this.groupBox7.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown13)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown12)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown11)).BeginInit(); + this.groupBox8.SuspendLayout(); this.SuspendLayout(); // // notifyIcon1 @@ -143,8 +161,9 @@ private void InitializeComponent() // // groupBox1 // - this.groupBox1.Controls.Add(this.checkBox5); this.groupBox1.Controls.Add(this.textBoxCron); + this.groupBox1.Controls.Add(this.checkBox5); + this.groupBox1.Controls.Add(this.switchArch); this.groupBox1.Controls.Add(this.button7); this.groupBox1.Controls.Add(this.button6); this.groupBox1.Controls.Add(this.comboBox4); @@ -163,6 +182,7 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.button2); this.groupBox1.Controls.Add(this.button1); this.groupBox1.Controls.Add(this.label8); + this.groupBox1.Controls.Add(this.checkBox7); this.groupBox1.Controls.Add(this.textBox1); this.groupBox1.Location = new System.Drawing.Point(24, 23); this.groupBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -173,6 +193,16 @@ private void InitializeComponent() this.groupBox1.TabStop = false; this.groupBox1.Text = "参数设置"; // + // checkBox7 + // + this.checkBox7.AutoSize = true; + this.checkBox7.Location = new System.Drawing.Point(18, 608); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.Size = new System.Drawing.Size(141, 25); + this.checkBox7.TabIndex = 39; + this.checkBox7.Text = "高并发模式"; + this.checkBox7.UseVisualStyleBackColor = true; + // // checkBox5 // this.checkBox5.AutoSize = true; @@ -185,10 +215,20 @@ private void InitializeComponent() this.checkBox5.UseVisualStyleBackColor = true; this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); // + // switchArch + // + this.switchArch.AutoSize = true; + this.switchArch.Location = new System.Drawing.Point(167, 608); + this.switchArch.Name = "switchArch"; + this.switchArch.Size = new System.Drawing.Size(111, 25); + this.switchArch.TabIndex = 38; + this.switchArch.Text = "x64内核"; + this.switchArch.UseVisualStyleBackColor = true; + // // textBoxCron // this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxCron.Location = new System.Drawing.Point(79, 603); + this.textBoxCron.Location = new System.Drawing.Point(79, 562); this.textBoxCron.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBoxCron.Name = "textBoxCron"; this.textBoxCron.Size = new System.Drawing.Size(219, 31); @@ -403,7 +443,7 @@ private void InitializeComponent() // labelCron // this.labelCron.AutoSize = true; - this.labelCron.Location = new System.Drawing.Point(13, 608); + this.labelCron.Location = new System.Drawing.Point(13, 567); this.labelCron.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelCron.Name = "labelCron"; this.labelCron.Size = new System.Drawing.Size(73, 21); @@ -464,7 +504,7 @@ private void InitializeComponent() this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ReadOnly = true; - this.textBox1.Size = new System.Drawing.Size(281, 322); + this.textBox1.Size = new System.Drawing.Size(281, 280); this.textBox1.TabIndex = 17; this.textBox1.Text = resources.GetString("textBox1.Text"); this.textBox1.WordWrap = false; @@ -601,7 +641,7 @@ private void InitializeComponent() // // button5 // - this.button5.Location = new System.Drawing.Point(944, 788); + this.button5.Location = new System.Drawing.Point(956, 802); this.button5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button5.Name = "button5"; this.button5.Size = new System.Drawing.Size(138, 40); @@ -1394,7 +1434,7 @@ private void InitializeComponent() this.groupBox4.Controls.Add(this.label12); this.groupBox4.Controls.Add(this.textBox2); this.groupBox4.Controls.Add(this.label11); - this.groupBox4.Location = new System.Drawing.Point(24, 1106); + this.groupBox4.Location = new System.Drawing.Point(24, 1202); this.groupBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox4.Name = "groupBox4"; this.groupBox4.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1474,7 +1514,7 @@ private void InitializeComponent() this.groupBox5.Controls.Add(this.label15); this.groupBox5.Controls.Add(this.textBox7); this.groupBox5.Controls.Add(this.label16); - this.groupBox5.Location = new System.Drawing.Point(24, 1205); + this.groupBox5.Location = new System.Drawing.Point(24, 1300); this.groupBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox5.Name = "groupBox5"; this.groupBox5.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1534,7 +1574,7 @@ private void InitializeComponent() this.groupBox6.Controls.Add(this.label17); this.groupBox6.Controls.Add(this.textBox9); this.groupBox6.Controls.Add(this.label18); - this.groupBox6.Location = new System.Drawing.Point(24, 1304); + this.groupBox6.Location = new System.Drawing.Point(24, 1398); this.groupBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox6.Name = "groupBox6"; this.groupBox6.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1613,13 +1653,176 @@ private void InitializeComponent() // this.timer4.Tick += new System.EventHandler(this.timer4_Tick); // + // groupBox7 + // + this.groupBox7.Controls.Add(this.numericUpDown13); + this.groupBox7.Controls.Add(this.label25); + this.groupBox7.Controls.Add(this.numericUpDown12); + this.groupBox7.Controls.Add(this.label24); + this.groupBox7.Controls.Add(this.checkBox8); + this.groupBox7.Controls.Add(this.numericUpDown11); + this.groupBox7.Controls.Add(this.label23); + this.groupBox7.Location = new System.Drawing.Point(24, 1104); + this.groupBox7.Name = "groupBox7"; + this.groupBox7.Size = new System.Drawing.Size(1009, 89); + this.groupBox7.TabIndex = 7; + this.groupBox7.TabStop = false; + this.groupBox7.Text = "流水线并发 参数"; + // + // numericUpDown13 + // + this.numericUpDown13.Location = new System.Drawing.Point(883, 36); + this.numericUpDown13.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDown13.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDown13.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDown13.Name = "numericUpDown13"; + this.numericUpDown13.Size = new System.Drawing.Size(106, 31); + this.numericUpDown13.TabIndex = 43; + this.numericUpDown13.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(684, 41); + this.label25.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(199, 21); + this.label25.TabIndex = 42; + this.label25.Text = "流媒体检测并发数:"; + // + // numericUpDown12 + // + this.numericUpDown12.Location = new System.Drawing.Point(538, 36); + this.numericUpDown12.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDown12.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDown12.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDown12.Name = "numericUpDown12"; + this.numericUpDown12.Size = new System.Drawing.Size(106, 31); + this.numericUpDown12.TabIndex = 41; + this.numericUpDown12.Value = new decimal(new int[] { + 32, + 0, + 0, + 0}); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(404, 41); + this.label24.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(136, 21); + this.label24.TabIndex = 40; + this.label24.Text = "下载并发数:"; + // + // checkBox8 + // + this.checkBox8.AutoSize = true; + this.checkBox8.Checked = true; + this.checkBox8.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox8.Location = new System.Drawing.Point(18, 39); + this.checkBox8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.Size = new System.Drawing.Size(99, 25); + this.checkBox8.TabIndex = 38; + this.checkBox8.Text = "自适应"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // numericUpDown11 + // + this.numericUpDown11.Location = new System.Drawing.Point(275, 38); + this.numericUpDown11.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDown11.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDown11.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDown11.Name = "numericUpDown11"; + this.numericUpDown11.Size = new System.Drawing.Size(106, 31); + this.numericUpDown11.TabIndex = 39; + this.numericUpDown11.Value = new decimal(new int[] { + 500, + 0, + 0, + 0}); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(138, 41); + this.label23.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(136, 21); + this.label23.TabIndex = 38; + this.label23.Text = "测活并发数:"; + // + // groupBox8 + // + this.groupBox8.Controls.Add(this.checkBox10); + this.groupBox8.Controls.Add(this.checkBox9); + this.groupBox8.Location = new System.Drawing.Point(1039, 1104); + this.groupBox8.Name = "groupBox8"; + this.groupBox8.Size = new System.Drawing.Size(415, 89); + this.groupBox8.TabIndex = 44; + this.groupBox8.TabStop = false; + this.groupBox8.Text = "Enhance 参数"; + // + // checkBox10 + // + this.checkBox10.AutoSize = true; + this.checkBox10.Location = new System.Drawing.Point(201, 38); + this.checkBox10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.Size = new System.Drawing.Size(205, 25); + this.checkBox10.TabIndex = 39; + this.checkBox10.Text = "丢弃低质量CF节点"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // checkBox9 + // + this.checkBox9.AutoSize = true; + this.checkBox9.Location = new System.Drawing.Point(18, 39); + this.checkBox9.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.Size = new System.Drawing.Size(162, 25); + this.checkBox9.TabIndex = 38; + this.checkBox9.Text = "增强位置标签"; + this.checkBox9.UseVisualStyleBackColor = true; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(1466, 1406); + this.ClientSize = new System.Drawing.Size(1466, 1510); + this.Controls.Add(this.groupBox8); + this.Controls.Add(this.groupBox7); this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox4); @@ -1654,6 +1857,13 @@ private void InitializeComponent() this.groupBox5.PerformLayout(); this.groupBox6.ResumeLayout(false); this.groupBox6.PerformLayout(); + this.groupBox7.ResumeLayout(false); + this.groupBox7.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown13)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown12)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown11)).EndInit(); + this.groupBox8.ResumeLayout(false); + this.groupBox8.PerformLayout(); this.ResumeLayout(false); } @@ -1739,6 +1949,19 @@ private void InitializeComponent() private System.Windows.Forms.Label label22; private System.Windows.Forms.CheckBox checkBox6; private System.Windows.Forms.NumericUpDown numericUpDown10; + private System.Windows.Forms.CheckBox switchArch; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.GroupBox groupBox7; + private System.Windows.Forms.NumericUpDown numericUpDown11; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.NumericUpDown numericUpDown13; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.NumericUpDown numericUpDown12; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.GroupBox groupBox8; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.CheckBox checkBox10; } } diff --git a/Form1.cs b/Form1.cs index a7389c9..ef11c00 100644 --- a/Form1.cs +++ b/Form1.cs @@ -798,11 +798,22 @@ private void button2_Click(object sender, EventArgs e) { button2.Text = "高级设置∨"; groupBox3.Visible = false; + groupBox7.Visible = false; + groupBox8.Visible = false; + if (checkBox7.Checked) + { + groupBox7.Visible = false; + groupBox8.Visible = false; + } } else { button2.Text = "高级设置∧"; groupBox3.Visible = true; + if (checkBox7.Checked) { + groupBox7.Visible = true; + groupBox8.Visible = true; + } } 判断保存类型(); } diff --git a/Form1.resx b/Form1.resx index eb9e3e1..87066a8 100644 --- a/Form1.resx +++ b/Form1.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 228, 17 - - 320, 17 - 423, 17 @@ -3490,7 +3487,7 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 515, 17 - 117 + 89 From c1f40654f42635abbd7fcd7da5f860707a71fd49 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 26 Aug 2025 11:35:57 +0800 Subject: [PATCH 09/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A032\64=E4=BD=8D?= =?UTF-8?q?=E5=86=85=E6=A0=B8=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 16 +- Form1.cs | 404 +++++++++++++++++++++++++--------------------- Form1.resx | 3 - 3 files changed, 234 insertions(+), 189 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index cdb3084..fa8afad 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -66,6 +66,7 @@ private void InitializeComponent() this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.LogLabelNodeInfo = new System.Windows.Forms.Label(); this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.checkBoxSwitchArch64 = new System.Windows.Forms.CheckBox(); this.numericUpDown10 = new System.Windows.Forms.NumericUpDown(); this.checkBox6 = new System.Windows.Forms.CheckBox(); this.label22 = new System.Windows.Forms.Label(); @@ -409,8 +410,8 @@ private void InitializeComponent() this.labelCron.Size = new System.Drawing.Size(73, 21); this.labelCron.TabIndex = 40; this.labelCron.Text = "计划:"; - this.labelCron.DoubleClick += new System.EventHandler(this.切换cron表达式); this.labelCron.Visible = false; + this.labelCron.DoubleClick += new System.EventHandler(this.切换cron表达式); // // label1 // @@ -637,6 +638,7 @@ private void InitializeComponent() // // groupBox3 // + this.groupBox3.Controls.Add(this.checkBoxSwitchArch64); this.groupBox3.Controls.Add(this.numericUpDown10); this.groupBox3.Controls.Add(this.checkBox6); this.groupBox3.Controls.Add(this.label22); @@ -672,6 +674,17 @@ private void InitializeComponent() this.groupBox3.Text = "高级设置"; this.groupBox3.Visible = false; // + // checkBoxSwitchArch64 + // + this.checkBoxSwitchArch64.AutoSize = true; + this.checkBoxSwitchArch64.Location = new System.Drawing.Point(515, 173); + this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; + this.checkBoxSwitchArch64.Size = new System.Drawing.Size(153, 25); + this.checkBoxSwitchArch64.TabIndex = 38; + this.checkBoxSwitchArch64.Text = "使用x64内核"; + this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; + this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.checkBoxSwitchArch64_CheckedChanged); + // // numericUpDown10 // this.numericUpDown10.Enabled = false; @@ -1739,6 +1752,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label22; private System.Windows.Forms.CheckBox checkBox6; private System.Windows.Forms.NumericUpDown numericUpDown10; + private System.Windows.Forms.CheckBox checkBoxSwitchArch64; } } diff --git a/Form1.cs b/Form1.cs index a7389c9..c100b32 100644 --- a/Form1.cs +++ b/Form1.cs @@ -27,6 +27,7 @@ public partial class Form1 : Form string githubProxyURL = ""; int run = 0; string 当前subsCheck版本号 = "未知版本"; + string currentArch = "i386"; string 当前GUI版本号 = "未知版本"; string 最新GUI版本号 = "未知版本"; private string nextCheckTime = null;// 用于存储下次检查时间 @@ -445,6 +446,9 @@ private async void ReadConfig()//读取配置文件 string subscheckversion = 读取config字符串(config, "subscheck-version"); if (subscheckversion != null) 当前subsCheck版本号 = subscheckversion; + string subscheckArch = 读取config字符串(config, "subscheck-arch"); + if (subscheckArch != null) currentArch = subscheckArch; + int? successlimit = 读取config整数(config, "success-limit"); if (successlimit.HasValue) { @@ -505,6 +509,10 @@ private async void ReadConfig()//读取配置文件 } } + string switchX64 = 读取config字符串(config, "switch-x64"); + if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; + else checkBoxSwitchArch64.Checked = false; + string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { @@ -738,10 +746,12 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["rename-node"] = checkBox1.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBox2.Checked;//是否开启流媒体检测 + config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["keep-success-proxies"] = false; config["print-progress"] = false;//是否显示进度 config["sub-urls-retry"] = 3;//重试次数(获取订阅失败后重试次数) config["subscheck-version"] = 当前subsCheck版本号;//当前subsCheck版本号 + config["subscheck-arch"] = currentArch; //当前subsCheck架构 config["gui-auto"] = checkBox5.Checked;//是否开机自启 @@ -924,232 +934,228 @@ private async Task DownloadSubsCheckEXE() } var result = await 获取版本号("https://api.github.com/repos/beck-8/subs-check/releases/latest", true); - if (result.Item1 != "未知版本") + if (result.Item1 == "未知版本") { - // 创建不使用系统代理的 HttpClientHandler - HttpClientHandler handler = new HttpClientHandler - { - UseProxy = false, - Proxy = null - }; + // 无版本信息 + return; + } - // 使用自定义 handler 创建 HttpClient - using (HttpClient client = new HttpClient(handler)) + // 决定目标资源名称:64位优先 (amd64),否则 i386 + string desiredArchToken = checkBoxSwitchArch64.Checked ? "x86_64" : "i386"; + string desiredAssetName = $"subs-check_Windows_{desiredArchToken}.zip"; + + // 创建不使用系统代理的 HttpClientHandler + HttpClientHandler handler = new HttpClientHandler + { + UseProxy = false, + Proxy = null + }; + + // 使用自定义 handler 创建 HttpClient + using (HttpClient client = new HttpClient(handler)) + { + try { - try + string latestVersion = result.Item1; + JArray assets = result.Item2; + Log($"subs-check.exe 最新版本为: {latestVersion} "); + + // 先尝试精确匹配期望文件名;找不到则回退为任意包含 "Windows" 且包含 arch token 的条目; + // 若仍找不到,再回退为任意包含 "Windows" 的资源。 + string downloadUrl = null; + foreach (var asset in assets) { - string latestVersion = result.Item1; - JArray assets = result.Item2; - Log($"subs-check.exe 最新版本为: {latestVersion} "); - // 查找Windows i386版本的资源 - string downloadUrl = null; + if (asset["name"]?.ToString().Equals(desiredAssetName, StringComparison.OrdinalIgnoreCase) == true) + { + downloadUrl = asset["browser_download_url"].ToString(); + break; + } + } + if (downloadUrl == null) + { foreach (var asset in assets) { - if (asset["name"].ToString() == "subs-check_Windows_i386.zip") + string name = asset["name"]?.ToString() ?? ""; + if (name.IndexOf("Windows", StringComparison.OrdinalIgnoreCase) >= 0 && + name.IndexOf(desiredArchToken, StringComparison.OrdinalIgnoreCase) >= 0) { downloadUrl = asset["browser_download_url"].ToString(); break; } } + } - if (downloadUrl != null) + if (downloadUrl == null) + { + // 最后退化:任何 Windows 包 + foreach (var asset in assets) { - string 代理下载链接 = githubProxyURL + downloadUrl; - string 原生下载链接 = 代理下载链接; - // 计算"https://"在下载链接中出现的次数 - int httpsCount = 0; - int lastIndex = -1; - int currentIndex = 0; - - // 查找所有"https://"出现的位置 - while ((currentIndex = 代理下载链接.IndexOf("https://", currentIndex)) != -1) + string name = asset["name"]?.ToString() ?? ""; + if (name.IndexOf("Windows", StringComparison.OrdinalIgnoreCase) >= 0) { - httpsCount++; - lastIndex = currentIndex; - currentIndex += 8; // "https://".Length = 8 + downloadUrl = asset["browser_download_url"].ToString(); + break; } + } + } - // 如果"https://"出现2次或以上,提取最后一个"https://"之后的内容 - if (httpsCount >= 2 && lastIndex != -1) - { - 原生下载链接 = 代理下载链接.Substring(lastIndex); - } + if (downloadUrl == null) + { + Log("无法找到适用于 Windows 的下载链接。", true); + MessageBox.Show("未能找到适用的 subs-check.exe 下载链接。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } - string executablePath = Path.GetDirectoryName(Application.ExecutablePath); + // 处理代理链接里可能嵌套 https:// 的情况 + string 代理下载链接 = githubProxyURL + downloadUrl; + string 原生下载链接 = 代理下载链接; + // 计算"https://"在下载链接中出现的次数 + int httpsCount = 0; + int lastIndex = -1; + int currentIndex = 0; - // 创建下载请求 - 优化的多级尝试下载逻辑 - Log("开始下载文件..."); - bool downloadSuccess = false; - string zipFilePath = Path.Combine(executablePath, "subs-check_Windows_i386.zip"); - string failureReason = ""; + // 查找所有"https://"出现的位置 + while ((currentIndex = 代理下载链接.IndexOf("https://", currentIndex)) != -1) + { + httpsCount++; + lastIndex = currentIndex; + currentIndex += 8; // "https://".Length = 8 + } - // 如果文件已存在,先删除 - if (File.Exists(zipFilePath)) File.Delete(zipFilePath); + // 如果"https://"出现2次或以上,提取最后一个"https://"之后的内容 + if (httpsCount >= 2 && lastIndex != -1) + { + 原生下载链接 = 代理下载链接.Substring(lastIndex); + } - // 第一次尝试:使用代理下载链接 + 当前HttpClient(不使用系统代理) - try - { - Log($"[尝试1/4] 使用代理下载链接:{代理下载链接}"); - downloadSuccess = await DownloadFileAsync(client, 代理下载链接, zipFilePath); - } - catch (Exception ex) - { - Log($"[尝试1/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } + string executablePath = Path.GetDirectoryName(Application.ExecutablePath); + // 创建下载请求 - 优化的多级尝试下载逻辑 + Log("开始下载文件..."); + bool downloadSuccess = false; + string zipFilePath = Path.Combine(executablePath, desiredAssetName); + string failureReason = ""; - // 如果第一次尝试失败,且代理链接与原生链接不同,使用原生下载链接尝试 - if (!downloadSuccess && 代理下载链接 != 原生下载链接) - { - try - { - Log($"[尝试2/4] 使用原生下载链接:{原生下载链接}"); - downloadSuccess = await DownloadFileAsync(client, 原生下载链接, zipFilePath); - } - catch (Exception ex) - { - Log($"[尝试2/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } - } + // 如果文件已存在,先删除 + if (File.Exists(zipFilePath)) File.Delete(zipFilePath); - // 如果前面的尝试都失败,创建使用系统代理的HttpClient再次尝试 - if (!downloadSuccess) - { - try - { - Log("[尝试3/4] 使用系统代理 + 代理下载链接"); - using (HttpClient proxyClient = new HttpClient()) - { - proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - proxyClient.Timeout = TimeSpan.FromSeconds(30); + // 第一次尝试:使用代理下载链接 + 当前HttpClient(不使用系统代理) + try + { + Log($"[尝试1/4] 使用代理下载链接:{代理下载链接}"); + downloadSuccess = await DownloadFileAsync(client, 代理下载链接, zipFilePath); + } + catch (Exception ex) + { + Log($"[尝试1/4] 失败: {ex.Message}", true); + failureReason = ex.Message; + } - downloadSuccess = await DownloadFileAsync(proxyClient, 代理下载链接, zipFilePath); - } - } - catch (Exception ex) - { - Log($"[尝试3/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } + // 如果第一次尝试失败,且代理链接与原生链接不同,使用原生下载链接尝试 + if (!downloadSuccess && 代理下载链接 != 原生下载链接) + { + try + { + Log($"[尝试2/4] 使用原生下载链接:{原生下载链接}"); + downloadSuccess = await DownloadFileAsync(client, 原生下载链接, zipFilePath); + } + catch (Exception ex) + { + Log($"[尝试2/4] 失败: {ex.Message}", true); + failureReason = ex.Message; + } + } - // 最后一次尝试:使用系统代理 + 原生链接(如果不同) - if (!downloadSuccess && 代理下载链接 != 原生下载链接) - { - try - { - Log("[尝试4/4] 使用系统代理 + 原生下载链接"); - using (HttpClient proxyClient = new HttpClient()) - { - proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - proxyClient.Timeout = TimeSpan.FromSeconds(30); - - downloadSuccess = await DownloadFileAsync(proxyClient, 原生下载链接, zipFilePath); - } - } - catch (Exception ex) - { - Log($"[尝试4/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } - } + // 如果前面的尝试都失败,创建使用系统代理的HttpClient再次尝试 + if (!downloadSuccess) + { + try + { + Log("[尝试3/4] 使用系统代理 + 代理下载链接"); + using (HttpClient proxyClient = new HttpClient()) + { + proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); + proxyClient.Timeout = TimeSpan.FromSeconds(30); + + downloadSuccess = await DownloadFileAsync(proxyClient, 代理下载链接, zipFilePath); } + } + catch (Exception ex) + { + Log($"[尝试3/4] 失败: {ex.Message}", true); + failureReason = ex.Message; + } - if (downloadSuccess) + // 最后一次尝试:使用系统代理 + 原生链接(如果不同) + if (!downloadSuccess && 代理下载链接 != 原生下载链接) + { + try { - Log("下载完成,正在解压文件..."); - - // 解压文件的代码保持不变 - using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)) + Log("[尝试4/4] 使用系统代理 + 原生下载链接"); + using (HttpClient proxyClient = new HttpClient()) { - // 查找subs-check.exe - System.IO.Compression.ZipArchiveEntry exeEntry = archive.Entries.FirstOrDefault( - entry => entry.Name.Equals("subs-check.exe", StringComparison.OrdinalIgnoreCase)); - - if (exeEntry != null) - { - string exeFilePath = Path.Combine(executablePath, "subs-check.exe"); + proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); + proxyClient.Timeout = TimeSpan.FromSeconds(30); - // 如果文件已存在,先删除 - if (File.Exists(exeFilePath)) - { - File.Delete(exeFilePath); - } - - // 解压文件 - exeEntry.ExtractToFile(exeFilePath); - 当前subsCheck版本号 = latestVersion; - Log($"subs-check.exe {当前subsCheck版本号} 已就绪!"); - - await SaveConfig(false); - - // 删除下载的zip文件 - //File.Delete(zipFilePath); - } - else - { - Log("无法在压缩包中找到 subs-check.exe 文件。", true); - } + downloadSuccess = await DownloadFileAsync(proxyClient, 原生下载链接, zipFilePath); } } - else + catch (Exception ex) { - // 所有尝试都失败 - Log($"所有下载尝试均失败,最后错误: {failureReason}", true); - MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", - "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); - progressBar1.Value = 0; - progressBar1.Visible = false; + Log($"[尝试4/4] 失败: {ex.Message}", true); + failureReason = ex.Message; } + } + } - // 解压文件 - using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)) - { - // 查找subs-check.exe - System.IO.Compression.ZipArchiveEntry exeEntry = archive.Entries.FirstOrDefault( - entry => entry.Name.Equals("subs-check.exe", StringComparison.OrdinalIgnoreCase)); + if (!downloadSuccess) + { + Log($"所有下载尝试均失败,最后错误: {failureReason}", true); + MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + progressBar1.Value = 0; + progressBar1.Visible = false; + return; + } - if (exeEntry != null) - { - string exeFilePath = Path.Combine(executablePath, "subs-check.exe"); + // 下载成功 -> 解压并查找 subs-check.exe + Log("下载完成,正在解压文件..."); + // 解压文件 + using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)) + { + // 查找subs-check.exe + var exeEntry = archive.Entries.FirstOrDefault( + entry => entry.Name.Equals("subs-check.exe", StringComparison.OrdinalIgnoreCase)); - // 如果文件已存在,先删除 - if (File.Exists(exeFilePath)) - { - File.Delete(exeFilePath); - } + if (exeEntry != null) + { + string exeFilePath = Path.Combine(executablePath, "subs-check.exe"); + // 如果文件已存在,先删除 + if (File.Exists(exeFilePath)) File.Delete(exeFilePath); - // 解压文件 - exeEntry.ExtractToFile(exeFilePath); - 当前subsCheck版本号 = latestVersion; - Log($"subs-check.exe {当前subsCheck版本号} 已就绪!"); + // 解压文件 + exeEntry.ExtractToFile(exeFilePath); + 当前subsCheck版本号 = latestVersion; + currentArch = desiredArchToken; + Log($"subs-check.exe {当前subsCheck版本号} 已就绪!"); - await SaveConfig(false); - // 这里保留原有行为,不修改button1.Enabled + await SaveConfig(false); - // 删除下载的zip文件 - //File.Delete(zipFilePath); - } - else - { - Log("无法在压缩包中找到 subs-check.exe 文件。", true); - } - } + // 可选:删除 zip 文件(注释状态保留原样) + // File.Delete(zipFilePath); } else { - Log("无法找到适用于 Windows i386 的下载链接。", true); - MessageBox.Show("未能找到适用的 subs-check.exe 下载链接。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", - "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + Log("无法在压缩包中找到 subs-check.exe 文件。", true); } } - catch (Exception ex) - { - Log($"下载过程中出错: {ex.Message}", true); - MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", - "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); - } + } + catch (Exception ex) + { + Log($"下载过程中出错: {ex.Message}", true); + MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } @@ -1158,11 +1164,14 @@ private async Task DownloadSubsCheckEXE() Log($"初始化下载过程出错: {ex.Message}", true); MessageBox.Show($"下载准备过程出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } - - button1.Enabled = true; - downloading = 0; + finally + { + button1.Enabled = true; + downloading = 0; + } } + /// /// 获取最新版本号和对应的下载链接 /// @@ -3093,7 +3102,7 @@ private void 切换cron表达式(object sender, EventArgs e) } else { - labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); + labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDown2.Location.Y); labelCron.Visible = true; textBoxCron.Visible = true; @@ -3407,5 +3416,30 @@ private void numericUpDown3_ValueChanged(object sender, EventArgs e) } } + + private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs e) + { + if (!checkBoxSwitchArch64.Checked) + { + if (currentArch != "i386"){ + Log("切换为 i386 内核,内存占用更低,但CPU占用可能更高"); + _ = DownloadSubsCheckEXE(); + } + Log("使用32位内核,如CPU占用较高,可在[高级设置]切换"); + } + else + { + if (currentArch != "x86_64") + { + Log(currentArch); + Log("切换为 x64 内核,内存占用更高,但CPU占用可能较低"); + _ = DownloadSubsCheckEXE(); + } + Log("使用64位内核,如内存占用较高,可在[高级设置]切换"); + } + + // 保存配置 + await SaveConfig(); + } } } diff --git a/Form1.resx b/Form1.resx index eb9e3e1..404b1ff 100644 --- a/Form1.resx +++ b/Form1.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 228, 17 - - 320, 17 - 423, 17 From 1d91bd5f7cc1700b1659585455994f8b16bde67f Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 26 Aug 2025 11:35:57 +0800 Subject: [PATCH 10/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A032\64=E4=BD=8D?= =?UTF-8?q?=E5=86=85=E6=A0=B8=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 71 ++++---- Form1.cs | 404 +++++++++++++++++++++++++--------------------- Form1.resx | 3 + 3 files changed, 258 insertions(+), 220 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 0791945..f9d6582 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -33,10 +33,9 @@ private void InitializeComponent() this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.timer1 = new System.Windows.Forms.Timer(this.components); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.checkBox7 = new System.Windows.Forms.CheckBox(); - this.checkBox5 = new System.Windows.Forms.CheckBox(); - this.switchArch = new System.Windows.Forms.CheckBox(); this.textBoxCron = new System.Windows.Forms.TextBox(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.checkBoxSwitchArch64 = new System.Windows.Forms.CheckBox(); this.button7 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button(); this.comboBox4 = new System.Windows.Forms.ComboBox(); @@ -55,6 +54,7 @@ private void InitializeComponent() this.button2 = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button(); this.label8 = new System.Windows.Forms.Label(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.numericUpDown6 = new System.Windows.Forms.NumericUpDown(); this.numericUpDown5 = new System.Windows.Forms.NumericUpDown(); @@ -163,7 +163,7 @@ private void InitializeComponent() // this.groupBox1.Controls.Add(this.textBoxCron); this.groupBox1.Controls.Add(this.checkBox5); - this.groupBox1.Controls.Add(this.switchArch); + this.groupBox1.Controls.Add(this.checkBoxSwitchArch64); this.groupBox1.Controls.Add(this.button7); this.groupBox1.Controls.Add(this.button6); this.groupBox1.Controls.Add(this.comboBox4); @@ -193,15 +193,18 @@ private void InitializeComponent() this.groupBox1.TabStop = false; this.groupBox1.Text = "参数设置"; // - // checkBox7 + // textBoxCron // - this.checkBox7.AutoSize = true; - this.checkBox7.Location = new System.Drawing.Point(18, 608); - this.checkBox7.Name = "checkBox7"; - this.checkBox7.Size = new System.Drawing.Size(141, 25); - this.checkBox7.TabIndex = 39; - this.checkBox7.Text = "高并发模式"; - this.checkBox7.UseVisualStyleBackColor = true; + this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxCron.Location = new System.Drawing.Point(79, 562); + this.textBoxCron.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxCron.Name = "textBoxCron"; + this.textBoxCron.Size = new System.Drawing.Size(219, 31); + this.textBoxCron.TabIndex = 21; + this.textBoxCron.Text = "0 */2 * * *"; + this.textBoxCron.Visible = false; + this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); // // checkBox5 // @@ -215,28 +218,16 @@ private void InitializeComponent() this.checkBox5.UseVisualStyleBackColor = true; this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); // - // switchArch - // - this.switchArch.AutoSize = true; - this.switchArch.Location = new System.Drawing.Point(167, 608); - this.switchArch.Name = "switchArch"; - this.switchArch.Size = new System.Drawing.Size(111, 25); - this.switchArch.TabIndex = 38; - this.switchArch.Text = "x64内核"; - this.switchArch.UseVisualStyleBackColor = true; + // checkBoxSwitchArch64 // - // textBoxCron - // - this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxCron.Location = new System.Drawing.Point(79, 562); - this.textBoxCron.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.textBoxCron.Name = "textBoxCron"; - this.textBoxCron.Size = new System.Drawing.Size(219, 31); - this.textBoxCron.TabIndex = 21; - this.textBoxCron.Text = "0 */2 * * *"; - this.textBoxCron.Visible = false; - this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); - this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); + this.checkBoxSwitchArch64.AutoSize = true; + this.checkBoxSwitchArch64.Location = new System.Drawing.Point(167, 608); + this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; + this.checkBoxSwitchArch64.Size = new System.Drawing.Size(111, 25); + this.checkBoxSwitchArch64.TabIndex = 38; + this.checkBoxSwitchArch64.Text = "x64内核"; + this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; + this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.checkBoxSwitchArch64_CheckedChanged); // // button7 // @@ -449,8 +440,8 @@ private void InitializeComponent() this.labelCron.Size = new System.Drawing.Size(73, 21); this.labelCron.TabIndex = 40; this.labelCron.Text = "计划:"; - this.labelCron.DoubleClick += new System.EventHandler(this.切换cron表达式); this.labelCron.Visible = false; + this.labelCron.DoubleClick += new System.EventHandler(this.切换cron表达式); // // label1 // @@ -496,6 +487,16 @@ private void InitializeComponent() this.label8.Text = "节点池订阅链接(点击编辑):"; this.label8.Click += new System.EventHandler(this.textBox1_DoubleClick); // + // checkBox7 + // + this.checkBox7.AutoSize = true; + this.checkBox7.Location = new System.Drawing.Point(18, 608); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.Size = new System.Drawing.Size(141, 25); + this.checkBox7.TabIndex = 39; + this.checkBox7.Text = "高并发模式"; + this.checkBox7.UseVisualStyleBackColor = true; + // // textBox1 // this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -1949,7 +1950,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label22; private System.Windows.Forms.CheckBox checkBox6; private System.Windows.Forms.NumericUpDown numericUpDown10; - private System.Windows.Forms.CheckBox switchArch; + private System.Windows.Forms.CheckBox checkBoxSwitchArch64; private System.Windows.Forms.CheckBox checkBox7; private System.Windows.Forms.GroupBox groupBox7; private System.Windows.Forms.NumericUpDown numericUpDown11; diff --git a/Form1.cs b/Form1.cs index ef11c00..e62abcb 100644 --- a/Form1.cs +++ b/Form1.cs @@ -27,6 +27,7 @@ public partial class Form1 : Form string githubProxyURL = ""; int run = 0; string 当前subsCheck版本号 = "未知版本"; + string currentArch = "i386"; string 当前GUI版本号 = "未知版本"; string 最新GUI版本号 = "未知版本"; private string nextCheckTime = null;// 用于存储下次检查时间 @@ -445,6 +446,9 @@ private async void ReadConfig()//读取配置文件 string subscheckversion = 读取config字符串(config, "subscheck-version"); if (subscheckversion != null) 当前subsCheck版本号 = subscheckversion; + string subscheckArch = 读取config字符串(config, "subscheck-arch"); + if (subscheckArch != null) currentArch = subscheckArch; + int? successlimit = 读取config整数(config, "success-limit"); if (successlimit.HasValue) { @@ -505,6 +509,10 @@ private async void ReadConfig()//读取配置文件 } } + string switchX64 = 读取config字符串(config, "switch-x64"); + if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; + else checkBoxSwitchArch64.Checked = false; + string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { @@ -738,10 +746,12 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["rename-node"] = checkBox1.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBox2.Checked;//是否开启流媒体检测 + config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["keep-success-proxies"] = false; config["print-progress"] = false;//是否显示进度 config["sub-urls-retry"] = 3;//重试次数(获取订阅失败后重试次数) config["subscheck-version"] = 当前subsCheck版本号;//当前subsCheck版本号 + config["subscheck-arch"] = currentArch; //当前subsCheck架构 config["gui-auto"] = checkBox5.Checked;//是否开机自启 @@ -935,232 +945,228 @@ private async Task DownloadSubsCheckEXE() } var result = await 获取版本号("https://api.github.com/repos/beck-8/subs-check/releases/latest", true); - if (result.Item1 != "未知版本") + if (result.Item1 == "未知版本") { - // 创建不使用系统代理的 HttpClientHandler - HttpClientHandler handler = new HttpClientHandler - { - UseProxy = false, - Proxy = null - }; + // 无版本信息 + return; + } - // 使用自定义 handler 创建 HttpClient - using (HttpClient client = new HttpClient(handler)) + // 决定目标资源名称:64位优先 (amd64),否则 i386 + string desiredArchToken = checkBoxSwitchArch64.Checked ? "x86_64" : "i386"; + string desiredAssetName = $"subs-check_Windows_{desiredArchToken}.zip"; + + // 创建不使用系统代理的 HttpClientHandler + HttpClientHandler handler = new HttpClientHandler + { + UseProxy = false, + Proxy = null + }; + + // 使用自定义 handler 创建 HttpClient + using (HttpClient client = new HttpClient(handler)) + { + try { - try + string latestVersion = result.Item1; + JArray assets = result.Item2; + Log($"subs-check.exe 最新版本为: {latestVersion} "); + + // 先尝试精确匹配期望文件名;找不到则回退为任意包含 "Windows" 且包含 arch token 的条目; + // 若仍找不到,再回退为任意包含 "Windows" 的资源。 + string downloadUrl = null; + foreach (var asset in assets) { - string latestVersion = result.Item1; - JArray assets = result.Item2; - Log($"subs-check.exe 最新版本为: {latestVersion} "); - // 查找Windows i386版本的资源 - string downloadUrl = null; + if (asset["name"]?.ToString().Equals(desiredAssetName, StringComparison.OrdinalIgnoreCase) == true) + { + downloadUrl = asset["browser_download_url"].ToString(); + break; + } + } + if (downloadUrl == null) + { foreach (var asset in assets) { - if (asset["name"].ToString() == "subs-check_Windows_i386.zip") + string name = asset["name"]?.ToString() ?? ""; + if (name.IndexOf("Windows", StringComparison.OrdinalIgnoreCase) >= 0 && + name.IndexOf(desiredArchToken, StringComparison.OrdinalIgnoreCase) >= 0) { downloadUrl = asset["browser_download_url"].ToString(); break; } } + } - if (downloadUrl != null) + if (downloadUrl == null) + { + // 最后退化:任何 Windows 包 + foreach (var asset in assets) { - string 代理下载链接 = githubProxyURL + downloadUrl; - string 原生下载链接 = 代理下载链接; - // 计算"https://"在下载链接中出现的次数 - int httpsCount = 0; - int lastIndex = -1; - int currentIndex = 0; - - // 查找所有"https://"出现的位置 - while ((currentIndex = 代理下载链接.IndexOf("https://", currentIndex)) != -1) + string name = asset["name"]?.ToString() ?? ""; + if (name.IndexOf("Windows", StringComparison.OrdinalIgnoreCase) >= 0) { - httpsCount++; - lastIndex = currentIndex; - currentIndex += 8; // "https://".Length = 8 + downloadUrl = asset["browser_download_url"].ToString(); + break; } + } + } - // 如果"https://"出现2次或以上,提取最后一个"https://"之后的内容 - if (httpsCount >= 2 && lastIndex != -1) - { - 原生下载链接 = 代理下载链接.Substring(lastIndex); - } + if (downloadUrl == null) + { + Log("无法找到适用于 Windows 的下载链接。", true); + MessageBox.Show("未能找到适用的 subs-check.exe 下载链接。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } - string executablePath = Path.GetDirectoryName(Application.ExecutablePath); + // 处理代理链接里可能嵌套 https:// 的情况 + string 代理下载链接 = githubProxyURL + downloadUrl; + string 原生下载链接 = 代理下载链接; + // 计算"https://"在下载链接中出现的次数 + int httpsCount = 0; + int lastIndex = -1; + int currentIndex = 0; - // 创建下载请求 - 优化的多级尝试下载逻辑 - Log("开始下载文件..."); - bool downloadSuccess = false; - string zipFilePath = Path.Combine(executablePath, "subs-check_Windows_i386.zip"); - string failureReason = ""; + // 查找所有"https://"出现的位置 + while ((currentIndex = 代理下载链接.IndexOf("https://", currentIndex)) != -1) + { + httpsCount++; + lastIndex = currentIndex; + currentIndex += 8; // "https://".Length = 8 + } - // 如果文件已存在,先删除 - if (File.Exists(zipFilePath)) File.Delete(zipFilePath); + // 如果"https://"出现2次或以上,提取最后一个"https://"之后的内容 + if (httpsCount >= 2 && lastIndex != -1) + { + 原生下载链接 = 代理下载链接.Substring(lastIndex); + } - // 第一次尝试:使用代理下载链接 + 当前HttpClient(不使用系统代理) - try - { - Log($"[尝试1/4] 使用代理下载链接:{代理下载链接}"); - downloadSuccess = await DownloadFileAsync(client, 代理下载链接, zipFilePath); - } - catch (Exception ex) - { - Log($"[尝试1/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } + string executablePath = Path.GetDirectoryName(Application.ExecutablePath); + // 创建下载请求 - 优化的多级尝试下载逻辑 + Log("开始下载文件..."); + bool downloadSuccess = false; + string zipFilePath = Path.Combine(executablePath, desiredAssetName); + string failureReason = ""; - // 如果第一次尝试失败,且代理链接与原生链接不同,使用原生下载链接尝试 - if (!downloadSuccess && 代理下载链接 != 原生下载链接) - { - try - { - Log($"[尝试2/4] 使用原生下载链接:{原生下载链接}"); - downloadSuccess = await DownloadFileAsync(client, 原生下载链接, zipFilePath); - } - catch (Exception ex) - { - Log($"[尝试2/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } - } + // 如果文件已存在,先删除 + if (File.Exists(zipFilePath)) File.Delete(zipFilePath); - // 如果前面的尝试都失败,创建使用系统代理的HttpClient再次尝试 - if (!downloadSuccess) - { - try - { - Log("[尝试3/4] 使用系统代理 + 代理下载链接"); - using (HttpClient proxyClient = new HttpClient()) - { - proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - proxyClient.Timeout = TimeSpan.FromSeconds(30); + // 第一次尝试:使用代理下载链接 + 当前HttpClient(不使用系统代理) + try + { + Log($"[尝试1/4] 使用代理下载链接:{代理下载链接}"); + downloadSuccess = await DownloadFileAsync(client, 代理下载链接, zipFilePath); + } + catch (Exception ex) + { + Log($"[尝试1/4] 失败: {ex.Message}", true); + failureReason = ex.Message; + } - downloadSuccess = await DownloadFileAsync(proxyClient, 代理下载链接, zipFilePath); - } - } - catch (Exception ex) - { - Log($"[尝试3/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } + // 如果第一次尝试失败,且代理链接与原生链接不同,使用原生下载链接尝试 + if (!downloadSuccess && 代理下载链接 != 原生下载链接) + { + try + { + Log($"[尝试2/4] 使用原生下载链接:{原生下载链接}"); + downloadSuccess = await DownloadFileAsync(client, 原生下载链接, zipFilePath); + } + catch (Exception ex) + { + Log($"[尝试2/4] 失败: {ex.Message}", true); + failureReason = ex.Message; + } + } - // 最后一次尝试:使用系统代理 + 原生链接(如果不同) - if (!downloadSuccess && 代理下载链接 != 原生下载链接) - { - try - { - Log("[尝试4/4] 使用系统代理 + 原生下载链接"); - using (HttpClient proxyClient = new HttpClient()) - { - proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - proxyClient.Timeout = TimeSpan.FromSeconds(30); - - downloadSuccess = await DownloadFileAsync(proxyClient, 原生下载链接, zipFilePath); - } - } - catch (Exception ex) - { - Log($"[尝试4/4] 失败: {ex.Message}", true); - failureReason = ex.Message; - } - } + // 如果前面的尝试都失败,创建使用系统代理的HttpClient再次尝试 + if (!downloadSuccess) + { + try + { + Log("[尝试3/4] 使用系统代理 + 代理下载链接"); + using (HttpClient proxyClient = new HttpClient()) + { + proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); + proxyClient.Timeout = TimeSpan.FromSeconds(30); + + downloadSuccess = await DownloadFileAsync(proxyClient, 代理下载链接, zipFilePath); } + } + catch (Exception ex) + { + Log($"[尝试3/4] 失败: {ex.Message}", true); + failureReason = ex.Message; + } - if (downloadSuccess) + // 最后一次尝试:使用系统代理 + 原生链接(如果不同) + if (!downloadSuccess && 代理下载链接 != 原生下载链接) + { + try { - Log("下载完成,正在解压文件..."); - - // 解压文件的代码保持不变 - using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)) + Log("[尝试4/4] 使用系统代理 + 原生下载链接"); + using (HttpClient proxyClient = new HttpClient()) { - // 查找subs-check.exe - System.IO.Compression.ZipArchiveEntry exeEntry = archive.Entries.FirstOrDefault( - entry => entry.Name.Equals("subs-check.exe", StringComparison.OrdinalIgnoreCase)); - - if (exeEntry != null) - { - string exeFilePath = Path.Combine(executablePath, "subs-check.exe"); + proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); + proxyClient.Timeout = TimeSpan.FromSeconds(30); - // 如果文件已存在,先删除 - if (File.Exists(exeFilePath)) - { - File.Delete(exeFilePath); - } - - // 解压文件 - exeEntry.ExtractToFile(exeFilePath); - 当前subsCheck版本号 = latestVersion; - Log($"subs-check.exe {当前subsCheck版本号} 已就绪!"); - - await SaveConfig(false); - - // 删除下载的zip文件 - //File.Delete(zipFilePath); - } - else - { - Log("无法在压缩包中找到 subs-check.exe 文件。", true); - } + downloadSuccess = await DownloadFileAsync(proxyClient, 原生下载链接, zipFilePath); } } - else + catch (Exception ex) { - // 所有尝试都失败 - Log($"所有下载尝试均失败,最后错误: {failureReason}", true); - MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", - "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); - progressBar1.Value = 0; - progressBar1.Visible = false; + Log($"[尝试4/4] 失败: {ex.Message}", true); + failureReason = ex.Message; } + } + } - // 解压文件 - using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)) - { - // 查找subs-check.exe - System.IO.Compression.ZipArchiveEntry exeEntry = archive.Entries.FirstOrDefault( - entry => entry.Name.Equals("subs-check.exe", StringComparison.OrdinalIgnoreCase)); + if (!downloadSuccess) + { + Log($"所有下载尝试均失败,最后错误: {failureReason}", true); + MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + progressBar1.Value = 0; + progressBar1.Visible = false; + return; + } - if (exeEntry != null) - { - string exeFilePath = Path.Combine(executablePath, "subs-check.exe"); + // 下载成功 -> 解压并查找 subs-check.exe + Log("下载完成,正在解压文件..."); + // 解压文件 + using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)) + { + // 查找subs-check.exe + var exeEntry = archive.Entries.FirstOrDefault( + entry => entry.Name.Equals("subs-check.exe", StringComparison.OrdinalIgnoreCase)); - // 如果文件已存在,先删除 - if (File.Exists(exeFilePath)) - { - File.Delete(exeFilePath); - } + if (exeEntry != null) + { + string exeFilePath = Path.Combine(executablePath, "subs-check.exe"); + // 如果文件已存在,先删除 + if (File.Exists(exeFilePath)) File.Delete(exeFilePath); - // 解压文件 - exeEntry.ExtractToFile(exeFilePath); - 当前subsCheck版本号 = latestVersion; - Log($"subs-check.exe {当前subsCheck版本号} 已就绪!"); + // 解压文件 + exeEntry.ExtractToFile(exeFilePath); + 当前subsCheck版本号 = latestVersion; + currentArch = desiredArchToken; + Log($"subs-check.exe {当前subsCheck版本号} 已就绪!"); - await SaveConfig(false); - // 这里保留原有行为,不修改button1.Enabled + await SaveConfig(false); - // 删除下载的zip文件 - //File.Delete(zipFilePath); - } - else - { - Log("无法在压缩包中找到 subs-check.exe 文件。", true); - } - } + // 可选:删除 zip 文件(注释状态保留原样) + // File.Delete(zipFilePath); } else { - Log("无法找到适用于 Windows i386 的下载链接。", true); - MessageBox.Show("未能找到适用的 subs-check.exe 下载链接。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", - "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + Log("无法在压缩包中找到 subs-check.exe 文件。", true); } } - catch (Exception ex) - { - Log($"下载过程中出错: {ex.Message}", true); - MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", - "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); - } + } + catch (Exception ex) + { + Log($"下载过程中出错: {ex.Message}", true); + MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } @@ -1169,11 +1175,14 @@ private async Task DownloadSubsCheckEXE() Log($"初始化下载过程出错: {ex.Message}", true); MessageBox.Show($"下载准备过程出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } - - button1.Enabled = true; - downloading = 0; + finally + { + button1.Enabled = true; + downloading = 0; + } } + /// /// 获取最新版本号和对应的下载链接 /// @@ -3104,7 +3113,7 @@ private void 切换cron表达式(object sender, EventArgs e) } else { - labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); + labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDown2.Location.Y); labelCron.Visible = true; textBoxCron.Visible = true; @@ -3418,5 +3427,30 @@ private void numericUpDown3_ValueChanged(object sender, EventArgs e) } } + + private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs e) + { + if (!checkBoxSwitchArch64.Checked) + { + if (currentArch != "i386"){ + Log("切换为 i386 内核,内存占用更低,但CPU占用可能更高"); + _ = DownloadSubsCheckEXE(); + } + Log("使用32位内核,如CPU占用较高,可在[高级设置]切换"); + } + else + { + if (currentArch != "x86_64") + { + Log(currentArch); + Log("切换为 x64 内核,内存占用更高,但CPU占用可能较低"); + _ = DownloadSubsCheckEXE(); + } + Log("使用64位内核,如内存占用较高,可在[高级设置]切换"); + } + + // 保存配置 + await SaveConfig(); + } } } diff --git a/Form1.resx b/Form1.resx index 87066a8..1589c0f 100644 --- a/Form1.resx +++ b/Form1.resx @@ -3480,6 +3480,9 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 228, 17 + + 320, 17 + 423, 17 From da86413cf10b61f7feb7fe297fff6a7f2e602b99 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 26 Aug 2025 19:25:55 +0800 Subject: [PATCH 11/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E5=8F=82=E6=95=B0=E5=92=8Cgui=E5=86=85=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=E5=86=B2=E7=AA=81=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.cs | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/Form1.cs b/Form1.cs index c100b32..ab19ad8 100644 --- a/Form1.cs +++ b/Form1.cs @@ -768,6 +768,10 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 .WithIndentedSequences() // 使序列化结果更易读 .Build(); + + var deserializer = new YamlDotNet.Serialization.DeserializerBuilder() + .Build(); + string yamlContent = serializer.Serialize(config); // 确保配置目录存在 @@ -781,14 +785,34 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 // 读取more.yaml的内容 string moreYamlContent = File.ReadAllText(moreYamlPath); - // 确保more.yaml内容以换行开始 - if (!moreYamlContent.StartsWith("\n") && !moreYamlContent.StartsWith("\r\n")) + // 解析主配置和补充配置 + var Config = deserializer.Deserialize>(yamlContent); + var moreConfig = deserializer.Deserialize>(moreYamlContent); + + if (Config == null) Config = new Dictionary(); + if (moreConfig == null) moreConfig = new Dictionary(); + + // 检查并记录冲突的键 + var conflictKeys = new List(); + var mergedKeys = new List(); + + foreach (var kvp in moreConfig) { - yamlContent += "\n"; // 添加换行符作为分隔 + if (Config.ContainsKey(kvp.Key)) + { + conflictKeys.Add(kvp.Key); + Log($"发现重复键 '{kvp.Key}',使用GUI配置"); + } + else + { + Config[kvp.Key] = kvp.Value; + mergedKeys.Add(kvp.Key); + } } - // 将more.yaml的内容追加到要写入的config.yaml内容后 - yamlContent += moreYamlContent; + // 重新序列化合并后的配置 + yamlContent = serializer.Serialize(Config); + Log($"已将补充参数配置 more.yaml 内容追加到配置文件"); } @@ -3421,7 +3445,8 @@ private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs { if (!checkBoxSwitchArch64.Checked) { - if (currentArch != "i386"){ + if (currentArch != "i386") + { Log("切换为 i386 内核,内存占用更低,但CPU占用可能更高"); _ = DownloadSubsCheckEXE(); } @@ -3439,7 +3464,7 @@ private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs } // 保存配置 - await SaveConfig(); + await SaveConfig(); } } } From cc315a0793155cc981f0c91e22d78ed8ad91e247 Mon Sep 17 00:00:00 2001 From: sinspired Date: Wed, 27 Aug 2025 18:16:16 +0800 Subject: [PATCH 12/92] =?UTF-8?q?perf:=20=E5=90=AF=E7=94=A8=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 16 +++++------ app.manifest | 70 +++++++++++++++++++++++------------------------ 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index fa8afad..de7978c 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -180,7 +180,7 @@ private void InitializeComponent() this.checkBox5.Location = new System.Drawing.Point(167, 749); this.checkBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox5.Name = "checkBox5"; - this.checkBox5.Size = new System.Drawing.Size(120, 25); + this.checkBox5.Size = new System.Drawing.Size(113, 25); this.checkBox5.TabIndex = 30; this.checkBox5.Text = "开机自启"; this.checkBox5.UseVisualStyleBackColor = true; @@ -679,7 +679,7 @@ private void InitializeComponent() this.checkBoxSwitchArch64.AutoSize = true; this.checkBoxSwitchArch64.Location = new System.Drawing.Point(515, 173); this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; - this.checkBoxSwitchArch64.Size = new System.Drawing.Size(153, 25); + this.checkBoxSwitchArch64.Size = new System.Drawing.Size(146, 25); this.checkBoxSwitchArch64.TabIndex = 38; this.checkBoxSwitchArch64.Text = "使用x64内核"; this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; @@ -710,7 +710,7 @@ private void InitializeComponent() this.checkBox6.Location = new System.Drawing.Point(17, 127); this.checkBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox6.Name = "checkBox6"; - this.checkBox6.Size = new System.Drawing.Size(207, 25); + this.checkBox6.Size = new System.Drawing.Size(200, 25); this.checkBox6.TabIndex = 36; this.checkBox6.Text = "带宽限制(MB/s):"; this.checkBox6.UseVisualStyleBackColor = true; @@ -785,7 +785,7 @@ private void InitializeComponent() this.checkBox4.Location = new System.Drawing.Point(16, 173); this.checkBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox4.Name = "checkBox4"; - this.checkBox4.Size = new System.Drawing.Size(240, 25); + this.checkBox4.Size = new System.Drawing.Size(233, 25); this.checkBox4.TabIndex = 28; this.checkBox4.Text = "启用WebUI API密钥:"; this.checkBox4.UseVisualStyleBackColor = true; @@ -821,7 +821,7 @@ private void InitializeComponent() this.checkBox3.Location = new System.Drawing.Point(17, 81); this.checkBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox3.Name = "checkBox3"; - this.checkBox3.Size = new System.Drawing.Size(183, 25); + this.checkBox3.Size = new System.Drawing.Size(176, 25); this.checkBox3.TabIndex = 27; this.checkBox3.Text = "节点保存数目:"; this.checkBox3.UseVisualStyleBackColor = true; @@ -850,7 +850,7 @@ private void InitializeComponent() this.checkBox1.Location = new System.Drawing.Point(17, 35); this.checkBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(162, 25); + this.checkBox1.Size = new System.Drawing.Size(155, 25); this.checkBox1.TabIndex = 22; this.checkBox1.Text = "节点地址查询"; this.checkBox1.UseVisualStyleBackColor = true; @@ -862,7 +862,7 @@ private void InitializeComponent() this.checkBox2.Location = new System.Drawing.Point(198, 35); this.checkBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox2.Name = "checkBox2"; - this.checkBox2.Size = new System.Drawing.Size(141, 25); + this.checkBox2.Size = new System.Drawing.Size(134, 25); this.checkBox2.TabIndex = 25; this.checkBox2.Text = "流媒体检测"; this.checkBox2.UseVisualStyleBackColor = true; @@ -1632,7 +1632,7 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(1466, 1406); + this.ClientSize = new System.Drawing.Size(1460, 799); this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox4); diff --git a/app.manifest b/app.manifest index d442713..80e0428 100644 --- a/app.manifest +++ b/app.manifest @@ -1,10 +1,10 @@  - - - - - - - - - + + + + - - - - - + + - - + + - - + + - - + + - - + + - - + + - - - - - true - true - - + + + + true + true + + - - + - --> + From df758e12f7eeb56811b131c9d4183414e5c059d8 Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 28 Aug 2025 17:21:28 +0800 Subject: [PATCH 13/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=AB=98?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E5=86=85=E6=A0=B8/=E5=8E=9F=E7=89=88?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 444 +++++++++++++++++++++++----------------------- Form1.cs | 331 +++++++++++++++++++++++----------- 2 files changed, 450 insertions(+), 325 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index f9d6582..819ae95 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -35,6 +35,7 @@ private void InitializeComponent() this.groupBox1 = new System.Windows.Forms.GroupBox(); this.textBoxCron = new System.Windows.Forms.TextBox(); this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.checkBoxHighConcurrent = new System.Windows.Forms.CheckBox(); this.checkBoxSwitchArch64 = new System.Windows.Forms.CheckBox(); this.button7 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button(); @@ -51,10 +52,9 @@ private void InitializeComponent() this.label2 = new System.Windows.Forms.Label(); this.labelCron = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); - this.button2 = new System.Windows.Forms.Button(); + this.buttonAdvanceSettings = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button(); this.label8 = new System.Windows.Forms.Label(); - this.checkBox7 = new System.Windows.Forms.CheckBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.numericUpDown6 = new System.Windows.Forms.NumericUpDown(); this.numericUpDown5 = new System.Windows.Forms.NumericUpDown(); @@ -67,7 +67,7 @@ private void InitializeComponent() this.button5 = new System.Windows.Forms.Button(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.LogLabelNodeInfo = new System.Windows.Forms.Label(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.groupBoxAdvanceSettings = new System.Windows.Forms.GroupBox(); this.numericUpDown10 = new System.Windows.Forms.NumericUpDown(); this.checkBox6 = new System.Windows.Forms.CheckBox(); this.label22 = new System.Windows.Forms.Label(); @@ -111,17 +111,17 @@ private void InitializeComponent() this.label18 = new System.Windows.Forms.Label(); this.timer3 = new System.Windows.Forms.Timer(this.components); this.timer4 = new System.Windows.Forms.Timer(this.components); - this.groupBox7 = new System.Windows.Forms.GroupBox(); - this.numericUpDown13 = new System.Windows.Forms.NumericUpDown(); - this.label25 = new System.Windows.Forms.Label(); - this.numericUpDown12 = new System.Windows.Forms.NumericUpDown(); - this.label24 = new System.Windows.Forms.Label(); - this.checkBox8 = new System.Windows.Forms.CheckBox(); - this.numericUpDown11 = new System.Windows.Forms.NumericUpDown(); - this.label23 = new System.Windows.Forms.Label(); - this.groupBox8 = new System.Windows.Forms.GroupBox(); - this.checkBox10 = new System.Windows.Forms.CheckBox(); - this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.groupBoxPipe = new System.Windows.Forms.GroupBox(); + this.numericUpDownPipeMedia = new System.Windows.Forms.NumericUpDown(); + this.labelPipeMedia = new System.Windows.Forms.Label(); + this.numericUpDownPipeSpeed = new System.Windows.Forms.NumericUpDown(); + this.labelPipeSpeed = new System.Windows.Forms.Label(); + this.checkBoxPipeAuto = new System.Windows.Forms.CheckBox(); + this.numericUpDownPipeAlive = new System.Windows.Forms.NumericUpDown(); + this.labelPipeAlive = new System.Windows.Forms.Label(); + this.groupBoxEnhance = new System.Windows.Forms.GroupBox(); + this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); + this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); @@ -131,18 +131,18 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit(); this.groupBox2.SuspendLayout(); - this.groupBox3.SuspendLayout(); + this.groupBoxAdvanceSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).BeginInit(); this.groupBox4.SuspendLayout(); this.groupBox5.SuspendLayout(); this.groupBox6.SuspendLayout(); - this.groupBox7.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown13)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown12)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown11)).BeginInit(); - this.groupBox8.SuspendLayout(); + this.groupBoxPipe.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeMedia)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeSpeed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeAlive)).BeginInit(); + this.groupBoxEnhance.SuspendLayout(); this.SuspendLayout(); // // notifyIcon1 @@ -163,6 +163,7 @@ private void InitializeComponent() // this.groupBox1.Controls.Add(this.textBoxCron); this.groupBox1.Controls.Add(this.checkBox5); + this.groupBox1.Controls.Add(this.checkBoxHighConcurrent); this.groupBox1.Controls.Add(this.checkBoxSwitchArch64); this.groupBox1.Controls.Add(this.button7); this.groupBox1.Controls.Add(this.button6); @@ -179,10 +180,9 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.label2); this.groupBox1.Controls.Add(this.labelCron); this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Controls.Add(this.button2); + this.groupBox1.Controls.Add(this.buttonAdvanceSettings); this.groupBox1.Controls.Add(this.button1); this.groupBox1.Controls.Add(this.label8); - this.groupBox1.Controls.Add(this.checkBox7); this.groupBox1.Controls.Add(this.textBox1); this.groupBox1.Location = new System.Drawing.Point(24, 23); this.groupBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -218,6 +218,17 @@ private void InitializeComponent() this.checkBox5.UseVisualStyleBackColor = true; this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); // + // checkBoxHighConcurrent + // + this.checkBoxHighConcurrent.AutoSize = true; + this.checkBoxHighConcurrent.Location = new System.Drawing.Point(18, 608); + this.checkBoxHighConcurrent.Name = "checkBoxHighConcurrent"; + this.checkBoxHighConcurrent.Size = new System.Drawing.Size(141, 25); + this.checkBoxHighConcurrent.TabIndex = 39; + this.checkBoxHighConcurrent.Text = "高并发模式"; + this.checkBoxHighConcurrent.UseVisualStyleBackColor = true; + this.checkBoxHighConcurrent.CheckedChanged += new System.EventHandler(this.checkBoxHighConcurrent_CheckedChanged); + // // checkBoxSwitchArch64 // this.checkBoxSwitchArch64.AutoSize = true; @@ -453,16 +464,16 @@ private void InitializeComponent() this.label1.TabIndex = 2; this.label1.Text = "并发线程数:"; // - // button2 + // buttonAdvanceSettings // - this.button2.Location = new System.Drawing.Point(161, 788); - this.button2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(138, 40); - this.button2.TabIndex = 1; - this.button2.Text = "高级设置∧"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); + this.buttonAdvanceSettings.Location = new System.Drawing.Point(161, 788); + this.buttonAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonAdvanceSettings.Name = "buttonAdvanceSettings"; + this.buttonAdvanceSettings.Size = new System.Drawing.Size(138, 40); + this.buttonAdvanceSettings.TabIndex = 1; + this.buttonAdvanceSettings.Text = "高级设置∧"; + this.buttonAdvanceSettings.UseVisualStyleBackColor = true; + this.buttonAdvanceSettings.Click += new System.EventHandler(this.button2_Click); // // button1 // @@ -487,16 +498,6 @@ private void InitializeComponent() this.label8.Text = "节点池订阅链接(点击编辑):"; this.label8.Click += new System.EventHandler(this.textBox1_DoubleClick); // - // checkBox7 - // - this.checkBox7.AutoSize = true; - this.checkBox7.Location = new System.Drawing.Point(18, 608); - this.checkBox7.Name = "checkBox7"; - this.checkBox7.Size = new System.Drawing.Size(141, 25); - this.checkBox7.TabIndex = 39; - this.checkBox7.Text = "高并发模式"; - this.checkBox7.UseVisualStyleBackColor = true; - // // textBox1 // this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -676,42 +677,42 @@ private void InitializeComponent() this.LogLabelNodeInfo.TabIndex = 22; this.LogLabelNodeInfo.Text = "实时日志"; // - // groupBox3 - // - this.groupBox3.Controls.Add(this.numericUpDown10); - this.groupBox3.Controls.Add(this.checkBox6); - this.groupBox3.Controls.Add(this.label22); - this.groupBox3.Controls.Add(this.label21); - this.groupBox3.Controls.Add(this.numericUpDown9); - this.groupBox3.Controls.Add(this.button8); - this.groupBox3.Controls.Add(this.textBox10); - this.groupBox3.Controls.Add(this.checkBox4); - this.groupBox3.Controls.Add(this.numericUpDown8); - this.groupBox3.Controls.Add(this.checkBox3); - this.groupBox3.Controls.Add(this.button4); - this.groupBox3.Controls.Add(this.checkBox1); - this.groupBox3.Controls.Add(this.numericUpDown6); - this.groupBox3.Controls.Add(this.checkBox2); - this.groupBox3.Controls.Add(this.numericUpDown5); - this.groupBox3.Controls.Add(this.comboBox5); - this.groupBox3.Controls.Add(this.label19); - this.groupBox3.Controls.Add(this.comboBox3); - this.groupBox3.Controls.Add(this.label10); - this.groupBox3.Controls.Add(this.label4); - this.groupBox3.Controls.Add(this.comboBox2); - this.groupBox3.Controls.Add(this.label9); - this.groupBox3.Controls.Add(this.label5); - this.groupBox3.Controls.Add(this.numericUpDown7); - this.groupBox3.Controls.Add(this.label20); - this.groupBox3.Location = new System.Drawing.Point(24, 880); - this.groupBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox3.Size = new System.Drawing.Size(1430, 216); - this.groupBox3.TabIndex = 2; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "高级设置"; - this.groupBox3.Visible = false; + // groupBoxAdvanceSettings + // + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown10); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBox6); + this.groupBoxAdvanceSettings.Controls.Add(this.label22); + this.groupBoxAdvanceSettings.Controls.Add(this.label21); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown9); + this.groupBoxAdvanceSettings.Controls.Add(this.button8); + this.groupBoxAdvanceSettings.Controls.Add(this.textBox10); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBox4); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown8); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBox3); + this.groupBoxAdvanceSettings.Controls.Add(this.button4); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBox1); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown6); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBox2); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown5); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBox5); + this.groupBoxAdvanceSettings.Controls.Add(this.label19); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBox3); + this.groupBoxAdvanceSettings.Controls.Add(this.label10); + this.groupBoxAdvanceSettings.Controls.Add(this.label4); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBox2); + this.groupBoxAdvanceSettings.Controls.Add(this.label9); + this.groupBoxAdvanceSettings.Controls.Add(this.label5); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown7); + this.groupBoxAdvanceSettings.Controls.Add(this.label20); + this.groupBoxAdvanceSettings.Location = new System.Drawing.Point(24, 880); + this.groupBoxAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxAdvanceSettings.Name = "groupBoxAdvanceSettings"; + this.groupBoxAdvanceSettings.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxAdvanceSettings.Size = new System.Drawing.Size(1430, 216); + this.groupBoxAdvanceSettings.TabIndex = 2; + this.groupBoxAdvanceSettings.TabStop = false; + this.groupBoxAdvanceSettings.Text = "高级设置"; + this.groupBoxAdvanceSettings.Visible = false; // // numericUpDown10 // @@ -1654,166 +1655,167 @@ private void InitializeComponent() // this.timer4.Tick += new System.EventHandler(this.timer4_Tick); // - // groupBox7 - // - this.groupBox7.Controls.Add(this.numericUpDown13); - this.groupBox7.Controls.Add(this.label25); - this.groupBox7.Controls.Add(this.numericUpDown12); - this.groupBox7.Controls.Add(this.label24); - this.groupBox7.Controls.Add(this.checkBox8); - this.groupBox7.Controls.Add(this.numericUpDown11); - this.groupBox7.Controls.Add(this.label23); - this.groupBox7.Location = new System.Drawing.Point(24, 1104); - this.groupBox7.Name = "groupBox7"; - this.groupBox7.Size = new System.Drawing.Size(1009, 89); - this.groupBox7.TabIndex = 7; - this.groupBox7.TabStop = false; - this.groupBox7.Text = "流水线并发 参数"; - // - // numericUpDown13 - // - this.numericUpDown13.Location = new System.Drawing.Point(883, 36); - this.numericUpDown13.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown13.Maximum = new decimal(new int[] { + // groupBoxPipe + // + this.groupBoxPipe.Controls.Add(this.numericUpDownPipeMedia); + this.groupBoxPipe.Controls.Add(this.labelPipeMedia); + this.groupBoxPipe.Controls.Add(this.numericUpDownPipeSpeed); + this.groupBoxPipe.Controls.Add(this.labelPipeSpeed); + this.groupBoxPipe.Controls.Add(this.checkBoxPipeAuto); + this.groupBoxPipe.Controls.Add(this.numericUpDownPipeAlive); + this.groupBoxPipe.Controls.Add(this.labelPipeAlive); + this.groupBoxPipe.Location = new System.Drawing.Point(24, 1104); + this.groupBoxPipe.Name = "groupBoxPipe"; + this.groupBoxPipe.Size = new System.Drawing.Size(1009, 89); + this.groupBoxPipe.TabIndex = 7; + this.groupBoxPipe.TabStop = false; + this.groupBoxPipe.Text = "流水线并发 参数"; + // + // numericUpDownPipeMedia + // + this.numericUpDownPipeMedia.Location = new System.Drawing.Point(883, 36); + this.numericUpDownPipeMedia.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownPipeMedia.Maximum = new decimal(new int[] { 1000, 0, 0, 0}); - this.numericUpDown13.Minimum = new decimal(new int[] { + this.numericUpDownPipeMedia.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown13.Name = "numericUpDown13"; - this.numericUpDown13.Size = new System.Drawing.Size(106, 31); - this.numericUpDown13.TabIndex = 43; - this.numericUpDown13.Value = new decimal(new int[] { + this.numericUpDownPipeMedia.Name = "numericUpDownPipeMedia"; + this.numericUpDownPipeMedia.Size = new System.Drawing.Size(106, 31); + this.numericUpDownPipeMedia.TabIndex = 43; + this.numericUpDownPipeMedia.Value = new decimal(new int[] { 100, 0, 0, 0}); // - // label25 + // labelPipeMedia // - this.label25.AutoSize = true; - this.label25.Location = new System.Drawing.Point(684, 41); - this.label25.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label25.Name = "label25"; - this.label25.Size = new System.Drawing.Size(199, 21); - this.label25.TabIndex = 42; - this.label25.Text = "流媒体检测并发数:"; + this.labelPipeMedia.AutoSize = true; + this.labelPipeMedia.Location = new System.Drawing.Point(684, 41); + this.labelPipeMedia.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelPipeMedia.Name = "labelPipeMedia"; + this.labelPipeMedia.Size = new System.Drawing.Size(199, 21); + this.labelPipeMedia.TabIndex = 42; + this.labelPipeMedia.Text = "流媒体检测并发数:"; // - // numericUpDown12 + // numericUpDownPipeSpeed // - this.numericUpDown12.Location = new System.Drawing.Point(538, 36); - this.numericUpDown12.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown12.Maximum = new decimal(new int[] { + this.numericUpDownPipeSpeed.Location = new System.Drawing.Point(538, 36); + this.numericUpDownPipeSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownPipeSpeed.Maximum = new decimal(new int[] { 200, 0, 0, 0}); - this.numericUpDown12.Minimum = new decimal(new int[] { + this.numericUpDownPipeSpeed.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown12.Name = "numericUpDown12"; - this.numericUpDown12.Size = new System.Drawing.Size(106, 31); - this.numericUpDown12.TabIndex = 41; - this.numericUpDown12.Value = new decimal(new int[] { + this.numericUpDownPipeSpeed.Name = "numericUpDownPipeSpeed"; + this.numericUpDownPipeSpeed.Size = new System.Drawing.Size(106, 31); + this.numericUpDownPipeSpeed.TabIndex = 41; + this.numericUpDownPipeSpeed.Value = new decimal(new int[] { 32, 0, 0, 0}); // - // label24 - // - this.label24.AutoSize = true; - this.label24.Location = new System.Drawing.Point(404, 41); - this.label24.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label24.Name = "label24"; - this.label24.Size = new System.Drawing.Size(136, 21); - this.label24.TabIndex = 40; - this.label24.Text = "下载并发数:"; - // - // checkBox8 - // - this.checkBox8.AutoSize = true; - this.checkBox8.Checked = true; - this.checkBox8.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBox8.Location = new System.Drawing.Point(18, 39); - this.checkBox8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox8.Name = "checkBox8"; - this.checkBox8.Size = new System.Drawing.Size(99, 25); - this.checkBox8.TabIndex = 38; - this.checkBox8.Text = "自适应"; - this.checkBox8.UseVisualStyleBackColor = true; - // - // numericUpDown11 - // - this.numericUpDown11.Location = new System.Drawing.Point(275, 38); - this.numericUpDown11.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown11.Maximum = new decimal(new int[] { + // labelPipeSpeed + // + this.labelPipeSpeed.AutoSize = true; + this.labelPipeSpeed.Location = new System.Drawing.Point(404, 41); + this.labelPipeSpeed.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelPipeSpeed.Name = "labelPipeSpeed"; + this.labelPipeSpeed.Size = new System.Drawing.Size(136, 21); + this.labelPipeSpeed.TabIndex = 40; + this.labelPipeSpeed.Text = "下载并发数:"; + // + // checkBoxPipeAuto + // + this.checkBoxPipeAuto.AutoSize = true; + this.checkBoxPipeAuto.Checked = true; + this.checkBoxPipeAuto.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxPipeAuto.Location = new System.Drawing.Point(18, 39); + this.checkBoxPipeAuto.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxPipeAuto.Name = "checkBoxPipeAuto"; + this.checkBoxPipeAuto.Size = new System.Drawing.Size(99, 25); + this.checkBoxPipeAuto.TabIndex = 38; + this.checkBoxPipeAuto.Text = "自适应"; + this.checkBoxPipeAuto.UseVisualStyleBackColor = true; + this.checkBoxPipeAuto.CheckedChanged += new System.EventHandler(this.checkBoxPipeAuto_CheckedChanged); + // + // numericUpDownPipeAlive + // + this.numericUpDownPipeAlive.Location = new System.Drawing.Point(275, 38); + this.numericUpDownPipeAlive.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownPipeAlive.Maximum = new decimal(new int[] { 1000, 0, 0, 0}); - this.numericUpDown11.Minimum = new decimal(new int[] { + this.numericUpDownPipeAlive.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown11.Name = "numericUpDown11"; - this.numericUpDown11.Size = new System.Drawing.Size(106, 31); - this.numericUpDown11.TabIndex = 39; - this.numericUpDown11.Value = new decimal(new int[] { + this.numericUpDownPipeAlive.Name = "numericUpDownPipeAlive"; + this.numericUpDownPipeAlive.Size = new System.Drawing.Size(106, 31); + this.numericUpDownPipeAlive.TabIndex = 39; + this.numericUpDownPipeAlive.Value = new decimal(new int[] { 500, 0, 0, 0}); // - // label23 - // - this.label23.AutoSize = true; - this.label23.Location = new System.Drawing.Point(138, 41); - this.label23.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label23.Name = "label23"; - this.label23.Size = new System.Drawing.Size(136, 21); - this.label23.TabIndex = 38; - this.label23.Text = "测活并发数:"; - // - // groupBox8 - // - this.groupBox8.Controls.Add(this.checkBox10); - this.groupBox8.Controls.Add(this.checkBox9); - this.groupBox8.Location = new System.Drawing.Point(1039, 1104); - this.groupBox8.Name = "groupBox8"; - this.groupBox8.Size = new System.Drawing.Size(415, 89); - this.groupBox8.TabIndex = 44; - this.groupBox8.TabStop = false; - this.groupBox8.Text = "Enhance 参数"; - // - // checkBox10 - // - this.checkBox10.AutoSize = true; - this.checkBox10.Location = new System.Drawing.Point(201, 38); - this.checkBox10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox10.Name = "checkBox10"; - this.checkBox10.Size = new System.Drawing.Size(205, 25); - this.checkBox10.TabIndex = 39; - this.checkBox10.Text = "丢弃低质量CF节点"; - this.checkBox10.UseVisualStyleBackColor = true; - // - // checkBox9 - // - this.checkBox9.AutoSize = true; - this.checkBox9.Location = new System.Drawing.Point(18, 39); - this.checkBox9.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox9.Name = "checkBox9"; - this.checkBox9.Size = new System.Drawing.Size(162, 25); - this.checkBox9.TabIndex = 38; - this.checkBox9.Text = "增强位置标签"; - this.checkBox9.UseVisualStyleBackColor = true; + // labelPipeAlive + // + this.labelPipeAlive.AutoSize = true; + this.labelPipeAlive.Location = new System.Drawing.Point(138, 41); + this.labelPipeAlive.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelPipeAlive.Name = "labelPipeAlive"; + this.labelPipeAlive.Size = new System.Drawing.Size(136, 21); + this.labelPipeAlive.TabIndex = 38; + this.labelPipeAlive.Text = "测活并发数:"; + // + // groupBoxEnhance + // + this.groupBoxEnhance.Controls.Add(this.checkBoxDropBadCFNodes); + this.groupBoxEnhance.Controls.Add(this.checkBoxEhanceTag); + this.groupBoxEnhance.Location = new System.Drawing.Point(1039, 1104); + this.groupBoxEnhance.Name = "groupBoxEnhance"; + this.groupBoxEnhance.Size = new System.Drawing.Size(415, 89); + this.groupBoxEnhance.TabIndex = 44; + this.groupBoxEnhance.TabStop = false; + this.groupBoxEnhance.Text = "Enhance 参数"; + // + // checkBoxDropBadCFNodes + // + this.checkBoxDropBadCFNodes.AutoSize = true; + this.checkBoxDropBadCFNodes.Location = new System.Drawing.Point(201, 38); + this.checkBoxDropBadCFNodes.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxDropBadCFNodes.Name = "checkBoxDropBadCFNodes"; + this.checkBoxDropBadCFNodes.Size = new System.Drawing.Size(205, 25); + this.checkBoxDropBadCFNodes.TabIndex = 39; + this.checkBoxDropBadCFNodes.Text = "丢弃低质量CF节点"; + this.checkBoxDropBadCFNodes.UseVisualStyleBackColor = true; + // + // checkBoxEhanceTag + // + this.checkBoxEhanceTag.AutoSize = true; + this.checkBoxEhanceTag.Location = new System.Drawing.Point(18, 39); + this.checkBoxEhanceTag.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEhanceTag.Name = "checkBoxEhanceTag"; + this.checkBoxEhanceTag.Size = new System.Drawing.Size(162, 25); + this.checkBoxEhanceTag.TabIndex = 38; + this.checkBoxEhanceTag.Text = "增强位置标签"; + this.checkBoxEhanceTag.UseVisualStyleBackColor = true; // // Form1 // @@ -1822,12 +1824,12 @@ private void InitializeComponent() this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.ClientSize = new System.Drawing.Size(1466, 1510); - this.Controls.Add(this.groupBox8); - this.Controls.Add(this.groupBox7); + this.Controls.Add(this.groupBoxEnhance); + this.Controls.Add(this.groupBoxPipe); this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox4); - this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBoxAdvanceSettings); this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); this.Controls.Add(this.progressBar1); @@ -1847,8 +1849,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).EndInit(); this.groupBox2.ResumeLayout(false); this.groupBox2.PerformLayout(); - this.groupBox3.ResumeLayout(false); - this.groupBox3.PerformLayout(); + this.groupBoxAdvanceSettings.ResumeLayout(false); + this.groupBoxAdvanceSettings.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).EndInit(); @@ -1858,13 +1860,13 @@ private void InitializeComponent() this.groupBox5.PerformLayout(); this.groupBox6.ResumeLayout(false); this.groupBox6.PerformLayout(); - this.groupBox7.ResumeLayout(false); - this.groupBox7.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown13)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown12)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown11)).EndInit(); - this.groupBox8.ResumeLayout(false); - this.groupBox8.PerformLayout(); + this.groupBoxPipe.ResumeLayout(false); + this.groupBoxPipe.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeMedia)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeSpeed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeAlive)).EndInit(); + this.groupBoxEnhance.ResumeLayout(false); + this.groupBoxEnhance.PerformLayout(); this.ResumeLayout(false); } @@ -1876,9 +1878,9 @@ private void InitializeComponent() private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label LogLabelNodeInfo; - private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button buttonAdvanceSettings; private System.Windows.Forms.Button button1; - private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.GroupBox groupBoxAdvanceSettings; private System.Windows.Forms.Label label8; private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label4; @@ -1951,18 +1953,18 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox checkBox6; private System.Windows.Forms.NumericUpDown numericUpDown10; private System.Windows.Forms.CheckBox checkBoxSwitchArch64; - private System.Windows.Forms.CheckBox checkBox7; - private System.Windows.Forms.GroupBox groupBox7; - private System.Windows.Forms.NumericUpDown numericUpDown11; - private System.Windows.Forms.Label label23; - private System.Windows.Forms.CheckBox checkBox8; - private System.Windows.Forms.NumericUpDown numericUpDown13; - private System.Windows.Forms.Label label25; - private System.Windows.Forms.NumericUpDown numericUpDown12; - private System.Windows.Forms.Label label24; - private System.Windows.Forms.GroupBox groupBox8; - private System.Windows.Forms.CheckBox checkBox9; - private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.CheckBox checkBoxHighConcurrent; + private System.Windows.Forms.GroupBox groupBoxPipe; + private System.Windows.Forms.NumericUpDown numericUpDownPipeAlive; + private System.Windows.Forms.Label labelPipeAlive; + private System.Windows.Forms.CheckBox checkBoxPipeAuto; + private System.Windows.Forms.NumericUpDown numericUpDownPipeMedia; + private System.Windows.Forms.Label labelPipeMedia; + private System.Windows.Forms.NumericUpDown numericUpDownPipeSpeed; + private System.Windows.Forms.Label labelPipeSpeed; + private System.Windows.Forms.GroupBox groupBoxEnhance; + private System.Windows.Forms.CheckBox checkBoxEhanceTag; + private System.Windows.Forms.CheckBox checkBoxDropBadCFNodes; } } diff --git a/Form1.cs b/Form1.cs index e62abcb..686d469 100644 --- a/Form1.cs +++ b/Form1.cs @@ -27,6 +27,7 @@ public partial class Form1 : Form string githubProxyURL = ""; int run = 0; string 当前subsCheck版本号 = "未知版本"; + string currentKernel = "原版内核"; string currentArch = "i386"; string 当前GUI版本号 = "未知版本"; string 最新GUI版本号 = "未知版本"; @@ -38,6 +39,13 @@ public partial class Form1 : Form private string _lastLogLabelNodeInfoText = string.Empty; private string _lastNotifyText = string.Empty; + // 存储groupBox原始位置 + private Point _pipeOriginalLocation; + private Point _enhanceOriginalLocation; + private bool _originalLocationSaved = false; + + + public Form1() { InitializeComponent(); @@ -185,7 +193,7 @@ protected override void OnFormClosing(FormClosingEventArgs e) private async void timer1_Tick(object sender, EventArgs e)//初始化 { timer1.Enabled = false; - if (button2.Text == "高级设置∧") button2_Click(sender, e); + if (buttonAdvanceSettings.Text == "高级设置∧") button2_Click(sender, e); // 检查并创建config文件夹 string executablePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); string configFolderPath = System.IO.Path.Combine(executablePath, "config"); @@ -284,6 +292,13 @@ private async void ReadConfig()//读取配置文件 var deserializer = new YamlDotNet.Serialization.Deserializer(); var config = deserializer.Deserialize>(yamlContent); + //变量放在前面,以防后续读取时未定义 + string subscheckArch = 读取config字符串(config, "subscheck-arch"); + if (subscheckArch != null) currentArch = subscheckArch; + + string subscheckKernel = 读取config字符串(config, "subscheck-kernel"); + if (subscheckKernel != null) currentKernel = subscheckKernel; + // 使用新函数获取整数值并设置UI控件 int? concurrentValue = 读取config整数(config, "concurrent"); if (concurrentValue.HasValue) numericUpDown1.Value = concurrentValue.Value; @@ -446,8 +461,14 @@ private async void ReadConfig()//读取配置文件 string subscheckversion = 读取config字符串(config, "subscheck-version"); if (subscheckversion != null) 当前subsCheck版本号 = subscheckversion; - string subscheckArch = 读取config字符串(config, "subscheck-arch"); - if (subscheckArch != null) currentArch = subscheckArch; + //读取高并发版本设置 + string EnableHighConcurrent = 读取config字符串(config, "enable-high-concurrent"); + if (EnableHighConcurrent != null && EnableHighConcurrent == "true") checkBoxHighConcurrent.Checked = true; + else checkBoxHighConcurrent.Checked = false; + + string switchX64 = 读取config字符串(config, "switch-x64"); + if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; + else checkBoxSwitchArch64.Checked = false; int? successlimit = 读取config整数(config, "success-limit"); if (successlimit.HasValue) @@ -509,10 +530,6 @@ private async void ReadConfig()//读取配置文件 } } - string switchX64 = 读取config字符串(config, "switch-x64"); - if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; - else checkBoxSwitchArch64.Checked = false; - string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { @@ -645,24 +662,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 if (githubProxyCheck) { // 检查并处理 GitHub Raw URLs - if (comboBox3.Text == "自动选择") - { - // 创建不包含"自动选择"的代理列表 - List proxyItems = new List(); - for (int j = 0; j < comboBox3.Items.Count; j++) - { - string proxyItem = comboBox3.Items[j].ToString(); - if (proxyItem != "自动选择") - proxyItems.Add(proxyItem); - } - - // 随机打乱列表顺序 - Random random = new Random(); - proxyItems = proxyItems.OrderBy(x => random.Next()).ToList(); - - // 异步检测可用代理 - githubProxyURL = await DetectGitHubProxyAsync(proxyItems); - } + githubProxyURL = await GetGithubProxyUrlAsync(); } if (comboBox3.Text != "自动选择") githubProxyURL = $"https://{comboBox3.Text}/"; @@ -744,14 +744,16 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 else if (comboBox5.Text.StartsWith(githubRawPrefix)) config["mihomo-overwrite-url"] = githubProxyURL + comboBox5.Text; else config["mihomo-overwrite-url"] = comboBox5.Text != "" ? comboBox5.Text : $"http://127.0.0.1:{numericUpDown6.Value}/ACL4SSR_Online_Full.yaml"; + config["enable-high-concurrent"] = checkBoxHighConcurrent.Checked;//使用自适应高并发版本 + config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["rename-node"] = checkBox1.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBox2.Checked;//是否开启流媒体检测 - config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["keep-success-proxies"] = false; config["print-progress"] = false;//是否显示进度 config["sub-urls-retry"] = 3;//重试次数(获取订阅失败后重试次数) config["subscheck-version"] = 当前subsCheck版本号;//当前subsCheck版本号 config["subscheck-arch"] = currentArch; //当前subsCheck架构 + config["subscheck-kernel"] = currentKernel; //当前内核 config["gui-auto"] = checkBox5.Checked;//是否开机自启 @@ -768,6 +770,10 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 .WithIndentedSequences() // 使序列化结果更易读 .Build(); + + var deserializer = new YamlDotNet.Serialization.DeserializerBuilder() + .Build(); + string yamlContent = serializer.Serialize(config); // 确保配置目录存在 @@ -781,14 +787,34 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 // 读取more.yaml的内容 string moreYamlContent = File.ReadAllText(moreYamlPath); - // 确保more.yaml内容以换行开始 - if (!moreYamlContent.StartsWith("\n") && !moreYamlContent.StartsWith("\r\n")) + // 解析主配置和补充配置 + var Config = deserializer.Deserialize>(yamlContent); + var moreConfig = deserializer.Deserialize>(moreYamlContent); + + if (Config == null) Config = new Dictionary(); + if (moreConfig == null) moreConfig = new Dictionary(); + + // 检查并记录冲突的键 + var conflictKeys = new List(); + var mergedKeys = new List(); + + foreach (var kvp in moreConfig) { - yamlContent += "\n"; // 添加换行符作为分隔 + if (Config.ContainsKey(kvp.Key)) + { + conflictKeys.Add(kvp.Key); + Log($"发现重复键 '{kvp.Key}',使用GUI配置"); + } + else + { + Config[kvp.Key] = kvp.Value; + mergedKeys.Add(kvp.Key); + } } - // 将more.yaml的内容追加到要写入的config.yaml内容后 - yamlContent += moreYamlContent; + // 重新序列化合并后的配置 + yamlContent = serializer.Serialize(Config); + Log($"已将补充参数配置 more.yaml 内容追加到配置文件"); } @@ -804,25 +830,51 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 private void button2_Click(object sender, EventArgs e) { - if (button2.Text == "高级设置∧") + if (!_originalLocationSaved) + { + _originalLocationSaved = true; + _pipeOriginalLocation = groupBoxPipe.Location; + _enhanceOriginalLocation = groupBoxEnhance.Location; + } + //展开状态 + if (buttonAdvanceSettings.Text == "高级设置∧") { - button2.Text = "高级设置∨"; - groupBox3.Visible = false; - groupBox7.Visible = false; - groupBox8.Visible = false; - if (checkBox7.Checked) + buttonAdvanceSettings.Text = "高级设置∨"; + groupBoxAdvanceSettings.Visible = false; + if (!checkBoxHighConcurrent.Checked) { - groupBox7.Visible = false; - groupBox8.Visible = false; + groupBoxPipe.Visible = false; + groupBoxEnhance.Visible = false; + + groupBox4.Location = _pipeOriginalLocation; + groupBox5.Location = _pipeOriginalLocation; + groupBox6.Location = _pipeOriginalLocation; + } + else + { + groupBoxPipe.Visible = true; + groupBoxEnhance.Visible = true; + + groupBoxPipe.Location = groupBoxAdvanceSettings.Location; + groupBoxEnhance.Location = new Point(groupBoxEnhance.Location.X, groupBoxAdvanceSettings.Location.Y); } } else { - button2.Text = "高级设置∧"; - groupBox3.Visible = true; - if (checkBox7.Checked) { - groupBox7.Visible = true; - groupBox8.Visible = true; + // 收缩状态 + buttonAdvanceSettings.Text = "高级设置∧"; + groupBoxAdvanceSettings.Visible = true; + if (!checkBoxHighConcurrent.Checked) + { + groupBoxPipe.Visible = false; + groupBoxEnhance.Visible = false; + } + else + { + groupBoxPipe.Visible = true; + groupBoxEnhance.Visible = true; + groupBoxPipe.Location = _pipeOriginalLocation; + groupBoxEnhance.Location = _enhanceOriginalLocation; } } 判断保存类型(); @@ -859,7 +911,7 @@ private async void button1_Click(object sender, EventArgs e) numericUpDown7.Enabled = false; comboBox1.Enabled = false; textBox1.Enabled = false; - groupBox3.Enabled = false; + groupBoxAdvanceSettings.Enabled = false; groupBox4.Enabled = false; groupBox5.Enabled = false; groupBox6.Enabled = false; @@ -913,7 +965,7 @@ private async void button1_Click(object sender, EventArgs e) numericUpDown7.Enabled = true; comboBox1.Enabled = true; textBox1.Enabled = true; - groupBox3.Enabled = true; + groupBoxAdvanceSettings.Enabled = true; groupBox4.Enabled = true; groupBox5.Enabled = true; groupBox6.Enabled = true; @@ -935,16 +987,21 @@ private async Task DownloadSubsCheckEXE() { Log("正在检查网络连接..."); + // 动态决定使用哪个仓库(checkBoxHighConcurrent 为 true 时使用 sinspired,否则使用 beck-8) + string repoOwner = checkBoxHighConcurrent.Checked ? "sinspired" : "beck-8"; + string apiUrl = $"https://api.github.com/repos/{repoOwner}/subs-check/releases/latest"; + string releasesPageUrl = $"https://github.com/{repoOwner}/subs-check/releases"; + // 首先检查是否有网络连接 if (!IsNetworkAvailable()) { Log("网络连接不可用,无法下载核心文件。", true); - MessageBox.Show("缺少 subs-check.exe 核心文件。\n\n您可以前往 https://github.com/beck-8/subs-check/releases 自行下载!", + MessageBox.Show($"缺少 subs-check.exe 核心文件。\n\n您可以前往 {releasesPageUrl} 自行下载!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - var result = await 获取版本号("https://api.github.com/repos/beck-8/subs-check/releases/latest", true); + var result = await 获取版本号(apiUrl, true); if (result.Item1 == "未知版本") { // 无版本信息 @@ -1014,7 +1071,7 @@ private async Task DownloadSubsCheckEXE() if (downloadUrl == null) { Log("无法找到适用于 Windows 的下载链接。", true); - MessageBox.Show("未能找到适用的 subs-check.exe 下载链接。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + MessageBox.Show($"未能找到适用的 subs-check.exe 下载链接。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } @@ -1123,7 +1180,7 @@ private async Task DownloadSubsCheckEXE() if (!downloadSuccess) { Log($"所有下载尝试均失败,最后错误: {failureReason}", true); - MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); progressBar1.Value = 0; progressBar1.Visible = false; @@ -1147,9 +1204,12 @@ private async Task DownloadSubsCheckEXE() // 解压文件 exeEntry.ExtractToFile(exeFilePath); - 当前subsCheck版本号 = latestVersion; + currentKernel = checkBoxHighConcurrent.Checked ? "高并发内核" : "原版内核"; currentArch = desiredArchToken; - Log($"subs-check.exe {当前subsCheck版本号} 已就绪!"); + + 当前subsCheck版本号 = $"{latestVersion}"; + + Log($"{currentKernel}({currentArch}): subs-check.exe {当前subsCheck版本号} 已就绪!"); await SaveConfig(false); @@ -1165,7 +1225,7 @@ private async Task DownloadSubsCheckEXE() catch (Exception ex) { Log($"下载过程中出错: {ex.Message}", true); - MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 https://github.com/beck-8/subs-check/releases 自行下载!", + MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -1653,7 +1713,7 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) numericUpDown10.Enabled = true; numericUpDown6.Enabled = true; textBox1.Enabled = true; - groupBox3.Enabled = true; + groupBoxAdvanceSettings.Enabled = true; })); } @@ -1879,29 +1939,42 @@ private void comboBox3_Leave(object sender, EventArgs e) private void 判断保存类型() { - if (comboBox1.Text == "本地" || button2.Text == "高级设置∨") + if (comboBox1.Text == "本地" || buttonAdvanceSettings.Text == "高级设置∨") { groupBox4.Visible = false; groupBox5.Visible = false; groupBox6.Visible = false; } - else if (comboBox1.Text == "gist" && button2.Text == "高级设置∧") + else if (comboBox1.Text == "gist" && buttonAdvanceSettings.Text == "高级设置∧") { + if (!checkBoxHighConcurrent.Checked) + { + groupBox4.Location = _pipeOriginalLocation; + } + groupBox4.Visible = true; groupBox5.Visible = false; groupBox6.Visible = false; } - else if (comboBox1.Text == "r2" && button2.Text == "高级设置∧") + else if (comboBox1.Text == "r2" && buttonAdvanceSettings.Text == "高级设置∧") { + if (!checkBoxHighConcurrent.Checked) + { + groupBox5.Location = _pipeOriginalLocation; + } groupBox5.Location = groupBox4.Location; groupBox5.Visible = true; groupBox4.Visible = false; groupBox6.Visible = false; } - else if (comboBox1.Text == "webdav" && button2.Text == "高级设置∧") + else if (comboBox1.Text == "webdav" && buttonAdvanceSettings.Text == "高级设置∧") { + if (!checkBoxHighConcurrent.Checked) + { + groupBox6.Location = _pipeOriginalLocation; + } groupBox6.Location = groupBox4.Location; groupBox6.Visible = true; @@ -1913,7 +1986,7 @@ private void 判断保存类型() private void comboBox1_TextChanged(object sender, EventArgs e) { 判断保存类型(); - if (!(comboBox1.Text == "本地" || comboBox1.Text == "") && button2.Text == "高级设置∨") button2_Click(sender, e); + if (!(comboBox1.Text == "本地" || comboBox1.Text == "") && buttonAdvanceSettings.Text == "高级设置∨") button2_Click(sender, e); } private void textBox3_Enter(object sender, EventArgs e) @@ -2178,36 +2251,8 @@ private async void button5_Click(object sender, EventArgs e) } // 检测可用的 GitHub 代理 - if (!string.IsNullOrEmpty(comboBox3.Text) && comboBox3.Text == "自动选择") - { - // 创建不包含"自动选择"的代理列表 - List proxyItems = new List(); - for (int j = 0; j < comboBox3.Items.Count; j++) - { - string proxyItem = comboBox3.Items[j].ToString(); - if (proxyItem != "自动选择") - proxyItems.Add(proxyItem); - } - - // 随机打乱列表顺序 - Random random = new Random(); - proxyItems = proxyItems.OrderBy(x => random.Next()).ToList(); - - // 异步检测可用代理 - githubProxyURL = await DetectGitHubProxyAsync(proxyItems); - - // 如果未能找到可用代理,提示用户 - if (string.IsNullOrEmpty(githubProxyURL)) - { - Log("未能找到可用的 GitHub 代理,下载可能会失败", true); - } - } - else if (!string.IsNullOrEmpty(comboBox3.Text)) - { - githubProxyURL = $"https://{comboBox3.Text}/"; - Log($"使用指定的 GitHub 代理: {comboBox3.Text}"); - } - else + githubProxyURL = await GetGithubProxyUrlAsync(); + if (githubProxyURL == "") { Log("未设置 GitHub 代理,将尝试直接下载", true); } @@ -2409,7 +2454,7 @@ private async void timer3_Tick(object sender, EventArgs e) numericUpDown7.Enabled = false; comboBox1.Enabled = false; textBox1.Enabled = false; - groupBox3.Enabled = false; + groupBoxAdvanceSettings.Enabled = false; groupBox4.Enabled = false; groupBox5.Enabled = false; groupBox6.Enabled = false; @@ -3428,29 +3473,107 @@ private void numericUpDown3_ValueChanged(object sender, EventArgs e) } - private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs e) + private const string AUTO = "自动选择"; + + // 简化:获取 candidates 并处理 "自动选择" + private async Task GetGithubProxyUrlAsync() + { + if (comboBox3 == null) return githubProxyURL; + var text = (comboBox3.Text ?? ""); + if (text != AUTO && text.Length > 0) return $"https://{text}/"; + var candidates = comboBox3.Items + .OfType() + .Where(s => !string.IsNullOrWhiteSpace(s) && s != AUTO) + .OrderBy(_ => Guid.NewGuid()) + .ToList(); + + if (!candidates.Any()) return githubProxyURL; + try { var detected = await DetectGitHubProxyAsync(candidates); return string.IsNullOrWhiteSpace(detected) ? githubProxyURL : detected; } + catch { return githubProxyURL; } + } + + private void ApplyHighConcurrentLayout(bool high) { - if (!checkBoxSwitchArch64.Checked) + bool collapsed = buttonAdvanceSettings.Text == "高级设置∨"; + groupBoxPipe.Visible = high; + groupBoxEnhance.Visible = high; + if (collapsed) { - if (currentArch != "i386"){ - Log("切换为 i386 内核,内存占用更低,但CPU占用可能更高"); - _ = DownloadSubsCheckEXE(); + if (high) + { + if (!_originalLocationSaved) + { + _originalLocationSaved = true; + _pipeOriginalLocation = groupBoxPipe.Location; + _enhanceOriginalLocation = groupBoxEnhance.Location; + } + groupBoxPipe.Location = groupBoxAdvanceSettings.Location; + groupBoxEnhance.Location = new Point(groupBoxEnhance.Location.X, groupBoxAdvanceSettings.Location.Y); } - Log("使用32位内核,如CPU占用较高,可在[高级设置]切换"); } else { - if (currentArch != "x86_64") + if (high) { - Log(currentArch); - Log("切换为 x64 内核,内存占用更高,但CPU占用可能较低"); - _ = DownloadSubsCheckEXE(); + groupBoxPipe.Location = _pipeOriginalLocation; + groupBoxEnhance.Location = _enhanceOriginalLocation; + groupBox4.Location = new Point(groupBox4.Location.X, groupBox4.Location.Y + groupBoxPipe.Height); + groupBox5.Location = groupBox4.Location; groupBox6.Location = groupBox4.Location; + } + else + { + groupBox4.Location = _pipeOriginalLocation; groupBox5.Location = groupBox4.Location; groupBox6.Location = groupBox4.Location; } - Log("使用64位内核,如内存占用较高,可在[高级设置]切换"); } + } - // 保存配置 - await SaveConfig(); + // 极简事件:只做状态变更检查、统一获取 proxy、更新并保存 + private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArgs e) + { + bool high = checkBoxHighConcurrent.Checked; + string want = high ? "高并发内核" : "原版内核"; + if (currentKernel != want) + { + githubProxyURL = await GetGithubProxyUrlAsync(); + if (comboBox3?.Text != null && comboBox3.Text != AUTO) githubProxyURL = $"https://{comboBox3.Text}/"; + Log(high ? "切换为 高并发 内核,可单独设置测活-测速-媒体检测各阶段并发数,大幅提高性能" : "切换为 原版 内核"); + _ = DownloadSubsCheckEXE();// 若要后台并行改为 _ = DownloadSubsCheckEXE(); + currentKernel = want; + } + ApplyHighConcurrentLayout(high); + Log(high ? "已切换高并发内核,测活-测速-媒体检测 流水线式并发运行。" : "使用原版内核。"); + } + + private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs e) + { + bool useX64 = checkBoxSwitchArch64.Checked; + string want = useX64 ? "x86_64" : "i386"; + if (currentArch != want) + { + githubProxyURL = await GetGithubProxyUrlAsync(); + if (comboBox3?.Text != null && comboBox3.Text != AUTO) githubProxyURL = $"https://{comboBox3.Text}/"; + Log(useX64 ? "切换为 x64 内核,内存占用更高,但CPU占用可能较低" : "切换为 i386 内核,内存占用更低,但CPU占用可能更高"); + await DownloadSubsCheckEXE(); + currentArch = want; + } + Log(useX64 ? "使用64位内核,如内存占用较高,可在[高级设置]切换" : "使用32位内核,如CPU占用较高,可在[高级设置]切换"); + } + + + private void checkBoxPipeAuto_CheckedChanged(object sender, EventArgs e) + { + if (checkBoxPipeAuto.Checked) + { + numericUpDownPipeAlive.Enabled = false; + numericUpDownPipeSpeed.Enabled = false; + numericUpDownPipeMedia.Enabled = false; + } + else + { + numericUpDownPipeAlive.Enabled = true; + numericUpDownPipeSpeed.Enabled = true; + numericUpDownPipeMedia.Enabled = true; + } } } -} +} \ No newline at end of file From 376c02f9dddaafb3571964c76b95b471c5ff71d7 Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 28 Aug 2025 17:23:35 +0800 Subject: [PATCH 14/92] =?UTF-8?q?perf:=20=E4=BF=AE=E5=A4=8D=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E5=88=87=E6=8D=A2=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96githubproxy=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.Designer.cs | 18 +++---- Form1.cs | 118 +++++++++++++++++----------------------------- 2 files changed, 51 insertions(+), 85 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index de7978c..5f6d52e 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -180,7 +180,7 @@ private void InitializeComponent() this.checkBox5.Location = new System.Drawing.Point(167, 749); this.checkBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox5.Name = "checkBox5"; - this.checkBox5.Size = new System.Drawing.Size(113, 25); + this.checkBox5.Size = new System.Drawing.Size(120, 25); this.checkBox5.TabIndex = 30; this.checkBox5.Text = "开机自启"; this.checkBox5.UseVisualStyleBackColor = true; @@ -679,11 +679,11 @@ private void InitializeComponent() this.checkBoxSwitchArch64.AutoSize = true; this.checkBoxSwitchArch64.Location = new System.Drawing.Point(515, 173); this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; - this.checkBoxSwitchArch64.Size = new System.Drawing.Size(146, 25); + this.checkBoxSwitchArch64.Size = new System.Drawing.Size(153, 25); this.checkBoxSwitchArch64.TabIndex = 38; this.checkBoxSwitchArch64.Text = "使用x64内核"; this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; - this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.checkBoxSwitchArch64_CheckedChanged); + this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.CheckBoxSwitchArch64_CheckedChanged); // // numericUpDown10 // @@ -710,7 +710,7 @@ private void InitializeComponent() this.checkBox6.Location = new System.Drawing.Point(17, 127); this.checkBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox6.Name = "checkBox6"; - this.checkBox6.Size = new System.Drawing.Size(200, 25); + this.checkBox6.Size = new System.Drawing.Size(207, 25); this.checkBox6.TabIndex = 36; this.checkBox6.Text = "带宽限制(MB/s):"; this.checkBox6.UseVisualStyleBackColor = true; @@ -785,7 +785,7 @@ private void InitializeComponent() this.checkBox4.Location = new System.Drawing.Point(16, 173); this.checkBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox4.Name = "checkBox4"; - this.checkBox4.Size = new System.Drawing.Size(233, 25); + this.checkBox4.Size = new System.Drawing.Size(240, 25); this.checkBox4.TabIndex = 28; this.checkBox4.Text = "启用WebUI API密钥:"; this.checkBox4.UseVisualStyleBackColor = true; @@ -821,7 +821,7 @@ private void InitializeComponent() this.checkBox3.Location = new System.Drawing.Point(17, 81); this.checkBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox3.Name = "checkBox3"; - this.checkBox3.Size = new System.Drawing.Size(176, 25); + this.checkBox3.Size = new System.Drawing.Size(183, 25); this.checkBox3.TabIndex = 27; this.checkBox3.Text = "节点保存数目:"; this.checkBox3.UseVisualStyleBackColor = true; @@ -850,7 +850,7 @@ private void InitializeComponent() this.checkBox1.Location = new System.Drawing.Point(17, 35); this.checkBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(155, 25); + this.checkBox1.Size = new System.Drawing.Size(162, 25); this.checkBox1.TabIndex = 22; this.checkBox1.Text = "节点地址查询"; this.checkBox1.UseVisualStyleBackColor = true; @@ -862,7 +862,7 @@ private void InitializeComponent() this.checkBox2.Location = new System.Drawing.Point(198, 35); this.checkBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBox2.Name = "checkBox2"; - this.checkBox2.Size = new System.Drawing.Size(134, 25); + this.checkBox2.Size = new System.Drawing.Size(141, 25); this.checkBox2.TabIndex = 25; this.checkBox2.Text = "流媒体检测"; this.checkBox2.UseVisualStyleBackColor = true; @@ -1632,7 +1632,7 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(1460, 799); + this.ClientSize = new System.Drawing.Size(1460, 1414); this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox4); diff --git a/Form1.cs b/Form1.cs index ab19ad8..e133402 100644 --- a/Form1.cs +++ b/Form1.cs @@ -284,6 +284,10 @@ private async void ReadConfig()//读取配置文件 var deserializer = new YamlDotNet.Serialization.Deserializer(); var config = deserializer.Deserialize>(yamlContent); + //变量放在前面,以防后续读取时未定义 + string subscheckArch = 读取config字符串(config, "subscheck-arch"); + if (subscheckArch != null) currentArch = subscheckArch; + // 使用新函数获取整数值并设置UI控件 int? concurrentValue = 读取config整数(config, "concurrent"); if (concurrentValue.HasValue) numericUpDown1.Value = concurrentValue.Value; @@ -446,8 +450,9 @@ private async void ReadConfig()//读取配置文件 string subscheckversion = 读取config字符串(config, "subscheck-version"); if (subscheckversion != null) 当前subsCheck版本号 = subscheckversion; - string subscheckArch = 读取config字符串(config, "subscheck-arch"); - if (subscheckArch != null) currentArch = subscheckArch; + string switchX64 = 读取config字符串(config, "switch-x64"); + if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; + else checkBoxSwitchArch64.Checked = false; int? successlimit = 读取config整数(config, "success-limit"); if (successlimit.HasValue) @@ -509,10 +514,6 @@ private async void ReadConfig()//读取配置文件 } } - string switchX64 = 读取config字符串(config, "switch-x64"); - if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; - else checkBoxSwitchArch64.Checked = false; - string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { @@ -645,24 +646,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 if (githubProxyCheck) { // 检查并处理 GitHub Raw URLs - if (comboBox3.Text == "自动选择") - { - // 创建不包含"自动选择"的代理列表 - List proxyItems = new List(); - for (int j = 0; j < comboBox3.Items.Count; j++) - { - string proxyItem = comboBox3.Items[j].ToString(); - if (proxyItem != "自动选择") - proxyItems.Add(proxyItem); - } - - // 随机打乱列表顺序 - Random random = new Random(); - proxyItems = proxyItems.OrderBy(x => random.Next()).ToList(); - - // 异步检测可用代理 - githubProxyURL = await DetectGitHubProxyAsync(proxyItems); - } + githubProxyURL = await GetGithubProxyUrlAsync(); } if (comboBox3.Text != "自动选择") githubProxyURL = $"https://{comboBox3.Text}/"; @@ -2191,36 +2175,8 @@ private async void button5_Click(object sender, EventArgs e) } // 检测可用的 GitHub 代理 - if (!string.IsNullOrEmpty(comboBox3.Text) && comboBox3.Text == "自动选择") - { - // 创建不包含"自动选择"的代理列表 - List proxyItems = new List(); - for (int j = 0; j < comboBox3.Items.Count; j++) - { - string proxyItem = comboBox3.Items[j].ToString(); - if (proxyItem != "自动选择") - proxyItems.Add(proxyItem); - } - - // 随机打乱列表顺序 - Random random = new Random(); - proxyItems = proxyItems.OrderBy(x => random.Next()).ToList(); - - // 异步检测可用代理 - githubProxyURL = await DetectGitHubProxyAsync(proxyItems); - - // 如果未能找到可用代理,提示用户 - if (string.IsNullOrEmpty(githubProxyURL)) - { - Log("未能找到可用的 GitHub 代理,下载可能会失败", true); - } - } - else if (!string.IsNullOrEmpty(comboBox3.Text)) - { - githubProxyURL = $"https://{comboBox3.Text}/"; - Log($"使用指定的 GitHub 代理: {comboBox3.Text}"); - } - else + githubProxyURL = await GetGithubProxyUrlAsync(); + if (githubProxyURL == "") { Log("未设置 GitHub 代理,将尝试直接下载", true); } @@ -3441,30 +3397,40 @@ private void numericUpDown3_ValueChanged(object sender, EventArgs e) } - private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs e) + // 获取可用 github 代理 + private async Task GetGithubProxyUrlAsync() { - if (!checkBoxSwitchArch64.Checked) - { - if (currentArch != "i386") - { - Log("切换为 i386 内核,内存占用更低,但CPU占用可能更高"); - _ = DownloadSubsCheckEXE(); - } - Log("使用32位内核,如CPU占用较高,可在[高级设置]切换"); - } - else + const string AUTO = "自动选择"; + + if (comboBox3 == null) return githubProxyURL; + var text = comboBox3.Text ?? ""; + // 如果已指定代理,直接返回结果 + if (text != AUTO && text.Length > 0) return $"https://{text}/"; + + //乱序 + var candidates = comboBox3.Items + .OfType() + .Where(s => !string.IsNullOrWhiteSpace(s) && s != AUTO) + .OrderBy(_ => Guid.NewGuid()) + .ToList(); + + if (!candidates.Any()) return githubProxyURL; + try { var detected = await DetectGitHubProxyAsync(candidates); return string.IsNullOrWhiteSpace(detected) ? githubProxyURL : detected; } + catch { return githubProxyURL; } + } + + private async void CheckBoxSwitchArch64_CheckedChanged(object sender, EventArgs e) + { + bool useX64 = checkBoxSwitchArch64.Checked; + string want = useX64 ? "x86_64" : "i386"; + if (currentArch != want) { - if (currentArch != "x86_64") - { - Log(currentArch); - Log("切换为 x64 内核,内存占用更高,但CPU占用可能较低"); - _ = DownloadSubsCheckEXE(); - } - Log("使用64位内核,如内存占用较高,可在[高级设置]切换"); + githubProxyURL = await GetGithubProxyUrlAsync(); + Log(useX64 ? "切换为 x64 内核,内存占用更高,但CPU占用可能较低" : "切换为 i386 内核,内存占用更低,但CPU占用可能更高"); + await DownloadSubsCheckEXE(); + currentArch = want; } - - // 保存配置 - await SaveConfig(); + Log(useX64 ? "使用64位内核,如内存占用较高,可在[高级设置]切换" : "使用32位内核,如CPU占用较高,可在[高级设置]切换"); } } -} +} \ No newline at end of file From 7c4a1090e4033b6d276ad077ae8e5e7d2ef232aa Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 28 Aug 2025 21:57:23 +0800 Subject: [PATCH 15/92] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E7=BA=BF=E5=88=86=E6=AE=B5=E9=AB=98=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=A2=9E=E5=BC=BA=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=EF=BC=8C=E5=A4=A7=E5=B9=85=E6=8F=90=E9=AB=98?= =?UTF-8?q?=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CheckUpdates.cs | 35 ++---- Form1.Designer.cs | 89 ++++++------- Form1.cs | 309 +++++++++++++++++++++++++++++++++------------- Form1.resx | 3 - 4 files changed, 282 insertions(+), 154 deletions(-) diff --git a/CheckUpdates.cs b/CheckUpdates.cs index 44ccdb8..50d31e8 100644 --- a/CheckUpdates.cs +++ b/CheckUpdates.cs @@ -20,6 +20,8 @@ public partial class CheckUpdates : Form public string 当前subsCheck版本号 { get; set; } public string 当前GUI版本号 { get; set; } public string 最新GUI版本号 { get; set; } + public bool EnableHighConcurrent { get; set; } + public bool EnableArch64 { get; set; } public CheckUpdates() { @@ -51,28 +53,9 @@ private async void timer1_Tick(object sender, EventArgs e) label5.Text = 当前subsCheck版本号; - if (comboBox1.Text == "自动选择") - { - // 创建不包含"自动选择"的代理列表 - List proxyItems = new List(); - for (int j = 0; j < comboBox1.Items.Count; j++) - { - string proxyItem = comboBox1.Items[j].ToString(); - if (proxyItem != "自动选择") - proxyItems.Add(proxyItem); - } + Form1 mainForm = new Form1(); - // 随机打乱列表顺序 - Random random = new Random(); - proxyItems = proxyItems.OrderBy(x => random.Next()).ToList(); - - // 异步检测可用代理 - githubProxyURL = await DetectGitHubProxyAsync(proxyItems); - } - else - { - githubProxyURL = $"https://{comboBox1.Text}/"; - } + githubProxyURL = await mainForm.GetGithubProxyUrlAsync(); if (最新GUI版本号 != 当前GUI版本号) { @@ -95,6 +78,9 @@ private async void timer1_Tick(object sender, EventArgs e) button1.Enabled = false; } + // 根据并发参数选择仓库 + string repoOwner = EnableHighConcurrent ? "sinspired" : "beck-8"; + using (HttpClient client = new HttpClient()) { try @@ -102,8 +88,9 @@ private async void timer1_Tick(object sender, EventArgs e) client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); client.Timeout = TimeSpan.FromSeconds(30); // 增加超时时间以适应下载需求 - string url = "https://api.github.com/repos/beck-8/subs-check/releases/latest"; - string 备用url = "https://api.github.cmliussss.net/repos/beck-8/subs-check/releases/latest"; + + string url = $"https://api.github.com/repos/{repoOwner}/subs-check/releases/latest"; + string 备用url = $"https://api.github.cmliussss.net/repos/{repoOwner}/subs-check/releases/latest"; HttpResponseMessage response = null; string responseBody = null; @@ -227,7 +214,7 @@ private async void timer1_Tick(object sender, EventArgs e) } catch (Exception ex) { - MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n请前往 https://github.com/beck-8/subs-check/releases 自行下载!", + MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n请前往 https://github.com/{repoOwner}/subs-check/releases 自行下载!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 37bba56..bb3145e 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -42,10 +42,10 @@ private void InitializeComponent() this.comboBox4 = new System.Windows.Forms.ComboBox(); this.button3 = new System.Windows.Forms.Button(); this.comboBox1 = new System.Windows.Forms.ComboBox(); - this.numericUpDown4 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMinSpeed = new System.Windows.Forms.NumericUpDown(); this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); - this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownConcurrent = new System.Windows.Forms.NumericUpDown(); this.label7 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); @@ -68,7 +68,7 @@ private void InitializeComponent() this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.LogLabelNodeInfo = new System.Windows.Forms.Label(); this.groupBoxAdvanceSettings = new System.Windows.Forms.GroupBox(); - this.numericUpDown10 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownTotalBandwidthLimit = new System.Windows.Forms.NumericUpDown(); this.checkBox6 = new System.Windows.Forms.CheckBox(); this.label22 = new System.Windows.Forms.Label(); this.label21 = new System.Windows.Forms.Label(); @@ -123,16 +123,16 @@ private void InitializeComponent() this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); this.groupBox1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit(); this.groupBox2.SuspendLayout(); this.groupBoxAdvanceSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalBandwidthLimit)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).BeginInit(); this.groupBox4.SuspendLayout(); @@ -170,10 +170,10 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.comboBox4); this.groupBox1.Controls.Add(this.button3); this.groupBox1.Controls.Add(this.comboBox1); - this.groupBox1.Controls.Add(this.numericUpDown4); + this.groupBox1.Controls.Add(this.numericUpDownMinSpeed); this.groupBox1.Controls.Add(this.numericUpDown3); this.groupBox1.Controls.Add(this.numericUpDown2); - this.groupBox1.Controls.Add(this.numericUpDown1); + this.groupBox1.Controls.Add(this.numericUpDownConcurrent); this.groupBox1.Controls.Add(this.label7); this.groupBox1.Controls.Add(this.label6); this.groupBox1.Controls.Add(this.label3); @@ -305,29 +305,29 @@ private void InitializeComponent() this.comboBox1.TabIndex = 16; this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); // - // numericUpDown4 + // numericUpDownMinSpeed // - this.numericUpDown4.Location = new System.Drawing.Point(192, 186); - this.numericUpDown4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown4.Maximum = new decimal(new int[] { + this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 186); + this.numericUpDownMinSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownMinSpeed.Maximum = new decimal(new int[] { 20480, 0, 0, 0}); - this.numericUpDown4.Minimum = new decimal(new int[] { + this.numericUpDownMinSpeed.Minimum = new decimal(new int[] { 128, 0, 0, 0}); - this.numericUpDown4.Name = "numericUpDown4"; - this.numericUpDown4.Size = new System.Drawing.Size(106, 31); - this.numericUpDown4.TabIndex = 13; - this.numericUpDown4.Value = new decimal(new int[] { + this.numericUpDownMinSpeed.Name = "numericUpDownMinSpeed"; + this.numericUpDownMinSpeed.Size = new System.Drawing.Size(106, 31); + this.numericUpDownMinSpeed.TabIndex = 13; + this.numericUpDownMinSpeed.Value = new decimal(new int[] { 1024, 0, 0, 0}); - this.numericUpDown4.ValueChanged += new System.EventHandler(this.numericUpDown4_ValueChanged); + this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDown4_ValueChanged); // // numericUpDown3 // @@ -377,29 +377,29 @@ private void InitializeComponent() 0}); this.numericUpDown2.DoubleClick += new System.EventHandler(this.切换cron表达式); // - // numericUpDown1 + // numericUpDownConcurrent // - this.numericUpDown1.Location = new System.Drawing.Point(192, 33); - this.numericUpDown1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown1.Maximum = new decimal(new int[] { + this.numericUpDownConcurrent.Location = new System.Drawing.Point(192, 33); + this.numericUpDownConcurrent.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownConcurrent.Maximum = new decimal(new int[] { 1024, 0, 0, 0}); - this.numericUpDown1.Minimum = new decimal(new int[] { + this.numericUpDownConcurrent.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown1.Name = "numericUpDown1"; - this.numericUpDown1.Size = new System.Drawing.Size(106, 31); - this.numericUpDown1.TabIndex = 10; - this.numericUpDown1.Value = new decimal(new int[] { + this.numericUpDownConcurrent.Name = "numericUpDownConcurrent"; + this.numericUpDownConcurrent.Size = new System.Drawing.Size(106, 31); + this.numericUpDownConcurrent.TabIndex = 10; + this.numericUpDownConcurrent.Value = new decimal(new int[] { 32, 0, 0, 0}); - this.numericUpDown1.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged); + this.numericUpDownConcurrent.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged); // // label7 // @@ -679,7 +679,7 @@ private void InitializeComponent() // // groupBoxAdvanceSettings // - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown10); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownTotalBandwidthLimit); this.groupBoxAdvanceSettings.Controls.Add(this.checkBox6); this.groupBoxAdvanceSettings.Controls.Add(this.label22); this.groupBoxAdvanceSettings.Controls.Add(this.label21); @@ -714,20 +714,20 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.Text = "高级设置"; this.groupBoxAdvanceSettings.Visible = false; // - // numericUpDown10 + // numericUpDownTotalBandwidthLimit // - this.numericUpDown10.Enabled = false; - this.numericUpDown10.Location = new System.Drawing.Point(224, 124); - this.numericUpDown10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown10.Maximum = new decimal(new int[] { + this.numericUpDownTotalBandwidthLimit.Enabled = false; + this.numericUpDownTotalBandwidthLimit.Location = new System.Drawing.Point(224, 124); + this.numericUpDownTotalBandwidthLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownTotalBandwidthLimit.Maximum = new decimal(new int[] { 1000, 0, 0, 0}); - this.numericUpDown10.Name = "numericUpDown10"; - this.numericUpDown10.Size = new System.Drawing.Size(106, 31); - this.numericUpDown10.TabIndex = 37; - this.numericUpDown10.Value = new decimal(new int[] { + this.numericUpDownTotalBandwidthLimit.Name = "numericUpDownTotalBandwidthLimit"; + this.numericUpDownTotalBandwidthLimit.Size = new System.Drawing.Size(106, 31); + this.numericUpDownTotalBandwidthLimit.TabIndex = 37; + this.numericUpDownTotalBandwidthLimit.Value = new decimal(new int[] { 12, 0, 0, @@ -1743,6 +1743,7 @@ private void InitializeComponent() this.numericUpDownPipeAlive.Name = "numericUpDownPipeAlive"; this.numericUpDownPipeAlive.Size = new System.Drawing.Size(106, 31); this.numericUpDownPipeAlive.TabIndex = 39; + this.numericUpDownPipeAlive.Tag = ""; this.numericUpDownPipeAlive.ValueChanged += new System.EventHandler(this.numericUpDownPipeAlive_ValueChanged); // // labelPipeAlive @@ -1811,10 +1812,10 @@ private void InitializeComponent() this.Text = "SubsCheck Win GUI"; this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).EndInit(); @@ -1822,7 +1823,7 @@ private void InitializeComponent() this.groupBox2.PerformLayout(); this.groupBoxAdvanceSettings.ResumeLayout(false); this.groupBoxAdvanceSettings.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalBandwidthLimit)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).EndInit(); this.groupBox4.ResumeLayout(false); @@ -1863,10 +1864,10 @@ private void InitializeComponent() private System.Windows.Forms.Label label1; private System.Windows.Forms.NumericUpDown numericUpDown6; private System.Windows.Forms.NumericUpDown numericUpDown5; - private System.Windows.Forms.NumericUpDown numericUpDown4; + private System.Windows.Forms.NumericUpDown numericUpDownMinSpeed; private System.Windows.Forms.NumericUpDown numericUpDown3; private System.Windows.Forms.NumericUpDown numericUpDown2; - private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.NumericUpDown numericUpDownConcurrent; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.ComboBox comboBox1; private System.Windows.Forms.ComboBox comboBox2; @@ -1922,7 +1923,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label21; private System.Windows.Forms.Label label22; private System.Windows.Forms.CheckBox checkBox6; - private System.Windows.Forms.NumericUpDown numericUpDown10; + private System.Windows.Forms.NumericUpDown numericUpDownTotalBandwidthLimit; private System.Windows.Forms.CheckBox checkBoxSwitchArch64; private System.Windows.Forms.CheckBox checkBoxHighConcurrent; private System.Windows.Forms.GroupBox groupBoxPipe; diff --git a/Form1.cs b/Form1.cs index 54f8e7d..94fac25 100644 --- a/Form1.cs +++ b/Form1.cs @@ -8,6 +8,7 @@ using System.IO.Compression; using System.Linq; using System.Net.Http; +using System.Net.Http.Headers; using System.Net.NetworkInformation; using System.Text; using System.Threading.Tasks; @@ -51,17 +52,17 @@ public Form1() InitializeComponent(); originalNotifyIcon = notifyIcon1.Icon; - toolTip1.SetToolTip(numericUpDown1, "并发线程数:推荐 宽带峰值/50M。"); + toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。"); toolTip1.SetToolTip(numericUpDown2, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); toolTip1.SetToolTip(label2, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); toolTip1.SetToolTip(numericUpDown3, "超时时间(毫秒):节点的最大延迟。"); - toolTip1.SetToolTip(numericUpDown4, "最低测速结果舍弃(KB/s)。"); + toolTip1.SetToolTip(numericUpDownMinSpeed, "最低测速结果舍弃(KB/s)。"); toolTip1.SetToolTip(numericUpDown5, "下载测试时间(s):与下载链接大小相关,默认最大测试10s。"); toolTip1.SetToolTip(numericUpDown6, "本地监听端口:用于直接返回测速结果的节点信息,方便 Sub-Store 实现订阅转换。"); toolTip1.SetToolTip(numericUpDown7, "Sub-Store监听端口:用于订阅订阅转换。\n注意:除非你知道你在干什么,否则不要将你的 Sub-Store 暴露到公网,否则可能会被滥用"); toolTip1.SetToolTip(numericUpDown9, "下载测试限制(MB):当达到下载数据大小时,停止下载,可节省测速流量,减少测速测死的概率"); - toolTip1.SetToolTip(numericUpDown10, "总下载速度限制(MB/s):建议设置为 <=带宽/8, 比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20"); + toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, "总下载速度限制(MB/s):建议设置为 <=带宽/8, 比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20"); toolTip1.SetToolTip(textBox1, "节点池订阅地址:支持 Link、Base64、Clash 格式的订阅链接。"); toolTip1.SetToolTip(checkBox1, "以节点IP查询位置重命名节点。\n质量差的节点可能造成IP查询失败,造成整体检查速度稍微变慢。"); toolTip1.SetToolTip(checkBox2, "是否开启流媒体检测,其中IP欺诈依赖'节点地址查询',内核版本需要 v2.0.8 以上\n\n示例:美国1 | ⬇️ 5.6MB/s |0%|Netflix|Disney|Openai\n风控值:0% (使用ping0.cc标准)\n流媒体解锁:Netflix、Disney、Openai"); @@ -80,7 +81,7 @@ public Form1() toolTip1.SetToolTip(checkBox6, "总的下载速度限制,不选代表不限制"); toolTip1.SetToolTip(numericUpDown8, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); - toolTip1.SetToolTip(numericUpDown10, "总的下载速度限制,不选代表不限制"); + toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, "总的下载速度限制,不选代表不限制"); toolTip1.SetToolTip(labelCron, "双击切换 使用「分钟倒计时」"); @@ -292,46 +293,85 @@ private async void ReadConfig()//读取配置文件 var deserializer = new YamlDotNet.Serialization.Deserializer(); var config = deserializer.Deserialize>(yamlContent); - //变量放在前面,以防后续读取时未定义 - // Use x64架构 + string savemethod = 读取config字符串(config, "save-method"); + if (savemethod != null) + { + if (savemethod == "local") comboBox1.Text = "本地"; + else comboBox1.Text = savemethod; + } + + // 变量放在前面,以防后续读取时未定义 string subscheckArch = 读取config字符串(config, "subscheck-arch"); - if (subscheckArch != null) currentArch = subscheckArch; + if (!string.IsNullOrWhiteSpace(subscheckArch)) currentArch = subscheckArch; - // 使用高并发版本 string subscheckKernel = 读取config字符串(config, "subscheck-kernel"); - if (subscheckKernel != null) currentKernel = subscheckKernel; + if (!string.IsNullOrWhiteSpace(subscheckKernel)) currentKernel = subscheckKernel; // 使用新函数获取整数值并设置UI控件 int? concurrentValue = 读取config整数(config, "concurrent"); - if (concurrentValue.HasValue) numericUpDown1.Value = concurrentValue.Value; + if (concurrentValue.HasValue) numericUpDownConcurrent.Value = concurrentValue.Value; + + // 临时禁用事件 + numericUpDownPipeAlive.ValueChanged -= numericUpDownPipeAlive_ValueChanged; + numericUpDownPipeSpeed.ValueChanged -= numericUpDownPipeSpeed_ValueChanged; + numericUpDownPipeMedia.ValueChanged -= numericUpDownPipeMedia_ValueChanged; - // 测活阶段并发数 + // 测活/测速/流媒体阶段并发数(先赋值到控件,再从控件读取最终值,保证非 null) int? aliveConcurrentValue = 读取config整数(config, "alive-concurrent"); if (aliveConcurrentValue.HasValue) numericUpDownPipeAlive.Value = aliveConcurrentValue.Value; - // 测速阶段并发数 + int? speedConcurrentValue = 读取config整数(config, "speed-concurrent"); if (speedConcurrentValue.HasValue) numericUpDownPipeSpeed.Value = speedConcurrentValue.Value; - // 流媒体检测阶段并发数 + int? mediaConcurrentValue = 读取config整数(config, "media-concurrent"); if (mediaConcurrentValue.HasValue) numericUpDownPipeMedia.Value = mediaConcurrentValue.Value; - // 根据各阶段并发数切换设置项,如果任一为0,则启用自适应高并发 - switchPipeAutoConcurrent(); + // 根据各阶段并发数切换设置项, 如果任一为0, 则启用自适应高并发 + switchPipeAutoConcurrent(); // 现在控件已被赋值,函数可以安全读取 numericUpDown 的值 - //读取高并发版本设置 - string EnableHighConcurrent = 读取config字符串(config, "enable-high-concurrent"); - if (EnableHighConcurrent != null && EnableHighConcurrent == "true") checkBoxHighConcurrent.Checked = true; - else checkBoxHighConcurrent.Checked = false; + // 重新启用事件 + numericUpDownPipeAlive.ValueChanged += numericUpDownPipeAlive_ValueChanged; + numericUpDownPipeSpeed.ValueChanged += numericUpDownPipeSpeed_ValueChanged; + numericUpDownPipeMedia.ValueChanged += numericUpDownPipeMedia_ValueChanged; + + // Enhance-tag 相关设置(稳健解析 "true"/"false") + string enhanceTagRaw = 读取config字符串(config, "enhanced-tag"); + bool enhanceTagFlag = false; + if (!string.IsNullOrWhiteSpace(enhanceTagRaw)) + { + bool.TryParse(enhanceTagRaw.Trim(), out enhanceTagFlag); + } + checkBoxEhanceTag.Checked = enhanceTagFlag; + + // 丢弃低质量的 cf 节点 + string dropBadCFRaw = 读取config字符串(config, "drop-bad-cf-nodes"); + bool dropBadCFFlag = false; + if (!string.IsNullOrWhiteSpace(dropBadCFRaw)) + { + bool.TryParse(dropBadCFRaw.Trim(), out dropBadCFFlag); + } + checkBoxDropBadCFNodes.Checked = dropBadCFFlag; + + // 读取 enable-high-concurrent,并解析为 bool + string enableHighConcurrentRaw = 读取config字符串(config, "enable-high-concurrent"); + bool enableHighConcurrentFlag = false; + if (!string.IsNullOrWhiteSpace(enableHighConcurrentRaw)) + { + bool.TryParse(enableHighConcurrentRaw.Trim(), out enableHighConcurrentFlag); + } - // Enhance-tag相关设置 - string EnhanceTag = 读取config字符串(config, "enhanced-tag"); - if (EnhanceTag != null && EnhanceTag == "true") checkBoxEhanceTag.Checked = true; - else checkBoxEhanceTag.Checked = false; - // 丢弃低质量的cf节点 - string DropBadCFNodes = 读取config字符串(config, "drop-bad-cf-nodes"); - if (DropBadCFNodes != null && DropBadCFNodes == "true") checkBoxDropBadCFNodes.Checked = true; - else checkBoxDropBadCFNodes.Checked = false; + // 从控件读取最终并发数(确保不会访问 Nullable.Value) + int alive = (int)numericUpDownPipeAlive.Value; + int speed = (int)numericUpDownPipeSpeed.Value; + int media = (int)numericUpDownPipeMedia.Value; + // 决定是否启用高并发:只要显式开启 或 drop/enhance 为 true 或 三阶段并发均 > 0 + bool needHighConcurrent = enableHighConcurrentFlag + || dropBadCFFlag + || enhanceTagFlag + || (alive > 0 && speed > 0 && media > 0); + + checkBoxHighConcurrent.Checked = needHighConcurrent; string switchX64 = 读取config字符串(config, "switch-x64"); if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; @@ -345,7 +385,7 @@ private async void ReadConfig()//读取配置文件 if (timeoutValue.HasValue) numericUpDown3.Value = timeoutValue.Value; int? minspeedValue = 读取config整数(config, "min-speed"); - if (minspeedValue.HasValue) numericUpDown4.Value = minspeedValue.Value; + if (minspeedValue.HasValue) numericUpDownMinSpeed.Value = minspeedValue.Value; int? downloadtimeoutValue = 读取config整数(config, "download-timeout"); if (downloadtimeoutValue.HasValue) numericUpDown5.Value = downloadtimeoutValue.Value; @@ -354,7 +394,7 @@ private async void ReadConfig()//读取配置文件 if (downloadLimitSizeValue.HasValue) numericUpDown9.Value = downloadLimitSizeValue.Value; int? downloadLimitSpeedValue = 读取config整数(config, "total-speed-limit"); - if (downloadLimitSpeedValue.HasValue) numericUpDown10.Value = downloadLimitSpeedValue.Value; + if (downloadLimitSpeedValue.HasValue) numericUpDownTotalBandwidthLimit.Value = downloadLimitSpeedValue.Value; string speedTestUrl = 读取config字符串(config, "speed-test-url"); if (speedTestUrl != null) @@ -363,13 +403,6 @@ private async void ReadConfig()//读取配置文件 comboBox2.Text = speedTestUrl; } - string savemethod = 读取config字符串(config, "save-method"); - if (savemethod != null) - { - if (savemethod == "local") comboBox1.Text = "本地"; - else comboBox1.Text = savemethod; - } - string listenport = 读取config字符串(config, "listen-port"); if (listenport != null) { @@ -518,13 +551,13 @@ private async void ReadConfig()//读取配置文件 if (totalspeedlimit.Value == 0) { checkBox6.Checked = false; - numericUpDown10.Enabled = false; + numericUpDownTotalBandwidthLimit.Enabled = false; } else { checkBox6.Checked = true; - numericUpDown10.Enabled = true; - numericUpDown10.Value = totalspeedlimit.Value; + numericUpDownTotalBandwidthLimit.Enabled = true; + numericUpDownTotalBandwidthLimit.Value = totalspeedlimit.Value; } } @@ -634,7 +667,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 var config = new Dictionary(); // 从UI控件获取值并添加到字典中 - config["concurrent"] = (int)numericUpDown1.Value; + config["concurrent"] = (int)numericUpDownConcurrent.Value; // 测活阶段并发数 @@ -650,10 +683,10 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["check-interval"] = (int)numericUpDown2.Value; if (textBoxCron.Visible) config["cron-expression"] = textBoxCron.Text; config["timeout"] = (int)numericUpDown3.Value; - config["min-speed"] = (int)numericUpDown4.Value; + config["min-speed"] = (int)numericUpDownMinSpeed.Value; config["download-timeout"] = (int)numericUpDown5.Value; config["download-mb"] = (int)numericUpDown9.Value; - config["total-speed-limit"] = (int)numericUpDown10.Value; + config["total-speed-limit"] = (int)numericUpDownTotalBandwidthLimit.Value; if (!string.IsNullOrEmpty(comboBox2.Text)) config["speed-test-url"] = comboBox2.Text; @@ -801,7 +834,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 else config["success-limit"] = 0; //下载速度限制,为0代表不限制 - if (checkBox6.Checked) config["total-speed-limit"] = (int)numericUpDown10.Value; + if (checkBox6.Checked) config["total-speed-limit"] = (int)numericUpDownTotalBandwidthLimit.Value; else config["total-speed-limit"] = 0; // 使用YamlDotNet序列化配置 @@ -937,15 +970,15 @@ private async void button1_Click(object sender, EventArgs e) button3.Enabled = File.Exists(allyamlFilePath); } - numericUpDown1.Enabled = false; + numericUpDownConcurrent.Enabled = false; numericUpDown2.Enabled = false; labelCron.Enabled = false; textBoxCron.Enabled = false; numericUpDown3.Enabled = false; - numericUpDown4.Enabled = false; + numericUpDownMinSpeed.Enabled = false; numericUpDown5.Enabled = false; numericUpDown9.Enabled = false; - numericUpDown10.Enabled = false; + numericUpDownTotalBandwidthLimit.Enabled = false; numericUpDown6.Enabled = false; numericUpDown7.Enabled = false; @@ -997,15 +1030,15 @@ private async void button1_Click(object sender, EventArgs e) await KillNodeProcessAsync(); if (checkBox4.Checked) ReadConfig(); button3.Enabled = false; - numericUpDown1.Enabled = true; + numericUpDownConcurrent.Enabled = true; numericUpDown2.Enabled = true; labelCron.Enabled = true; textBoxCron.Enabled = true; numericUpDown3.Enabled = true; - numericUpDown4.Enabled = true; + numericUpDownMinSpeed.Enabled = true; numericUpDown5.Enabled = true; numericUpDown9.Enabled = true; - numericUpDown10.Enabled = true; + numericUpDownTotalBandwidthLimit.Enabled = true; numericUpDown6.Enabled = true; numericUpDown7.Enabled = true; @@ -1029,7 +1062,7 @@ private async void button1_Click(object sender, EventArgs e) if (downloading == 0) button1.Enabled = true; } - private async Task DownloadSubsCheckEXE() + public async Task DownloadSubsCheckEXE() { button1.Enabled = false; downloading = 1; @@ -1758,13 +1791,13 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) stopMenuItem.Enabled = false; // 重新启用控件 - numericUpDown1.Enabled = true; + numericUpDownConcurrent.Enabled = true; numericUpDown2.Enabled = true; numericUpDown3.Enabled = true; - numericUpDown4.Enabled = true; + numericUpDownMinSpeed.Enabled = true; numericUpDown5.Enabled = true; numericUpDown9.Enabled = true; - numericUpDown10.Enabled = true; + numericUpDownTotalBandwidthLimit.Enabled = true; numericUpDown6.Enabled = true; textBox1.Enabled = true; groupBoxAdvanceSettings.Enabled = true; @@ -2500,13 +2533,13 @@ private async void timer3_Tick(object sender, EventArgs e) await KillNodeProcessAsync(); // 重新启动 subs-check.exe 程序 StartSubsCheckProcess(); - numericUpDown1.Enabled = false; + numericUpDownConcurrent.Enabled = false; numericUpDown2.Enabled = false; numericUpDown3.Enabled = false; - numericUpDown4.Enabled = false; + numericUpDownMinSpeed.Enabled = false; numericUpDown5.Enabled = false; numericUpDown9.Enabled = false; - numericUpDown10.Enabled = false; + numericUpDownTotalBandwidthLimit.Enabled = false; numericUpDown6.Enabled = false; numericUpDown7.Enabled = false; comboBox1.Enabled = false; @@ -2531,6 +2564,10 @@ private void button4_Click(object sender, EventArgs e) checkUpdatesForm.当前subsCheck版本号 = 当前subsCheck版本号; checkUpdatesForm.当前GUI版本号 = 当前GUI版本号; checkUpdatesForm.最新GUI版本号 = 最新GUI版本号; + checkUpdatesForm.EnableHighConcurrent = checkBoxHighConcurrent.Checked; + checkUpdatesForm.EnableArch64 = checkBoxSwitchArch64.Checked; + + // 为 CheckUpdates 的 button2 添加点击事件处理程序 checkUpdatesForm.FormClosed += (s, args) => @@ -2558,8 +2595,8 @@ private void checkBox3_CheckedChanged(object sender, EventArgs e) private void checkBox6_CheckedChanged(object sender, EventArgs e) { - if (checkBox6.Checked) numericUpDown10.Enabled = true; - else numericUpDown10.Enabled = false; + if (checkBox6.Checked) numericUpDownTotalBandwidthLimit.Enabled = true; + else numericUpDownTotalBandwidthLimit.Enabled = false; } private async void comboBox5_SelectedIndexChanged(object sender, EventArgs e) @@ -2685,7 +2722,7 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) private void numericUpDown1_ValueChanged(object sender, EventArgs e) { - if (numericUpDown1.Value > 128) + if (numericUpDownConcurrent.Value > 128) { string warningMessage = "⚠️ 高并发风险提醒 ⚠️\n\n" + @@ -3495,7 +3532,7 @@ private void richTextBox1_DoubleClick(object sender, EventArgs e) private void numericUpDown4_ValueChanged(object sender, EventArgs e) { - if (numericUpDown4.Value > 4096) + if (numericUpDownMinSpeed.Value > 4096) { string warningMessage = "⚠️ 测速下限设置提醒 ⚠️\n\n" + @@ -3531,7 +3568,7 @@ private void numericUpDown3_ValueChanged(object sender, EventArgs e) } // 获取 githubproxy 地址 - private async Task GetGithubProxyUrlAsync() + public async Task GetGithubProxyUrlAsync() { const string AUTO = "自动选择"; if (comboBox3 == null) return githubProxyURL; @@ -3616,6 +3653,7 @@ private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs if (currentArch != want) { checkBoxSwitchArch64.Enabled = false; + githubProxyURL = await GetGithubProxyUrlAsync(); Log(useX64 ? "切换为 x64 内核,内存占用更高,但CPU占用可能较低" : "切换为 i386 内核,内存占用更低,但CPU占用可能更高"); await DownloadSubsCheckEXE(); currentArch = want; @@ -3624,55 +3662,160 @@ private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs Log(useX64 ? "使用64位内核,如内存占用较高,可在[高级设置]切换" : "使用32位内核,如CPU占用较高,可在[高级设置]切换"); } - private void switchPipeAutoConcurrent() + // 计算一个推荐并发参数 + private (int alive, int speed, int media) CalcSimpleConcurrent() { - if (numericUpDownPipeAlive.Value <= 0 || numericUpDownPipeSpeed.Value <= 0 || numericUpDownPipeMedia.Value <= 0) + int baseVal = (int)numericUpDownConcurrent.Value; + int aliveConc = baseVal * 4; + int speedConc = baseVal; + int mediaConc = baseVal * 2; + + // alive 最小为 200 + aliveConc = Math.Max(aliveConc, 200); + // media 最大为 100 + mediaConc = Math.Min(mediaConc, 100); + + // 处理总带宽限制与最小速度 + double totalBw = (double)numericUpDownTotalBandwidthLimit.Value; // 用户设定的总带宽(单位与逻辑由你定义) + double minSpeed = (double)numericUpDownMinSpeed.Value; // 单个连接的最小速度 + + if (totalBw <= 0) + { + // 无带宽限制时,给 speed 一个保守上限 + speedConc = Math.Min(speedConc, 32); + } + else if (minSpeed > 0) { - numericUpDownPipeAlive.Enabled = false; - numericUpDownPipeSpeed.Enabled = false; - numericUpDownPipeMedia.Enabled = false; - numericUpDownPipeAlive.Value = 0; - numericUpDownPipeSpeed.Value = 0; - numericUpDownPipeMedia.Value = 0; - checkBoxPipeAuto.Checked = true; + // 估算在 minSpeed 情况下能支持的最大并发数(向下取整) + int estimated = (int)Math.Floor(totalBw / minSpeed); + estimated = Math.Max(1, estimated); // 至少为 1 + speedConc = Math.Max(speedConc, estimated); // 把 speedConc 限制到估算值 } else { - numericUpDownPipeAlive.Enabled = true; - numericUpDownPipeSpeed.Enabled = true; - numericUpDownPipeMedia.Enabled = true; - checkBoxPipeAuto.Checked = false; + speedConc = Math.Min(speedConc, 32); + } + + speedConc = Math.Max(1, speedConc); + + return (aliveConc, speedConc, mediaConc); + } + + // 类成员:唯一的程序化修改旗标(防重入/防循环) + private bool _inProgrammaticChange = false; + + // 安全写入 NumericUpDown(避免超出 Min/Max 导致异常) + private void SetNumericUpDownValueSafe(NumericUpDown ctrl, int value) + { + if (ctrl == null) return; + int min = (int)ctrl.Minimum; + int max = (int)ctrl.Maximum; + if (value < min) value = min; + if (value > max) value = max; + if ((decimal)value != ctrl.Value) // 只有值变化时才赋值,减少不必要触发 + ctrl.Value = (decimal)value; + } + + // switchPipeAutoConcurrent:根据当前 numericUpDown 的值决定是否为自动模式 + private void switchPipeAutoConcurrent() + { + // 计算是否进入自动模式(任一为 0 则自动) + bool anyZero = (int)numericUpDownPipeAlive.Value <= 0 + || (int)numericUpDownPipeSpeed.Value <= 0 + || (int)numericUpDownPipeMedia.Value <= 0; + + // 在程序化修改期间抑制事件响应 + _inProgrammaticChange = true; + try + { + if (anyZero) + { + // 进入自适应:禁用控件并把值统一为 0(只在必要时写入) + numericUpDownPipeAlive.Enabled = false; + numericUpDownPipeSpeed.Enabled = false; + numericUpDownPipeMedia.Enabled = false; + + SetNumericUpDownValueSafe(numericUpDownPipeAlive, 0); + SetNumericUpDownValueSafe(numericUpDownPipeSpeed, 0); + SetNumericUpDownValueSafe(numericUpDownPipeMedia, 0); + + if (!checkBoxPipeAuto.Checked) checkBoxPipeAuto.Checked = true; // 程序化设置 + } + else + { + // 退出自适应:启用控件,但不要覆盖用户已经设置的数值 + numericUpDownPipeAlive.Enabled = true; + numericUpDownPipeSpeed.Enabled = true; + numericUpDownPipeMedia.Enabled = true; + + if (checkBoxPipeAuto.Checked) checkBoxPipeAuto.Checked = false; // 程序化设置 + } + } + finally + { + _inProgrammaticChange = false; } } - //定义 “自适应” 按钮选中事件 + // checkBoxPipeAuto_CheckedChanged:用户点击或程序化修改都会走这里,使用 guard 来区分 private void checkBoxPipeAuto_CheckedChanged(object sender, EventArgs e) { - if (checkBoxPipeAuto.Checked) + if (_inProgrammaticChange) return; // 如果是程序化触发,直接忽略 + + _inProgrammaticChange = true; + try { - numericUpDownPipeAlive.Enabled = false; - numericUpDownPipeSpeed.Enabled = false; - numericUpDownPipeMedia.Enabled = false; + if (checkBoxPipeAuto.Checked) + { + // 切到自适应:禁用并清零 + numericUpDownPipeAlive.Enabled = false; + numericUpDownPipeSpeed.Enabled = false; + numericUpDownPipeMedia.Enabled = false; + + SetNumericUpDownValueSafe(numericUpDownPipeAlive, 0); + SetNumericUpDownValueSafe(numericUpDownPipeSpeed, 0); + SetNumericUpDownValueSafe(numericUpDownPipeMedia, 0); + Log("并发检测模式: 自适应分段流水线(内核自带衰减算法)"); + } + else + { + // 退出自适应:启用并使用推荐值(推荐值从函数获得) + numericUpDownPipeAlive.Enabled = true; + numericUpDownPipeSpeed.Enabled = true; + numericUpDownPipeMedia.Enabled = true; + + var (alive, speed, media) = CalcSimpleConcurrent(); + + SetNumericUpDownValueSafe(numericUpDownPipeAlive, alive); + SetNumericUpDownValueSafe(numericUpDownPipeSpeed, speed); + SetNumericUpDownValueSafe(numericUpDownPipeMedia, media); + Log($"默认并发参数: 测活: {alive}, 测速: {speed}, 流媒体: {media}"); + } } - else + finally { - numericUpDownPipeAlive.Enabled = true; - numericUpDownPipeSpeed.Enabled = true; - numericUpDownPipeMedia.Enabled = true; + _inProgrammaticChange = false; } } + // ValueChanged 事件:只有用户交互时才触发 switchPipeAutoConcurrent(guard 防止程序化导致二次处理) private void numericUpDownPipeAlive_ValueChanged(object sender, EventArgs e) { + if (_inProgrammaticChange) return; switchPipeAutoConcurrent(); + Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}"); } private void numericUpDownPipeSpeed_ValueChanged(object sender, EventArgs e) { + if (_inProgrammaticChange) return; switchPipeAutoConcurrent(); + Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}"); } private void numericUpDownPipeMedia_ValueChanged(object sender, EventArgs e) { + if (_inProgrammaticChange) return; switchPipeAutoConcurrent(); + Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}"); } } } \ No newline at end of file diff --git a/Form1.resx b/Form1.resx index 1589c0f..87066a8 100644 --- a/Form1.resx +++ b/Form1.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 228, 17 - - 320, 17 - 423, 17 From f9b9f272f6cce1b64c8a24e7a8749855db12575c Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 28 Aug 2025 23:04:45 +0800 Subject: [PATCH 16/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DsaveMethod=20gro?= =?UTF-8?q?up=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Form1.cs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Form1.cs b/Form1.cs index 94fac25..1206262 100644 --- a/Form1.cs +++ b/Form1.cs @@ -224,6 +224,11 @@ private async void timer1_Tick(object sender, EventArgs e)//初始化 comboBox4.Text = "通用订阅"; ReadConfig(); + if (checkBoxHighConcurrent.Checked) + { + groupBox4.Location = new Point(groupBox4.Location.X, groupBox4.Location.Y + groupBoxPipe.Height); + } + if (CheckCommandLineParameter("-auto")) { Log("检测到开机启动,准备执行任务..."); @@ -293,12 +298,6 @@ private async void ReadConfig()//读取配置文件 var deserializer = new YamlDotNet.Serialization.Deserializer(); var config = deserializer.Deserialize>(yamlContent); - string savemethod = 读取config字符串(config, "save-method"); - if (savemethod != null) - { - if (savemethod == "local") comboBox1.Text = "本地"; - else comboBox1.Text = savemethod; - } // 变量放在前面,以防后续读取时未定义 string subscheckArch = 读取config字符串(config, "subscheck-arch"); @@ -506,14 +505,22 @@ private async void ReadConfig()//读取配置文件 if (mediacheck != null && mediacheck == "true") checkBox2.Checked = true; else checkBox2.Checked = false; + string githubapimirror = 读取config字符串(config, "github-api-mirror"); + if (githubapimirror != null) textBox4.Text = githubapimirror; + + + string savemethod = 读取config字符串(config, "save-method"); + if (savemethod != null) + { + if (savemethod == "local") comboBox1.Text = "本地"; + else comboBox1.Text = savemethod; + } + string githubgistid = 读取config字符串(config, "github-gist-id"); if (githubgistid != null) textBox2.Text = githubgistid; string githubtoken = 读取config字符串(config, "github-token"); if (githubtoken != null) textBox3.Text = githubtoken; - string githubapimirror = 读取config字符串(config, "github-api-mirror"); - if (githubapimirror != null) textBox4.Text = githubapimirror; - string workerurl = 读取config字符串(config, "worker-url"); if (workerurl != null) textBox7.Text = workerurl; string workertoken = 读取config字符串(config, "worker-token"); From f5a28ad72748ac11fb378859095174e9bde9c372 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 29 Aug 2025 12:16:28 +0800 Subject: [PATCH 17/92] =?UTF-8?q?style:=20=E8=AF=AD=E4=B9=89=E5=8C=96?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CheckUpdates.cs | 2 +- Form1.Designer.cs => MainGui.Designer.cs | 1705 +++++++++++----------- Form1.cs => MainGui.cs | 640 ++++---- Form1.resx => MainGui.resx | 25 +- Program.cs | 2 +- subs-check.win.gui.csproj | 10 +- 6 files changed, 1188 insertions(+), 1196 deletions(-) rename Form1.Designer.cs => MainGui.Designer.cs (52%) rename Form1.cs => MainGui.cs (86%) rename Form1.resx => MainGui.resx (99%) diff --git a/CheckUpdates.cs b/CheckUpdates.cs index 50d31e8..84ab988 100644 --- a/CheckUpdates.cs +++ b/CheckUpdates.cs @@ -53,7 +53,7 @@ private async void timer1_Tick(object sender, EventArgs e) label5.Text = 当前subsCheck版本号; - Form1 mainForm = new Form1(); + MainGui mainForm = new MainGui(); githubProxyURL = await mainForm.GetGithubProxyUrlAsync(); diff --git a/Form1.Designer.cs b/MainGui.Designer.cs similarity index 52% rename from Form1.Designer.cs rename to MainGui.Designer.cs index bb3145e..1ed5fd5 100644 --- a/Form1.Designer.cs +++ b/MainGui.Designer.cs @@ -1,6 +1,6 @@ namespace subs_check.win.gui { - partial class Form1 + partial class MainGui { /// /// 必需的设计器变量。 @@ -29,67 +29,66 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainGui)); this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.textBoxCron = new System.Windows.Forms.TextBox(); - this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.timerinitial = new System.Windows.Forms.Timer(this.components); + this.groupBoxComonSettings = new System.Windows.Forms.GroupBox(); + this.labelConcurrent = new System.Windows.Forms.Label(); + this.numericUpDownConcurrent = new System.Windows.Forms.NumericUpDown(); + this.labelInterval = new System.Windows.Forms.Label(); + this.numericUpDownInterval = new System.Windows.Forms.NumericUpDown(); this.checkBoxHighConcurrent = new System.Windows.Forms.CheckBox(); this.checkBoxSwitchArch64 = new System.Windows.Forms.CheckBox(); - this.button7 = new System.Windows.Forms.Button(); - this.button6 = new System.Windows.Forms.Button(); - this.comboBox4 = new System.Windows.Forms.ComboBox(); - this.button3 = new System.Windows.Forms.Button(); - this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.buttonTriggerCheck = new System.Windows.Forms.Button(); + this.buttonWebUi = new System.Windows.Forms.Button(); + this.comboBoxSubscriptionType = new System.Windows.Forms.ComboBox(); + this.checkBoxStartup = new System.Windows.Forms.CheckBox(); + this.buttonCopySubscriptionUrl = new System.Windows.Forms.Button(); + this.comboBoxSaveMethod = new System.Windows.Forms.ComboBox(); + this.labelTimeout = new System.Windows.Forms.Label(); this.numericUpDownMinSpeed = new System.Windows.Forms.NumericUpDown(); - this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); - this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownConcurrent = new System.Windows.Forms.NumericUpDown(); - this.label7 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); + this.numericUpDownTimeout = new System.Windows.Forms.NumericUpDown(); + this.labelSaveMethod = new System.Windows.Forms.Label(); + this.labelMinSpped = new System.Windows.Forms.Label(); + this.textBoxCron = new System.Windows.Forms.TextBox(); this.labelCron = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); this.buttonAdvanceSettings = new System.Windows.Forms.Button(); - this.button1 = new System.Windows.Forms.Button(); - this.label8 = new System.Windows.Forms.Label(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.numericUpDown6 = new System.Windows.Forms.NumericUpDown(); - this.numericUpDown5 = new System.Windows.Forms.NumericUpDown(); - this.label4 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.numericUpDown7 = new System.Windows.Forms.NumericUpDown(); - this.label20 = new System.Windows.Forms.Label(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.linkLabel1 = new System.Windows.Forms.LinkLabel(); - this.button5 = new System.Windows.Forms.Button(); - this.richTextBox1 = new System.Windows.Forms.RichTextBox(); - this.LogLabelNodeInfo = new System.Windows.Forms.Label(); + this.buttonStartCheck = new System.Windows.Forms.Button(); + this.labelSubUrls = new System.Windows.Forms.Label(); + this.textBoxSubsUrls = new System.Windows.Forms.TextBox(); + this.numericUpDownWebUIPort = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownDLTimehot = new System.Windows.Forms.NumericUpDown(); + this.labelWebUIPort = new System.Windows.Forms.Label(); + this.labelDownloadTimeout = new System.Windows.Forms.Label(); + this.numericUpDownSubStorePort = new System.Windows.Forms.NumericUpDown(); + this.labelSubstorePort = new System.Windows.Forms.Label(); + this.groupBoxLog = new System.Windows.Forms.GroupBox(); + this.linkLabelAbout = new System.Windows.Forms.LinkLabel(); + this.buttonUpdateKernel = new System.Windows.Forms.Button(); + this.richTextBoxAllLog = new System.Windows.Forms.RichTextBox(); + this.labelLogNodeInfo = new System.Windows.Forms.Label(); this.groupBoxAdvanceSettings = new System.Windows.Forms.GroupBox(); this.numericUpDownTotalBandwidthLimit = new System.Windows.Forms.NumericUpDown(); - this.checkBox6 = new System.Windows.Forms.CheckBox(); - this.label22 = new System.Windows.Forms.Label(); - this.label21 = new System.Windows.Forms.Label(); - this.numericUpDown9 = new System.Windows.Forms.NumericUpDown(); - this.button8 = new System.Windows.Forms.Button(); - this.textBox10 = new System.Windows.Forms.TextBox(); - this.checkBox4 = new System.Windows.Forms.CheckBox(); - this.numericUpDown8 = new System.Windows.Forms.NumericUpDown(); - this.checkBox3 = new System.Windows.Forms.CheckBox(); - this.button4 = new System.Windows.Forms.Button(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); - this.checkBox2 = new System.Windows.Forms.CheckBox(); - this.comboBox5 = new System.Windows.Forms.ComboBox(); - this.label19 = new System.Windows.Forms.Label(); - this.comboBox3 = new System.Windows.Forms.ComboBox(); - this.label10 = new System.Windows.Forms.Label(); - this.comboBox2 = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.timer2 = new System.Windows.Forms.Timer(this.components); - this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.checkBoxTotalBandwidthLimit = new System.Windows.Forms.CheckBox(); + this.labelDownloadMb = new System.Windows.Forms.Label(); + this.numericUpDownDownloadMb = new System.Windows.Forms.NumericUpDown(); + this.buttonMoreSettings = new System.Windows.Forms.Button(); + this.textBoxWebUiAPIKey = new System.Windows.Forms.TextBox(); + this.checkBoxEnableWebUI = new System.Windows.Forms.CheckBox(); + this.numericUpDownSuccessLimit = new System.Windows.Forms.NumericUpDown(); + this.checkBoxEnableSuccessLimit = new System.Windows.Forms.CheckBox(); + this.buttonCheckUpdate = new System.Windows.Forms.Button(); + this.checkBoxEnableRenameNode = new System.Windows.Forms.CheckBox(); + this.checkBoxEnableMediaCheck = new System.Windows.Forms.CheckBox(); + this.comboBoxOverwriteUrls = new System.Windows.Forms.ComboBox(); + this.labelOverwriteUrls = new System.Windows.Forms.Label(); + this.comboBoxGithubProxyUrl = new System.Windows.Forms.ComboBox(); + this.labelGithubProxyUrl = new System.Windows.Forms.Label(); + this.comboBoxSpeedtestUrl = new System.Windows.Forms.ComboBox(); + this.labelSpeedtestUrl = new System.Windows.Forms.Label(); + this.progressBarAll = new System.Windows.Forms.ProgressBar(); + this.timerCopySubscriptionUrl = new System.Windows.Forms.Timer(this.components); + this.groupBoxGist = new System.Windows.Forms.GroupBox(); this.textBox4 = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.textBox3 = new System.Windows.Forms.TextBox(); @@ -97,21 +96,21 @@ private void InitializeComponent() this.textBox2 = new System.Windows.Forms.TextBox(); this.label11 = new System.Windows.Forms.Label(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.groupBoxR2 = new System.Windows.Forms.GroupBox(); this.textBox6 = new System.Windows.Forms.TextBox(); this.label15 = new System.Windows.Forms.Label(); this.textBox7 = new System.Windows.Forms.TextBox(); this.label16 = new System.Windows.Forms.Label(); - this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.groupBoxWebdav = new System.Windows.Forms.GroupBox(); this.textBox5 = new System.Windows.Forms.TextBox(); this.label14 = new System.Windows.Forms.Label(); this.textBox8 = new System.Windows.Forms.TextBox(); this.label17 = new System.Windows.Forms.Label(); this.textBox9 = new System.Windows.Forms.TextBox(); this.label18 = new System.Windows.Forms.Label(); - this.timer3 = new System.Windows.Forms.Timer(this.components); - this.timer4 = new System.Windows.Forms.Timer(this.components); - this.groupBoxPipe = new System.Windows.Forms.GroupBox(); + this.timerRestartSchedule = new System.Windows.Forms.Timer(this.components); + this.timerRefresh = new System.Windows.Forms.Timer(this.components); + this.groupBoxPipeConcurrent = new System.Windows.Forms.GroupBox(); this.numericUpDownPipeMedia = new System.Windows.Forms.NumericUpDown(); this.labelPipeMedia = new System.Windows.Forms.Label(); this.numericUpDownPipeSpeed = new System.Windows.Forms.NumericUpDown(); @@ -122,23 +121,23 @@ private void InitializeComponent() this.groupBoxEnhance = new System.Windows.Forms.GroupBox(); this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); - this.groupBox1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + this.groupBoxComonSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit(); - this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWebUIPort)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDLTimehot)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubStorePort)).BeginInit(); + this.groupBoxLog.SuspendLayout(); this.groupBoxAdvanceSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalBandwidthLimit)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).BeginInit(); - this.groupBox4.SuspendLayout(); - this.groupBox5.SuspendLayout(); - this.groupBox6.SuspendLayout(); - this.groupBoxPipe.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDownloadMb)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSuccessLimit)).BeginInit(); + this.groupBoxGist.SuspendLayout(); + this.groupBoxR2.SuspendLayout(); + this.groupBoxWebdav.SuspendLayout(); + this.groupBoxPipeConcurrent.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeMedia)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeSpeed)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeAlive)).BeginInit(); @@ -153,70 +152,114 @@ private void InitializeComponent() this.notifyIcon1.Visible = true; this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseClick); // - // timer1 - // - this.timer1.Enabled = true; - this.timer1.Interval = 1; - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.textBoxCron); - this.groupBox1.Controls.Add(this.checkBox5); - this.groupBox1.Controls.Add(this.checkBoxHighConcurrent); - this.groupBox1.Controls.Add(this.checkBoxSwitchArch64); - this.groupBox1.Controls.Add(this.button7); - this.groupBox1.Controls.Add(this.button6); - this.groupBox1.Controls.Add(this.comboBox4); - this.groupBox1.Controls.Add(this.button3); - this.groupBox1.Controls.Add(this.comboBox1); - this.groupBox1.Controls.Add(this.numericUpDownMinSpeed); - this.groupBox1.Controls.Add(this.numericUpDown3); - this.groupBox1.Controls.Add(this.numericUpDown2); - this.groupBox1.Controls.Add(this.numericUpDownConcurrent); - this.groupBox1.Controls.Add(this.label7); - this.groupBox1.Controls.Add(this.label6); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.labelCron); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Controls.Add(this.buttonAdvanceSettings); - this.groupBox1.Controls.Add(this.button1); - this.groupBox1.Controls.Add(this.label8); - this.groupBox1.Controls.Add(this.textBox1); - this.groupBox1.Location = new System.Drawing.Point(24, 23); - this.groupBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox1.Size = new System.Drawing.Size(319, 847); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "参数设置"; + // timerinitial + // + this.timerinitial.Enabled = true; + this.timerinitial.Interval = 1; + this.timerinitial.Tick += new System.EventHandler(this.timer1_Tick); + // + // groupBoxComonSettings + // + this.groupBoxComonSettings.Controls.Add(this.labelConcurrent); + this.groupBoxComonSettings.Controls.Add(this.numericUpDownConcurrent); + this.groupBoxComonSettings.Controls.Add(this.labelInterval); + this.groupBoxComonSettings.Controls.Add(this.numericUpDownInterval); + this.groupBoxComonSettings.Controls.Add(this.labelTimeout); + this.groupBoxComonSettings.Controls.Add(this.numericUpDownTimeout); + this.groupBoxComonSettings.Controls.Add(this.labelMinSpped); + this.groupBoxComonSettings.Controls.Add(this.numericUpDownMinSpeed); + this.groupBoxComonSettings.Controls.Add(this.labelSaveMethod); + this.groupBoxComonSettings.Controls.Add(this.comboBoxSaveMethod); + this.groupBoxComonSettings.Controls.Add(this.checkBoxHighConcurrent); + this.groupBoxComonSettings.Controls.Add(this.checkBoxSwitchArch64); + this.groupBoxComonSettings.Controls.Add(this.comboBoxSubscriptionType); + this.groupBoxComonSettings.Controls.Add(this.buttonCopySubscriptionUrl); + this.groupBoxComonSettings.Controls.Add(this.buttonTriggerCheck); + this.groupBoxComonSettings.Controls.Add(this.buttonWebUi); + this.groupBoxComonSettings.Controls.Add(this.checkBoxStartup); + this.groupBoxComonSettings.Controls.Add(this.textBoxCron); + this.groupBoxComonSettings.Controls.Add(this.labelCron); + this.groupBoxComonSettings.Controls.Add(this.labelSubUrls); + this.groupBoxComonSettings.Controls.Add(this.textBoxSubsUrls); + this.groupBoxComonSettings.Controls.Add(this.buttonStartCheck); + this.groupBoxComonSettings.Controls.Add(this.buttonAdvanceSettings); + this.groupBoxComonSettings.Location = new System.Drawing.Point(24, 23); + this.groupBoxComonSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxComonSettings.Name = "groupBoxComonSettings"; + this.groupBoxComonSettings.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxComonSettings.Size = new System.Drawing.Size(319, 847); + this.groupBoxComonSettings.TabIndex = 0; + this.groupBoxComonSettings.TabStop = false; + this.groupBoxComonSettings.Text = "参数设置"; + // + // labelConcurrent + // + this.labelConcurrent.AutoSize = true; + this.labelConcurrent.Location = new System.Drawing.Point(13, 37); + this.labelConcurrent.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelConcurrent.Name = "labelConcurrent"; + this.labelConcurrent.Size = new System.Drawing.Size(136, 21); + this.labelConcurrent.TabIndex = 2; + this.labelConcurrent.Text = "并发线程数:"; // - // textBoxCron + // numericUpDownConcurrent // - this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxCron.Location = new System.Drawing.Point(79, 562); - this.textBoxCron.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.textBoxCron.Name = "textBoxCron"; - this.textBoxCron.Size = new System.Drawing.Size(219, 31); - this.textBoxCron.TabIndex = 21; - this.textBoxCron.Text = "0 */2 * * *"; - this.textBoxCron.Visible = false; - this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); - this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); + this.numericUpDownConcurrent.Location = new System.Drawing.Point(192, 33); + this.numericUpDownConcurrent.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownConcurrent.Maximum = new decimal(new int[] { + 1024, + 0, + 0, + 0}); + this.numericUpDownConcurrent.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownConcurrent.Name = "numericUpDownConcurrent"; + this.numericUpDownConcurrent.Size = new System.Drawing.Size(106, 31); + this.numericUpDownConcurrent.TabIndex = 10; + this.numericUpDownConcurrent.Value = new decimal(new int[] { + 32, + 0, + 0, + 0}); + this.numericUpDownConcurrent.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged); + // + // labelInterval // - // checkBox5 + this.labelInterval.AutoSize = true; + this.labelInterval.Location = new System.Drawing.Point(13, 88); + this.labelInterval.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelInterval.Name = "labelInterval"; + this.labelInterval.Size = new System.Drawing.Size(179, 21); + this.labelInterval.TabIndex = 3; + this.labelInterval.Text = "检查间隔(分钟):"; + this.labelInterval.DoubleClick += new System.EventHandler(this.切换cron表达式); // - this.checkBox5.AutoSize = true; - this.checkBox5.Location = new System.Drawing.Point(167, 749); - this.checkBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox5.Name = "checkBox5"; - this.checkBox5.Size = new System.Drawing.Size(120, 25); - this.checkBox5.TabIndex = 30; - this.checkBox5.Text = "开机自启"; - this.checkBox5.UseVisualStyleBackColor = true; - this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); + // numericUpDownInterval + // + this.numericUpDownInterval.Location = new System.Drawing.Point(192, 84); + this.numericUpDownInterval.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownInterval.Maximum = new decimal(new int[] { + 1440, + 0, + 0, + 0}); + this.numericUpDownInterval.Minimum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.numericUpDownInterval.Name = "numericUpDownInterval"; + this.numericUpDownInterval.Size = new System.Drawing.Size(106, 31); + this.numericUpDownInterval.TabIndex = 11; + this.numericUpDownInterval.Value = new decimal(new int[] { + 120, + 0, + 0, + 0}); + this.numericUpDownInterval.DoubleClick += new System.EventHandler(this.切换cron表达式); // // checkBoxHighConcurrent // @@ -240,70 +283,92 @@ private void InitializeComponent() this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.checkBoxSwitchArch64_CheckedChanged); // - // button7 - // - this.button7.Enabled = false; - this.button7.Location = new System.Drawing.Point(13, 698); - this.button7.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button7.Name = "button7"; - this.button7.Size = new System.Drawing.Size(138, 40); - this.button7.TabIndex = 30; - this.button7.Text = "🔀未启动"; - this.button7.UseVisualStyleBackColor = true; - this.button7.Click += new System.EventHandler(this.button7_Click); - // - // button6 - // - this.button6.Enabled = false; - this.button6.Location = new System.Drawing.Point(161, 698); - this.button6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button6.Name = "button6"; - this.button6.Size = new System.Drawing.Size(138, 40); - this.button6.TabIndex = 29; - this.button6.Text = "访问WebUI"; - this.button6.UseVisualStyleBackColor = true; - this.button6.Click += new System.EventHandler(this.button6_Click); - // - // comboBox4 - // - this.comboBox4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBox4.FormattingEnabled = true; - this.comboBox4.Items.AddRange(new object[] { + // buttonTriggerCheck + // + this.buttonTriggerCheck.Enabled = false; + this.buttonTriggerCheck.Location = new System.Drawing.Point(13, 698); + this.buttonTriggerCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonTriggerCheck.Name = "buttonTriggerCheck"; + this.buttonTriggerCheck.Size = new System.Drawing.Size(138, 40); + this.buttonTriggerCheck.TabIndex = 30; + this.buttonTriggerCheck.Text = "🔀未启动"; + this.buttonTriggerCheck.UseVisualStyleBackColor = true; + this.buttonTriggerCheck.Click += new System.EventHandler(this.button7_Click); + // + // buttonWebUi + // + this.buttonWebUi.Enabled = false; + this.buttonWebUi.Location = new System.Drawing.Point(161, 698); + this.buttonWebUi.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonWebUi.Name = "buttonWebUi"; + this.buttonWebUi.Size = new System.Drawing.Size(138, 40); + this.buttonWebUi.TabIndex = 29; + this.buttonWebUi.Text = "访问WebUI"; + this.buttonWebUi.UseVisualStyleBackColor = true; + this.buttonWebUi.Click += new System.EventHandler(this.button6_Click); + // + // comboBoxSubscriptionType + // + this.comboBoxSubscriptionType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubscriptionType.FormattingEnabled = true; + this.comboBoxSubscriptionType.Items.AddRange(new object[] { "通用订阅", "Clash"}); - this.comboBox4.Location = new System.Drawing.Point(15, 651); - this.comboBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBox4.Name = "comboBox4"; - this.comboBox4.Size = new System.Drawing.Size(132, 29); - this.comboBox4.TabIndex = 19; - // - // button3 - // - this.button3.Enabled = false; - this.button3.Location = new System.Drawing.Point(161, 648); - this.button3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(138, 40); - this.button3.TabIndex = 18; - this.button3.Text = "复制订阅"; - this.button3.UseVisualStyleBackColor = true; - this.button3.Click += new System.EventHandler(this.button3_Click); - // - // comboBox1 - // - this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBox1.FormattingEnabled = true; - this.comboBox1.Items.AddRange(new object[] { + this.comboBoxSubscriptionType.Location = new System.Drawing.Point(15, 651); + this.comboBoxSubscriptionType.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSubscriptionType.Name = "comboBoxSubscriptionType"; + this.comboBoxSubscriptionType.Size = new System.Drawing.Size(132, 29); + this.comboBoxSubscriptionType.TabIndex = 19; + // + // checkBoxStartup + // + this.checkBoxStartup.AutoSize = true; + this.checkBoxStartup.Location = new System.Drawing.Point(167, 749); + this.checkBoxStartup.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxStartup.Name = "checkBoxStartup"; + this.checkBoxStartup.Size = new System.Drawing.Size(120, 25); + this.checkBoxStartup.TabIndex = 30; + this.checkBoxStartup.Text = "开机自启"; + this.checkBoxStartup.UseVisualStyleBackColor = true; + this.checkBoxStartup.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); + // + // buttonCopySubscriptionUrl + // + this.buttonCopySubscriptionUrl.Enabled = false; + this.buttonCopySubscriptionUrl.Location = new System.Drawing.Point(161, 648); + this.buttonCopySubscriptionUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonCopySubscriptionUrl.Name = "buttonCopySubscriptionUrl"; + this.buttonCopySubscriptionUrl.Size = new System.Drawing.Size(138, 40); + this.buttonCopySubscriptionUrl.TabIndex = 18; + this.buttonCopySubscriptionUrl.Text = "复制订阅"; + this.buttonCopySubscriptionUrl.UseVisualStyleBackColor = true; + this.buttonCopySubscriptionUrl.Click += new System.EventHandler(this.button3_Click); + // + // comboBoxSaveMethod + // + this.comboBoxSaveMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSaveMethod.FormattingEnabled = true; + this.comboBoxSaveMethod.Items.AddRange(new object[] { "本地", "gist", "r2", "webdav"}); - this.comboBox1.Location = new System.Drawing.Point(192, 236); - this.comboBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(103, 29); - this.comboBox1.TabIndex = 16; - this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 236); + this.comboBoxSaveMethod.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; + this.comboBoxSaveMethod.Size = new System.Drawing.Size(103, 29); + this.comboBoxSaveMethod.TabIndex = 16; + this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + // + // labelTimeout + // + this.labelTimeout.AutoSize = true; + this.labelTimeout.Location = new System.Drawing.Point(13, 138); + this.labelTimeout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelTimeout.Name = "labelTimeout"; + this.labelTimeout.Size = new System.Drawing.Size(179, 21); + this.labelTimeout.TabIndex = 4; + this.labelTimeout.Text = "超时时间(毫秒):"; // // numericUpDownMinSpeed // @@ -329,118 +394,62 @@ private void InitializeComponent() 0}); this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDown4_ValueChanged); // - // numericUpDown3 + // numericUpDownTimeout // - this.numericUpDown3.Location = new System.Drawing.Point(192, 135); - this.numericUpDown3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown3.Maximum = new decimal(new int[] { + this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 135); + this.numericUpDownTimeout.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownTimeout.Maximum = new decimal(new int[] { 10000, 0, 0, 0}); - this.numericUpDown3.Minimum = new decimal(new int[] { + this.numericUpDownTimeout.Minimum = new decimal(new int[] { 1000, 0, 0, 0}); - this.numericUpDown3.Name = "numericUpDown3"; - this.numericUpDown3.Size = new System.Drawing.Size(106, 31); - this.numericUpDown3.TabIndex = 12; - this.numericUpDown3.Value = new decimal(new int[] { + this.numericUpDownTimeout.Name = "numericUpDownTimeout"; + this.numericUpDownTimeout.Size = new System.Drawing.Size(106, 31); + this.numericUpDownTimeout.TabIndex = 12; + this.numericUpDownTimeout.Value = new decimal(new int[] { 5000, 0, 0, 0}); - this.numericUpDown3.ValueChanged += new System.EventHandler(this.numericUpDown3_ValueChanged); + this.numericUpDownTimeout.ValueChanged += new System.EventHandler(this.numericUpDown3_ValueChanged); // - // numericUpDown2 + // labelSaveMethod // - this.numericUpDown2.Location = new System.Drawing.Point(192, 84); - this.numericUpDown2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown2.Maximum = new decimal(new int[] { - 1440, - 0, - 0, - 0}); - this.numericUpDown2.Minimum = new decimal(new int[] { - 30, - 0, - 0, - 0}); - this.numericUpDown2.Name = "numericUpDown2"; - this.numericUpDown2.Size = new System.Drawing.Size(106, 31); - this.numericUpDown2.TabIndex = 11; - this.numericUpDown2.Value = new decimal(new int[] { - 120, - 0, - 0, - 0}); - this.numericUpDown2.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.labelSaveMethod.AutoSize = true; + this.labelSaveMethod.Location = new System.Drawing.Point(13, 240); + this.labelSaveMethod.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelSaveMethod.Name = "labelSaveMethod"; + this.labelSaveMethod.Size = new System.Drawing.Size(115, 21); + this.labelSaveMethod.TabIndex = 8; + this.labelSaveMethod.Text = "保存方法:"; // - // numericUpDownConcurrent + // labelMinSpped // - this.numericUpDownConcurrent.Location = new System.Drawing.Point(192, 33); - this.numericUpDownConcurrent.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDownConcurrent.Maximum = new decimal(new int[] { - 1024, - 0, - 0, - 0}); - this.numericUpDownConcurrent.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownConcurrent.Name = "numericUpDownConcurrent"; - this.numericUpDownConcurrent.Size = new System.Drawing.Size(106, 31); - this.numericUpDownConcurrent.TabIndex = 10; - this.numericUpDownConcurrent.Value = new decimal(new int[] { - 32, - 0, - 0, - 0}); - this.numericUpDownConcurrent.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged); + this.labelMinSpped.AutoSize = true; + this.labelMinSpped.Location = new System.Drawing.Point(13, 189); + this.labelMinSpped.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelMinSpped.Name = "labelMinSpped"; + this.labelMinSpped.Size = new System.Drawing.Size(181, 21); + this.labelMinSpped.TabIndex = 5; + this.labelMinSpped.Text = "测速下限(KB/s):"; + // + // textBoxCron // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(13, 240); - this.label7.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(115, 21); - this.label7.TabIndex = 8; - this.label7.Text = "保存方法:"; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(13, 189); - this.label6.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(181, 21); - this.label6.TabIndex = 5; - this.label6.Text = "测速下限(KB/s):"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(13, 138); - this.label3.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(179, 21); - this.label3.TabIndex = 4; - this.label3.Text = "超时时间(毫秒):"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(13, 88); - this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(179, 21); - this.label2.TabIndex = 3; - this.label2.Text = "检查间隔(分钟):"; - this.label2.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxCron.Location = new System.Drawing.Point(79, 562); + this.textBoxCron.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxCron.Name = "textBoxCron"; + this.textBoxCron.Size = new System.Drawing.Size(219, 31); + this.textBoxCron.TabIndex = 21; + this.textBoxCron.Text = "0 */2 * * *"; + this.textBoxCron.Visible = false; + this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); // // labelCron // @@ -454,16 +463,6 @@ private void InitializeComponent() this.labelCron.Visible = false; this.labelCron.DoubleClick += new System.EventHandler(this.切换cron表达式); // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(13, 37); - this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(136, 21); - this.label1.TabIndex = 2; - this.label1.Text = "并发线程数:"; - // // buttonAdvanceSettings // this.buttonAdvanceSettings.Location = new System.Drawing.Point(161, 788); @@ -475,235 +474,234 @@ private void InitializeComponent() this.buttonAdvanceSettings.UseVisualStyleBackColor = true; this.buttonAdvanceSettings.Click += new System.EventHandler(this.button2_Click); // - // button1 - // - this.button1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.button1.Location = new System.Drawing.Point(13, 749); - this.button1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(138, 79); - this.button1.TabIndex = 0; - this.button1.Text = "▶️ 启动"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(13, 287); - this.label8.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(284, 21); - this.label8.TabIndex = 9; - this.label8.Text = "节点池订阅链接(点击编辑):"; - this.label8.Click += new System.EventHandler(this.textBox1_DoubleClick); - // - // textBox1 - // - this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBox1.Location = new System.Drawing.Point(16, 313); - this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.textBox1.Multiline = true; - this.textBox1.Name = "textBox1"; - this.textBox1.ReadOnly = true; - this.textBox1.Size = new System.Drawing.Size(281, 280); - this.textBox1.TabIndex = 17; - this.textBox1.Text = resources.GetString("textBox1.Text"); - this.textBox1.WordWrap = false; - this.textBox1.Click += new System.EventHandler(this.textBox1_DoubleClick); - this.textBox1.DoubleClick += new System.EventHandler(this.textBox1_DoubleClick); - // - // numericUpDown6 - // - this.numericUpDown6.Location = new System.Drawing.Point(515, 33); - this.numericUpDown6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown6.Maximum = new decimal(new int[] { + // buttonStartCheck + // + this.buttonStartCheck.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.buttonStartCheck.Location = new System.Drawing.Point(13, 749); + this.buttonStartCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonStartCheck.Name = "buttonStartCheck"; + this.buttonStartCheck.Size = new System.Drawing.Size(138, 79); + this.buttonStartCheck.TabIndex = 0; + this.buttonStartCheck.Text = "▶️ 启动"; + this.buttonStartCheck.UseVisualStyleBackColor = true; + this.buttonStartCheck.Click += new System.EventHandler(this.button1_Click); + // + // labelSubUrls + // + this.labelSubUrls.AutoSize = true; + this.labelSubUrls.Location = new System.Drawing.Point(13, 287); + this.labelSubUrls.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelSubUrls.Name = "labelSubUrls"; + this.labelSubUrls.Size = new System.Drawing.Size(284, 21); + this.labelSubUrls.TabIndex = 9; + this.labelSubUrls.Text = "节点池订阅链接(点击编辑):"; + this.labelSubUrls.Click += new System.EventHandler(this.textBox1_DoubleClick); + // + // textBoxSubsUrls + // + this.textBoxSubsUrls.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxSubsUrls.Location = new System.Drawing.Point(16, 313); + this.textBoxSubsUrls.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxSubsUrls.Multiline = true; + this.textBoxSubsUrls.Name = "textBoxSubsUrls"; + this.textBoxSubsUrls.ReadOnly = true; + this.textBoxSubsUrls.Size = new System.Drawing.Size(281, 280); + this.textBoxSubsUrls.TabIndex = 17; + this.textBoxSubsUrls.Text = resources.GetString("textBoxSubsUrls.Text"); + this.textBoxSubsUrls.WordWrap = false; + this.textBoxSubsUrls.Click += new System.EventHandler(this.textBox1_DoubleClick); + this.textBoxSubsUrls.DoubleClick += new System.EventHandler(this.textBox1_DoubleClick); + // + // numericUpDownWebUIPort + // + this.numericUpDownWebUIPort.Location = new System.Drawing.Point(515, 33); + this.numericUpDownWebUIPort.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownWebUIPort.Maximum = new decimal(new int[] { 65535, 0, 0, 0}); - this.numericUpDown6.Minimum = new decimal(new int[] { + this.numericUpDownWebUIPort.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown6.Name = "numericUpDown6"; - this.numericUpDown6.Size = new System.Drawing.Size(106, 31); - this.numericUpDown6.TabIndex = 15; - this.numericUpDown6.Value = new decimal(new int[] { + this.numericUpDownWebUIPort.Name = "numericUpDownWebUIPort"; + this.numericUpDownWebUIPort.Size = new System.Drawing.Size(106, 31); + this.numericUpDownWebUIPort.TabIndex = 15; + this.numericUpDownWebUIPort.Value = new decimal(new int[] { 8199, 0, 0, 0}); - this.numericUpDown6.ValueChanged += new System.EventHandler(this.numericUpDown6_ValueChanged); + this.numericUpDownWebUIPort.ValueChanged += new System.EventHandler(this.numericUpDown6_ValueChanged); // - // numericUpDown5 + // numericUpDownDLTimehot // - this.numericUpDown5.Location = new System.Drawing.Point(515, 78); - this.numericUpDown5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown5.Maximum = new decimal(new int[] { + this.numericUpDownDLTimehot.Location = new System.Drawing.Point(515, 78); + this.numericUpDownDLTimehot.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownDLTimehot.Maximum = new decimal(new int[] { 10, 0, 0, 0}); - this.numericUpDown5.Minimum = new decimal(new int[] { + this.numericUpDownDLTimehot.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown5.Name = "numericUpDown5"; - this.numericUpDown5.Size = new System.Drawing.Size(106, 31); - this.numericUpDown5.TabIndex = 14; - this.numericUpDown5.Value = new decimal(new int[] { + this.numericUpDownDLTimehot.Name = "numericUpDownDLTimehot"; + this.numericUpDownDLTimehot.Size = new System.Drawing.Size(106, 31); + this.numericUpDownDLTimehot.TabIndex = 14; + this.numericUpDownDLTimehot.Value = new decimal(new int[] { 10, 0, 0, 0}); // - // label4 + // labelWebUIPort // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(350, 37); - this.label4.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(159, 21); - this.label4.TabIndex = 7; - this.label4.Text = "HTTP服务端口:"; + this.labelWebUIPort.AutoSize = true; + this.labelWebUIPort.Location = new System.Drawing.Point(350, 37); + this.labelWebUIPort.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelWebUIPort.Name = "labelWebUIPort"; + this.labelWebUIPort.Size = new System.Drawing.Size(159, 21); + this.labelWebUIPort.TabIndex = 7; + this.labelWebUIPort.Text = "HTTP服务端口:"; // - // label5 + // labelDownloadTimeout // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(350, 83); - this.label5.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(158, 21); - this.label5.TabIndex = 6; - this.label5.Text = "测速时间(秒):"; + this.labelDownloadTimeout.AutoSize = true; + this.labelDownloadTimeout.Location = new System.Drawing.Point(350, 83); + this.labelDownloadTimeout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelDownloadTimeout.Name = "labelDownloadTimeout"; + this.labelDownloadTimeout.Size = new System.Drawing.Size(158, 21); + this.labelDownloadTimeout.TabIndex = 6; + this.labelDownloadTimeout.Text = "测速时间(秒):"; // - // numericUpDown7 + // numericUpDownSubStorePort // - this.numericUpDown7.Location = new System.Drawing.Point(808, 33); - this.numericUpDown7.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown7.Maximum = new decimal(new int[] { + this.numericUpDownSubStorePort.Location = new System.Drawing.Point(808, 33); + this.numericUpDownSubStorePort.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownSubStorePort.Maximum = new decimal(new int[] { 65535, 0, 0, 0}); - this.numericUpDown7.Minimum = new decimal(new int[] { + this.numericUpDownSubStorePort.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown7.Name = "numericUpDown7"; - this.numericUpDown7.Size = new System.Drawing.Size(106, 31); - this.numericUpDown7.TabIndex = 21; - this.numericUpDown7.Value = new decimal(new int[] { + this.numericUpDownSubStorePort.Name = "numericUpDownSubStorePort"; + this.numericUpDownSubStorePort.Size = new System.Drawing.Size(106, 31); + this.numericUpDownSubStorePort.TabIndex = 21; + this.numericUpDownSubStorePort.Value = new decimal(new int[] { 8299, 0, 0, 0}); - this.numericUpDown7.ValueChanged += new System.EventHandler(this.numericUpDown6_ValueChanged); - // - // label20 - // - this.label20.AutoSize = true; - this.label20.Location = new System.Drawing.Point(632, 37); - this.label20.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label20.Name = "label20"; - this.label20.Size = new System.Drawing.Size(172, 21); - this.label20.TabIndex = 20; - this.label20.Text = "Sub-Store端口:"; - // - // groupBox2 - // - this.groupBox2.CausesValidation = false; - this.groupBox2.Controls.Add(this.linkLabel1); - this.groupBox2.Controls.Add(this.button5); - this.groupBox2.Controls.Add(this.richTextBox1); - this.groupBox2.Controls.Add(this.LogLabelNodeInfo); - this.groupBox2.Location = new System.Drawing.Point(354, 23); - this.groupBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox2.Size = new System.Drawing.Size(1100, 847); - this.groupBox2.TabIndex = 1; - this.groupBox2.TabStop = false; - // - // linkLabel1 - // - this.linkLabel1.AutoSize = true; - this.linkLabel1.Location = new System.Drawing.Point(843, 4); - this.linkLabel1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(250, 21); - this.linkLabel1.TabIndex = 21; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "关于 SubsCheck Win GUI"; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); - // - // button5 - // - this.button5.Location = new System.Drawing.Point(956, 802); - this.button5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button5.Name = "button5"; - this.button5.Size = new System.Drawing.Size(138, 40); - this.button5.TabIndex = 20; - this.button5.Text = "更新内核"; - this.button5.UseVisualStyleBackColor = true; - this.button5.Visible = false; - this.button5.Click += new System.EventHandler(this.button5_Click); - // - // richTextBox1 - // - this.richTextBox1.BackColor = System.Drawing.Color.WhiteSmoke; - this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.richTextBox1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.richTextBox1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.richTextBox1.Location = new System.Drawing.Point(6, 29); - this.richTextBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.richTextBox1.Name = "richTextBox1"; - this.richTextBox1.ReadOnly = true; - this.richTextBox1.Size = new System.Drawing.Size(1088, 813); - this.richTextBox1.TabIndex = 0; - this.richTextBox1.Text = ""; - this.richTextBox1.DoubleClick += new System.EventHandler(this.richTextBox1_DoubleClick); - // - // LogLabelNodeInfo - // - this.LogLabelNodeInfo.AutoSize = true; - this.LogLabelNodeInfo.Location = new System.Drawing.Point(0, 0); - this.LogLabelNodeInfo.Name = "LogLabelNodeInfo"; - this.LogLabelNodeInfo.Size = new System.Drawing.Size(94, 21); - this.LogLabelNodeInfo.TabIndex = 22; - this.LogLabelNodeInfo.Text = "实时日志"; + this.numericUpDownSubStorePort.ValueChanged += new System.EventHandler(this.numericUpDown6_ValueChanged); + // + // labelSubstorePort + // + this.labelSubstorePort.AutoSize = true; + this.labelSubstorePort.Location = new System.Drawing.Point(632, 37); + this.labelSubstorePort.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelSubstorePort.Name = "labelSubstorePort"; + this.labelSubstorePort.Size = new System.Drawing.Size(172, 21); + this.labelSubstorePort.TabIndex = 20; + this.labelSubstorePort.Text = "Sub-Store端口:"; + // + // groupBoxLog + // + this.groupBoxLog.CausesValidation = false; + this.groupBoxLog.Controls.Add(this.linkLabelAbout); + this.groupBoxLog.Controls.Add(this.buttonUpdateKernel); + this.groupBoxLog.Controls.Add(this.richTextBoxAllLog); + this.groupBoxLog.Controls.Add(this.labelLogNodeInfo); + this.groupBoxLog.Location = new System.Drawing.Point(354, 23); + this.groupBoxLog.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxLog.Name = "groupBoxLog"; + this.groupBoxLog.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxLog.Size = new System.Drawing.Size(1100, 847); + this.groupBoxLog.TabIndex = 1; + this.groupBoxLog.TabStop = false; + // + // linkLabelAbout + // + this.linkLabelAbout.AutoSize = true; + this.linkLabelAbout.Location = new System.Drawing.Point(843, 4); + this.linkLabelAbout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.linkLabelAbout.Name = "linkLabelAbout"; + this.linkLabelAbout.Size = new System.Drawing.Size(250, 21); + this.linkLabelAbout.TabIndex = 21; + this.linkLabelAbout.TabStop = true; + this.linkLabelAbout.Text = "关于 SubsCheck Win GUI"; + this.linkLabelAbout.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // + // buttonUpdateKernel + // + this.buttonUpdateKernel.Location = new System.Drawing.Point(956, 802); + this.buttonUpdateKernel.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonUpdateKernel.Name = "buttonUpdateKernel"; + this.buttonUpdateKernel.Size = new System.Drawing.Size(138, 40); + this.buttonUpdateKernel.TabIndex = 20; + this.buttonUpdateKernel.Text = "更新内核"; + this.buttonUpdateKernel.UseVisualStyleBackColor = true; + this.buttonUpdateKernel.Visible = false; + this.buttonUpdateKernel.Click += new System.EventHandler(this.button5_Click); + // + // richTextBoxAllLog + // + this.richTextBoxAllLog.BackColor = System.Drawing.Color.WhiteSmoke; + this.richTextBoxAllLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBoxAllLog.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.richTextBoxAllLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.richTextBoxAllLog.Location = new System.Drawing.Point(6, 29); + this.richTextBoxAllLog.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.richTextBoxAllLog.Name = "richTextBoxAllLog"; + this.richTextBoxAllLog.ReadOnly = true; + this.richTextBoxAllLog.Size = new System.Drawing.Size(1088, 813); + this.richTextBoxAllLog.TabIndex = 0; + this.richTextBoxAllLog.Text = ""; + this.richTextBoxAllLog.DoubleClick += new System.EventHandler(this.richTextBox1_DoubleClick); + // + // labelLogNodeInfo + // + this.labelLogNodeInfo.AutoSize = true; + this.labelLogNodeInfo.Location = new System.Drawing.Point(0, 0); + this.labelLogNodeInfo.Name = "labelLogNodeInfo"; + this.labelLogNodeInfo.Size = new System.Drawing.Size(94, 21); + this.labelLogNodeInfo.TabIndex = 22; + this.labelLogNodeInfo.Text = "实时日志"; // // groupBoxAdvanceSettings // this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownTotalBandwidthLimit); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBox6); - this.groupBoxAdvanceSettings.Controls.Add(this.label22); - this.groupBoxAdvanceSettings.Controls.Add(this.label21); - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown9); - this.groupBoxAdvanceSettings.Controls.Add(this.button8); - this.groupBoxAdvanceSettings.Controls.Add(this.textBox10); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBox4); - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown8); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBox3); - this.groupBoxAdvanceSettings.Controls.Add(this.button4); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBox1); - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown6); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBox2); - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown5); - this.groupBoxAdvanceSettings.Controls.Add(this.comboBox5); - this.groupBoxAdvanceSettings.Controls.Add(this.label19); - this.groupBoxAdvanceSettings.Controls.Add(this.comboBox3); - this.groupBoxAdvanceSettings.Controls.Add(this.label10); - this.groupBoxAdvanceSettings.Controls.Add(this.label4); - this.groupBoxAdvanceSettings.Controls.Add(this.comboBox2); - this.groupBoxAdvanceSettings.Controls.Add(this.label9); - this.groupBoxAdvanceSettings.Controls.Add(this.label5); - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDown7); - this.groupBoxAdvanceSettings.Controls.Add(this.label20); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxTotalBandwidthLimit); + this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadMb); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownDownloadMb); + this.groupBoxAdvanceSettings.Controls.Add(this.buttonMoreSettings); + this.groupBoxAdvanceSettings.Controls.Add(this.textBoxWebUiAPIKey); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableWebUI); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSuccessLimit); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableSuccessLimit); + this.groupBoxAdvanceSettings.Controls.Add(this.buttonCheckUpdate); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableRenameNode); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownWebUIPort); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableMediaCheck); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownDLTimehot); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxOverwriteUrls); + this.groupBoxAdvanceSettings.Controls.Add(this.labelOverwriteUrls); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxGithubProxyUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.labelGithubProxyUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.labelWebUIPort); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxSpeedtestUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.labelSpeedtestUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadTimeout); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSubStorePort); + this.groupBoxAdvanceSettings.Controls.Add(this.labelSubstorePort); this.groupBoxAdvanceSettings.Location = new System.Drawing.Point(24, 880); this.groupBoxAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxAdvanceSettings.Name = "groupBoxAdvanceSettings"; @@ -733,174 +731,165 @@ private void InitializeComponent() 0, 0}); // - // checkBox6 - // - this.checkBox6.AutoSize = true; - this.checkBox6.Location = new System.Drawing.Point(17, 127); - this.checkBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox6.Name = "checkBox6"; - this.checkBox6.Size = new System.Drawing.Size(207, 25); - this.checkBox6.TabIndex = 36; - this.checkBox6.Text = "带宽限制(MB/s):"; - this.checkBox6.UseVisualStyleBackColor = true; - this.checkBox6.CheckedChanged += new System.EventHandler(this.checkBox6_CheckedChanged); - // - // label22 - // - this.label22.AutoSize = true; - this.label22.Location = new System.Drawing.Point(13, 181); - this.label22.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label22.Name = "label22"; - this.label22.Size = new System.Drawing.Size(0, 21); - this.label22.TabIndex = 33; - // - // label21 - // - this.label21.AutoSize = true; - this.label21.Location = new System.Drawing.Point(350, 129); - this.label21.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(159, 21); - this.label21.TabIndex = 31; - this.label21.Text = "测速大小(MB):"; - // - // numericUpDown9 - // - this.numericUpDown9.Location = new System.Drawing.Point(515, 124); - this.numericUpDown9.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown9.Minimum = new decimal(new int[] { + // checkBoxTotalBandwidthLimit + // + this.checkBoxTotalBandwidthLimit.AutoSize = true; + this.checkBoxTotalBandwidthLimit.Location = new System.Drawing.Point(17, 127); + this.checkBoxTotalBandwidthLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxTotalBandwidthLimit.Name = "checkBoxTotalBandwidthLimit"; + this.checkBoxTotalBandwidthLimit.Size = new System.Drawing.Size(207, 25); + this.checkBoxTotalBandwidthLimit.TabIndex = 36; + this.checkBoxTotalBandwidthLimit.Text = "带宽限制(MB/s):"; + this.checkBoxTotalBandwidthLimit.UseVisualStyleBackColor = true; + this.checkBoxTotalBandwidthLimit.CheckedChanged += new System.EventHandler(this.checkBox6_CheckedChanged); + // + // labelDownloadMb + // + this.labelDownloadMb.AutoSize = true; + this.labelDownloadMb.Location = new System.Drawing.Point(350, 129); + this.labelDownloadMb.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelDownloadMb.Name = "labelDownloadMb"; + this.labelDownloadMb.Size = new System.Drawing.Size(159, 21); + this.labelDownloadMb.TabIndex = 31; + this.labelDownloadMb.Text = "测速大小(MB):"; + // + // numericUpDownDownloadMb + // + this.numericUpDownDownloadMb.Location = new System.Drawing.Point(515, 124); + this.numericUpDownDownloadMb.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownDownloadMb.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown9.Name = "numericUpDown9"; - this.numericUpDown9.Size = new System.Drawing.Size(106, 31); - this.numericUpDown9.TabIndex = 30; - this.numericUpDown9.Value = new decimal(new int[] { + this.numericUpDownDownloadMb.Name = "numericUpDownDownloadMb"; + this.numericUpDownDownloadMb.Size = new System.Drawing.Size(106, 31); + this.numericUpDownDownloadMb.TabIndex = 30; + this.numericUpDownDownloadMb.Value = new decimal(new int[] { 20, 0, 0, 0}); // - // button8 - // - this.button8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.button8.Location = new System.Drawing.Point(1126, 165); - this.button8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button8.Name = "button8"; - this.button8.Size = new System.Drawing.Size(138, 40); - this.button8.TabIndex = 29; - this.button8.Text = "补充参数"; - this.button8.UseVisualStyleBackColor = true; - this.button8.Click += new System.EventHandler(this.button8_Click); - // - // textBox10 - // - this.textBox10.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBox10.Enabled = false; - this.textBox10.Location = new System.Drawing.Point(258, 170); - this.textBox10.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.textBox10.Name = "textBox10"; - this.textBox10.PasswordChar = '*'; - this.textBox10.Size = new System.Drawing.Size(200, 31); - this.textBox10.TabIndex = 6; - this.textBox10.Text = "admin"; - this.textBox10.Enter += new System.EventHandler(this.textBox10_Enter); - this.textBox10.Leave += new System.EventHandler(this.textBox10_Leave); - // - // checkBox4 - // - this.checkBox4.AutoSize = true; - this.checkBox4.Location = new System.Drawing.Point(16, 173); - this.checkBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox4.Name = "checkBox4"; - this.checkBox4.Size = new System.Drawing.Size(240, 25); - this.checkBox4.TabIndex = 28; - this.checkBox4.Text = "启用WebUI API密钥:"; - this.checkBox4.UseVisualStyleBackColor = true; - this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged); - // - // numericUpDown8 - // - this.numericUpDown8.Enabled = false; - this.numericUpDown8.Location = new System.Drawing.Point(224, 78); - this.numericUpDown8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDown8.Maximum = new decimal(new int[] { + // buttonMoreSettings + // + this.buttonMoreSettings.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.buttonMoreSettings.Location = new System.Drawing.Point(1126, 165); + this.buttonMoreSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonMoreSettings.Name = "buttonMoreSettings"; + this.buttonMoreSettings.Size = new System.Drawing.Size(138, 40); + this.buttonMoreSettings.TabIndex = 29; + this.buttonMoreSettings.Text = "补充参数"; + this.buttonMoreSettings.UseVisualStyleBackColor = true; + this.buttonMoreSettings.Click += new System.EventHandler(this.button8_Click); + // + // textBoxWebUiAPIKey + // + this.textBoxWebUiAPIKey.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxWebUiAPIKey.Enabled = false; + this.textBoxWebUiAPIKey.Location = new System.Drawing.Point(258, 170); + this.textBoxWebUiAPIKey.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxWebUiAPIKey.Name = "textBoxWebUiAPIKey"; + this.textBoxWebUiAPIKey.PasswordChar = '*'; + this.textBoxWebUiAPIKey.Size = new System.Drawing.Size(363, 31); + this.textBoxWebUiAPIKey.TabIndex = 6; + this.textBoxWebUiAPIKey.Text = "admin"; + this.textBoxWebUiAPIKey.Enter += new System.EventHandler(this.textBox10_Enter); + this.textBoxWebUiAPIKey.Leave += new System.EventHandler(this.textBox10_Leave); + // + // checkBoxEnableWebUI + // + this.checkBoxEnableWebUI.AutoSize = true; + this.checkBoxEnableWebUI.Location = new System.Drawing.Point(16, 173); + this.checkBoxEnableWebUI.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableWebUI.Name = "checkBoxEnableWebUI"; + this.checkBoxEnableWebUI.Size = new System.Drawing.Size(240, 25); + this.checkBoxEnableWebUI.TabIndex = 28; + this.checkBoxEnableWebUI.Text = "启用WebUI API密钥:"; + this.checkBoxEnableWebUI.UseVisualStyleBackColor = true; + this.checkBoxEnableWebUI.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged); + // + // numericUpDownSuccessLimit + // + this.numericUpDownSuccessLimit.Enabled = false; + this.numericUpDownSuccessLimit.Location = new System.Drawing.Point(224, 78); + this.numericUpDownSuccessLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownSuccessLimit.Maximum = new decimal(new int[] { 65535, 0, 0, 0}); - this.numericUpDown8.Minimum = new decimal(new int[] { + this.numericUpDownSuccessLimit.Minimum = new decimal(new int[] { 1, 0, 0, 0}); - this.numericUpDown8.Name = "numericUpDown8"; - this.numericUpDown8.Size = new System.Drawing.Size(106, 31); - this.numericUpDown8.TabIndex = 22; - this.numericUpDown8.Value = new decimal(new int[] { + this.numericUpDownSuccessLimit.Name = "numericUpDownSuccessLimit"; + this.numericUpDownSuccessLimit.Size = new System.Drawing.Size(106, 31); + this.numericUpDownSuccessLimit.TabIndex = 22; + this.numericUpDownSuccessLimit.Value = new decimal(new int[] { 100, 0, 0, 0}); // - // checkBox3 - // - this.checkBox3.AutoSize = true; - this.checkBox3.Location = new System.Drawing.Point(17, 81); - this.checkBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox3.Name = "checkBox3"; - this.checkBox3.Size = new System.Drawing.Size(183, 25); - this.checkBox3.TabIndex = 27; - this.checkBox3.Text = "节点保存数目:"; - this.checkBox3.UseVisualStyleBackColor = true; - this.checkBox3.CheckedChanged += new System.EventHandler(this.checkBox3_CheckedChanged); - // - // button4 - // - this.button4.BackColor = System.Drawing.Color.LimeGreen; - this.button4.FlatAppearance.BorderSize = 0; - this.button4.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.button4.ForeColor = System.Drawing.SystemColors.HighlightText; - this.button4.Location = new System.Drawing.Point(1276, 165); - this.button4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.button4.Name = "button4"; - this.button4.Size = new System.Drawing.Size(138, 40); - this.button4.TabIndex = 26; - this.button4.Text = "检查更新"; - this.button4.UseVisualStyleBackColor = false; - this.button4.Click += new System.EventHandler(this.button4_Click); - // - // checkBox1 - // - this.checkBox1.AutoSize = true; - this.checkBox1.Checked = true; - this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBox1.Location = new System.Drawing.Point(17, 35); - this.checkBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(162, 25); - this.checkBox1.TabIndex = 22; - this.checkBox1.Text = "节点地址查询"; - this.checkBox1.UseVisualStyleBackColor = true; - this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); - // - // checkBox2 - // - this.checkBox2.AutoSize = true; - this.checkBox2.Location = new System.Drawing.Point(198, 35); - this.checkBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBox2.Name = "checkBox2"; - this.checkBox2.Size = new System.Drawing.Size(141, 25); - this.checkBox2.TabIndex = 25; - this.checkBox2.Text = "流媒体检测"; - this.checkBox2.UseVisualStyleBackColor = true; - this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged); - // - // comboBox5 - // - this.comboBox5.FormattingEnabled = true; - this.comboBox5.Items.AddRange(new object[] { + // checkBoxEnableSuccessLimit + // + this.checkBoxEnableSuccessLimit.AutoSize = true; + this.checkBoxEnableSuccessLimit.Location = new System.Drawing.Point(17, 81); + this.checkBoxEnableSuccessLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableSuccessLimit.Name = "checkBoxEnableSuccessLimit"; + this.checkBoxEnableSuccessLimit.Size = new System.Drawing.Size(183, 25); + this.checkBoxEnableSuccessLimit.TabIndex = 27; + this.checkBoxEnableSuccessLimit.Text = "节点保存数目:"; + this.checkBoxEnableSuccessLimit.UseVisualStyleBackColor = true; + this.checkBoxEnableSuccessLimit.CheckedChanged += new System.EventHandler(this.checkBox3_CheckedChanged); + // + // buttonCheckUpdate + // + this.buttonCheckUpdate.BackColor = System.Drawing.Color.LimeGreen; + this.buttonCheckUpdate.FlatAppearance.BorderSize = 0; + this.buttonCheckUpdate.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.buttonCheckUpdate.ForeColor = System.Drawing.SystemColors.HighlightText; + this.buttonCheckUpdate.Location = new System.Drawing.Point(1276, 165); + this.buttonCheckUpdate.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonCheckUpdate.Name = "buttonCheckUpdate"; + this.buttonCheckUpdate.Size = new System.Drawing.Size(138, 40); + this.buttonCheckUpdate.TabIndex = 26; + this.buttonCheckUpdate.Text = "检查更新"; + this.buttonCheckUpdate.UseVisualStyleBackColor = false; + this.buttonCheckUpdate.Click += new System.EventHandler(this.button4_Click); + // + // checkBoxEnableRenameNode + // + this.checkBoxEnableRenameNode.AutoSize = true; + this.checkBoxEnableRenameNode.Checked = true; + this.checkBoxEnableRenameNode.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxEnableRenameNode.Location = new System.Drawing.Point(17, 35); + this.checkBoxEnableRenameNode.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableRenameNode.Name = "checkBoxEnableRenameNode"; + this.checkBoxEnableRenameNode.Size = new System.Drawing.Size(162, 25); + this.checkBoxEnableRenameNode.TabIndex = 22; + this.checkBoxEnableRenameNode.Text = "节点地址查询"; + this.checkBoxEnableRenameNode.UseVisualStyleBackColor = true; + this.checkBoxEnableRenameNode.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + // + // checkBoxEnableMediaCheck + // + this.checkBoxEnableMediaCheck.AutoSize = true; + this.checkBoxEnableMediaCheck.Location = new System.Drawing.Point(198, 35); + this.checkBoxEnableMediaCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableMediaCheck.Name = "checkBoxEnableMediaCheck"; + this.checkBoxEnableMediaCheck.Size = new System.Drawing.Size(141, 25); + this.checkBoxEnableMediaCheck.TabIndex = 25; + this.checkBoxEnableMediaCheck.Text = "流媒体检测"; + this.checkBoxEnableMediaCheck.UseVisualStyleBackColor = true; + this.checkBoxEnableMediaCheck.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged); + // + // comboBoxOverwriteUrls + // + this.comboBoxOverwriteUrls.FormattingEnabled = true; + this.comboBoxOverwriteUrls.Items.AddRange(new object[] { "[内置]布丁狗的订阅转换", "[内置]ACL4SSR_Online_Full", "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/布丁狗的订阅转" + @@ -919,27 +908,27 @@ private void InitializeComponent() "line_Full_WithIcon.yaml", "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/添加直连规则.yam" + "l"}); - this.comboBox5.Location = new System.Drawing.Point(895, 125); - this.comboBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBox5.Name = "comboBox5"; - this.comboBox5.Size = new System.Drawing.Size(517, 29); - this.comboBox5.TabIndex = 24; - this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); - // - // label19 - // - this.label19.AutoSize = true; - this.label19.Location = new System.Drawing.Point(633, 129); - this.label19.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label19.Name = "label19"; - this.label19.Size = new System.Drawing.Size(265, 21); - this.label19.TabIndex = 23; - this.label19.Text = "Clash订阅 覆写配置文件:"; - // - // comboBox3 - // - this.comboBox3.FormattingEnabled = true; - this.comboBox3.Items.AddRange(new object[] { + this.comboBoxOverwriteUrls.Location = new System.Drawing.Point(895, 125); + this.comboBoxOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxOverwriteUrls.Name = "comboBoxOverwriteUrls"; + this.comboBoxOverwriteUrls.Size = new System.Drawing.Size(517, 29); + this.comboBoxOverwriteUrls.TabIndex = 24; + this.comboBoxOverwriteUrls.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + // + // labelOverwriteUrls + // + this.labelOverwriteUrls.AutoSize = true; + this.labelOverwriteUrls.Location = new System.Drawing.Point(633, 129); + this.labelOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelOverwriteUrls.Name = "labelOverwriteUrls"; + this.labelOverwriteUrls.Size = new System.Drawing.Size(265, 21); + this.labelOverwriteUrls.TabIndex = 23; + this.labelOverwriteUrls.Text = "Clash订阅 覆写配置文件:"; + // + // comboBoxGithubProxyUrl + // + this.comboBoxGithubProxyUrl.FormattingEnabled = true; + this.comboBoxGithubProxyUrl.Items.AddRange(new object[] { "自动选择", "1.github.010716.xyz", "113355.kabaka.xyz", @@ -1366,85 +1355,85 @@ private void InitializeComponent() "tube.20140301.xyz", "vps.pansen626.com", "wfgithub.xiaonuomi.ie.eu.org"}); - this.comboBox3.Location = new System.Drawing.Point(1104, 33); - this.comboBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBox3.Name = "comboBox3"; - this.comboBox3.Size = new System.Drawing.Size(308, 29); - this.comboBox3.TabIndex = 21; - this.comboBox3.Leave += new System.EventHandler(this.comboBox3_Leave); - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(926, 37); - this.label10.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(163, 21); - this.label10.TabIndex = 20; - this.label10.Text = "Github Proxy:"; - // - // comboBox2 - // - this.comboBox2.FormattingEnabled = true; - this.comboBox2.Items.AddRange(new object[] { + this.comboBoxGithubProxyUrl.Location = new System.Drawing.Point(1104, 33); + this.comboBoxGithubProxyUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxGithubProxyUrl.Name = "comboBoxGithubProxyUrl"; + this.comboBoxGithubProxyUrl.Size = new System.Drawing.Size(308, 29); + this.comboBoxGithubProxyUrl.TabIndex = 21; + this.comboBoxGithubProxyUrl.Leave += new System.EventHandler(this.comboBox3_Leave); + // + // labelGithubProxyUrl + // + this.labelGithubProxyUrl.AutoSize = true; + this.labelGithubProxyUrl.Location = new System.Drawing.Point(926, 37); + this.labelGithubProxyUrl.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelGithubProxyUrl.Name = "labelGithubProxyUrl"; + this.labelGithubProxyUrl.Size = new System.Drawing.Size(163, 21); + this.labelGithubProxyUrl.TabIndex = 20; + this.labelGithubProxyUrl.Text = "Github Proxy:"; + // + // comboBoxSpeedtestUrl + // + this.comboBoxSpeedtestUrl.FormattingEnabled = true; + this.comboBoxSpeedtestUrl.Items.AddRange(new object[] { "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + "Waifu2x-Extension-GUI-v2.21.12-Portable.7z", "https://github.com/2dust/v2rayN/releases/download/7.10.4/v2rayN-windows-64-deskto" + "p.zip", "https://github.com/VSCodium/vscodium/releases/download/1.98.0.25067/codium-1.98.0" + ".25067-el9.aarch64.rpm"}); - this.comboBox2.Location = new System.Drawing.Point(741, 79); - this.comboBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBox2.Name = "comboBox2"; - this.comboBox2.Size = new System.Drawing.Size(671, 29); - this.comboBox2.TabIndex = 19; - this.comboBox2.Text = "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + + this.comboBoxSpeedtestUrl.Location = new System.Drawing.Point(741, 79); + this.comboBoxSpeedtestUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSpeedtestUrl.Name = "comboBoxSpeedtestUrl"; + this.comboBoxSpeedtestUrl.Size = new System.Drawing.Size(671, 29); + this.comboBoxSpeedtestUrl.TabIndex = 19; + this.comboBoxSpeedtestUrl.Text = "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + "Waifu2x-Extension-GUI-v2.21.12-Portable.7z"; // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(631, 83); - this.label9.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(115, 21); - this.label9.TabIndex = 18; - this.label9.Text = "测速地址:"; - // - // progressBar1 - // - this.progressBar1.Location = new System.Drawing.Point(0, 0); - this.progressBar1.Margin = new System.Windows.Forms.Padding(0); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(1466, 10); - this.progressBar1.Step = 1; - this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous; - this.progressBar1.TabIndex = 3; - this.toolTip1.SetToolTip(this.progressBar1, "检测进度"); - this.progressBar1.Visible = false; - // - // timer2 - // - this.timer2.Interval = 2000; - this.timer2.Tick += new System.EventHandler(this.timer2_Tick); - // - // groupBox4 - // - this.groupBox4.Controls.Add(this.textBox4); - this.groupBox4.Controls.Add(this.label13); - this.groupBox4.Controls.Add(this.textBox3); - this.groupBox4.Controls.Add(this.label12); - this.groupBox4.Controls.Add(this.textBox2); - this.groupBox4.Controls.Add(this.label11); - this.groupBox4.Location = new System.Drawing.Point(24, 1202); - this.groupBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox4.Name = "groupBox4"; - this.groupBox4.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox4.Size = new System.Drawing.Size(1430, 89); - this.groupBox4.TabIndex = 4; - this.groupBox4.TabStop = false; - this.groupBox4.Text = "Gist 上传参数"; - this.groupBox4.Visible = false; + // labelSpeedtestUrl + // + this.labelSpeedtestUrl.AutoSize = true; + this.labelSpeedtestUrl.Location = new System.Drawing.Point(631, 83); + this.labelSpeedtestUrl.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelSpeedtestUrl.Name = "labelSpeedtestUrl"; + this.labelSpeedtestUrl.Size = new System.Drawing.Size(115, 21); + this.labelSpeedtestUrl.TabIndex = 18; + this.labelSpeedtestUrl.Text = "测速地址:"; + // + // progressBarAll + // + this.progressBarAll.Location = new System.Drawing.Point(0, 0); + this.progressBarAll.Margin = new System.Windows.Forms.Padding(0); + this.progressBarAll.Name = "progressBarAll"; + this.progressBarAll.Size = new System.Drawing.Size(1466, 4); + this.progressBarAll.Step = 1; + this.progressBarAll.Style = System.Windows.Forms.ProgressBarStyle.Continuous; + this.progressBarAll.TabIndex = 3; + this.toolTip1.SetToolTip(this.progressBarAll, "检测进度"); + this.progressBarAll.Visible = false; + // + // timerCopySubscriptionUrl + // + this.timerCopySubscriptionUrl.Interval = 2000; + this.timerCopySubscriptionUrl.Tick += new System.EventHandler(this.timer2_Tick); + // + // groupBoxGist + // + this.groupBoxGist.Controls.Add(this.textBox4); + this.groupBoxGist.Controls.Add(this.label13); + this.groupBoxGist.Controls.Add(this.textBox3); + this.groupBoxGist.Controls.Add(this.label12); + this.groupBoxGist.Controls.Add(this.textBox2); + this.groupBoxGist.Controls.Add(this.label11); + this.groupBoxGist.Location = new System.Drawing.Point(24, 1202); + this.groupBoxGist.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxGist.Name = "groupBoxGist"; + this.groupBoxGist.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxGist.Size = new System.Drawing.Size(1430, 89); + this.groupBoxGist.TabIndex = 4; + this.groupBoxGist.TabStop = false; + this.groupBoxGist.Text = "Gist 上传参数"; + this.groupBoxGist.Visible = false; // // textBox4 // @@ -1510,21 +1499,21 @@ private void InitializeComponent() this.toolTip1.ReshowDelay = 500; this.toolTip1.ShowAlways = true; // - // groupBox5 - // - this.groupBox5.Controls.Add(this.textBox6); - this.groupBox5.Controls.Add(this.label15); - this.groupBox5.Controls.Add(this.textBox7); - this.groupBox5.Controls.Add(this.label16); - this.groupBox5.Location = new System.Drawing.Point(24, 1300); - this.groupBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox5.Name = "groupBox5"; - this.groupBox5.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox5.Size = new System.Drawing.Size(1430, 89); - this.groupBox5.TabIndex = 6; - this.groupBox5.TabStop = false; - this.groupBox5.Text = "R2 上传参数"; - this.groupBox5.Visible = false; + // groupBoxR2 + // + this.groupBoxR2.Controls.Add(this.textBox6); + this.groupBoxR2.Controls.Add(this.label15); + this.groupBoxR2.Controls.Add(this.textBox7); + this.groupBoxR2.Controls.Add(this.label16); + this.groupBoxR2.Location = new System.Drawing.Point(24, 1300); + this.groupBoxR2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxR2.Name = "groupBoxR2"; + this.groupBoxR2.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxR2.Size = new System.Drawing.Size(1430, 89); + this.groupBoxR2.TabIndex = 6; + this.groupBoxR2.TabStop = false; + this.groupBoxR2.Text = "R2 上传参数"; + this.groupBoxR2.Visible = false; // // textBox6 // @@ -1568,23 +1557,23 @@ private void InitializeComponent() this.label16.TabIndex = 0; this.label16.Text = "Worker URL:"; // - // groupBox6 - // - this.groupBox6.Controls.Add(this.textBox5); - this.groupBox6.Controls.Add(this.label14); - this.groupBox6.Controls.Add(this.textBox8); - this.groupBox6.Controls.Add(this.label17); - this.groupBox6.Controls.Add(this.textBox9); - this.groupBox6.Controls.Add(this.label18); - this.groupBox6.Location = new System.Drawing.Point(24, 1398); - this.groupBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox6.Name = "groupBox6"; - this.groupBox6.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBox6.Size = new System.Drawing.Size(1430, 89); - this.groupBox6.TabIndex = 6; - this.groupBox6.TabStop = false; - this.groupBox6.Text = "Webdav 上传参数"; - this.groupBox6.Visible = false; + // groupBoxWebdav + // + this.groupBoxWebdav.Controls.Add(this.textBox5); + this.groupBoxWebdav.Controls.Add(this.label14); + this.groupBoxWebdav.Controls.Add(this.textBox8); + this.groupBoxWebdav.Controls.Add(this.label17); + this.groupBoxWebdav.Controls.Add(this.textBox9); + this.groupBoxWebdav.Controls.Add(this.label18); + this.groupBoxWebdav.Location = new System.Drawing.Point(24, 1398); + this.groupBoxWebdav.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxWebdav.Name = "groupBoxWebdav"; + this.groupBoxWebdav.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBoxWebdav.Size = new System.Drawing.Size(1430, 89); + this.groupBoxWebdav.TabIndex = 6; + this.groupBoxWebdav.TabStop = false; + this.groupBoxWebdav.Text = "Webdav 上传参数"; + this.groupBoxWebdav.Visible = false; // // textBox5 // @@ -1646,34 +1635,34 @@ private void InitializeComponent() this.label18.TabIndex = 0; this.label18.Text = "Username:"; // - // timer3 + // timerRestartSchedule // - this.timer3.Interval = 86400000; - this.timer3.Tick += new System.EventHandler(this.timer3_Tick); + this.timerRestartSchedule.Interval = 86400000; + this.timerRestartSchedule.Tick += new System.EventHandler(this.timer3_Tick); // - // timer4 + // timerRefresh // - this.timer4.Tick += new System.EventHandler(this.timer4_Tick); + this.timerRefresh.Tick += new System.EventHandler(this.timer4_Tick); // - // groupBoxPipe + // groupBoxPipeConcurrent // - this.groupBoxPipe.Controls.Add(this.numericUpDownPipeMedia); - this.groupBoxPipe.Controls.Add(this.labelPipeMedia); - this.groupBoxPipe.Controls.Add(this.numericUpDownPipeSpeed); - this.groupBoxPipe.Controls.Add(this.labelPipeSpeed); - this.groupBoxPipe.Controls.Add(this.checkBoxPipeAuto); - this.groupBoxPipe.Controls.Add(this.numericUpDownPipeAlive); - this.groupBoxPipe.Controls.Add(this.labelPipeAlive); - this.groupBoxPipe.Location = new System.Drawing.Point(24, 1104); - this.groupBoxPipe.Name = "groupBoxPipe"; - this.groupBoxPipe.Size = new System.Drawing.Size(1009, 89); - this.groupBoxPipe.TabIndex = 7; - this.groupBoxPipe.TabStop = false; - this.groupBoxPipe.Text = "流水线并发 参数"; + this.groupBoxPipeConcurrent.Controls.Add(this.numericUpDownPipeMedia); + this.groupBoxPipeConcurrent.Controls.Add(this.labelPipeMedia); + this.groupBoxPipeConcurrent.Controls.Add(this.numericUpDownPipeSpeed); + this.groupBoxPipeConcurrent.Controls.Add(this.labelPipeSpeed); + this.groupBoxPipeConcurrent.Controls.Add(this.checkBoxPipeAuto); + this.groupBoxPipeConcurrent.Controls.Add(this.numericUpDownPipeAlive); + this.groupBoxPipeConcurrent.Controls.Add(this.labelPipeAlive); + this.groupBoxPipeConcurrent.Location = new System.Drawing.Point(24, 1104); + this.groupBoxPipeConcurrent.Name = "groupBoxPipeConcurrent"; + this.groupBoxPipeConcurrent.Size = new System.Drawing.Size(998, 89); + this.groupBoxPipeConcurrent.TabIndex = 7; + this.groupBoxPipeConcurrent.TabStop = false; + this.groupBoxPipeConcurrent.Text = "流水线并发 参数"; // // numericUpDownPipeMedia // - this.numericUpDownPipeMedia.Location = new System.Drawing.Point(883, 36); + this.numericUpDownPipeMedia.Location = new System.Drawing.Point(866, 36); this.numericUpDownPipeMedia.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownPipeMedia.Maximum = new decimal(new int[] { 1000, @@ -1688,7 +1677,7 @@ private void InitializeComponent() // labelPipeMedia // this.labelPipeMedia.AutoSize = true; - this.labelPipeMedia.Location = new System.Drawing.Point(684, 41); + this.labelPipeMedia.Location = new System.Drawing.Point(667, 41); this.labelPipeMedia.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelPipeMedia.Name = "labelPipeMedia"; this.labelPipeMedia.Size = new System.Drawing.Size(199, 21); @@ -1697,7 +1686,7 @@ private void InitializeComponent() // // numericUpDownPipeSpeed // - this.numericUpDownPipeSpeed.Location = new System.Drawing.Point(538, 36); + this.numericUpDownPipeSpeed.Location = new System.Drawing.Point(534, 36); this.numericUpDownPipeSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownPipeSpeed.Maximum = new decimal(new int[] { 500, @@ -1712,7 +1701,7 @@ private void InitializeComponent() // labelPipeSpeed // this.labelPipeSpeed.AutoSize = true; - this.labelPipeSpeed.Location = new System.Drawing.Point(404, 41); + this.labelPipeSpeed.Location = new System.Drawing.Point(400, 41); this.labelPipeSpeed.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelPipeSpeed.Name = "labelPipeSpeed"; this.labelPipeSpeed.Size = new System.Drawing.Size(136, 21); @@ -1733,7 +1722,7 @@ private void InitializeComponent() // // numericUpDownPipeAlive // - this.numericUpDownPipeAlive.Location = new System.Drawing.Point(275, 38); + this.numericUpDownPipeAlive.Location = new System.Drawing.Point(272, 38); this.numericUpDownPipeAlive.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownPipeAlive.Maximum = new decimal(new int[] { 5000, @@ -1749,7 +1738,7 @@ private void InitializeComponent() // labelPipeAlive // this.labelPipeAlive.AutoSize = true; - this.labelPipeAlive.Location = new System.Drawing.Point(138, 41); + this.labelPipeAlive.Location = new System.Drawing.Point(135, 41); this.labelPipeAlive.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelPipeAlive.Name = "labelPipeAlive"; this.labelPipeAlive.Size = new System.Drawing.Size(136, 21); @@ -1760,9 +1749,9 @@ private void InitializeComponent() // this.groupBoxEnhance.Controls.Add(this.checkBoxDropBadCFNodes); this.groupBoxEnhance.Controls.Add(this.checkBoxEhanceTag); - this.groupBoxEnhance.Location = new System.Drawing.Point(1039, 1104); + this.groupBoxEnhance.Location = new System.Drawing.Point(1028, 1104); this.groupBoxEnhance.Name = "groupBoxEnhance"; - this.groupBoxEnhance.Size = new System.Drawing.Size(415, 89); + this.groupBoxEnhance.Size = new System.Drawing.Size(426, 89); this.groupBoxEnhance.TabIndex = 44; this.groupBoxEnhance.TabStop = false; this.groupBoxEnhance.Text = "Enhance 参数"; @@ -1789,51 +1778,52 @@ private void InitializeComponent() this.checkBoxEhanceTag.Text = "增强位置标签"; this.checkBoxEhanceTag.UseVisualStyleBackColor = true; // - // Form1 + // MainGui // this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(1466, 1510); - this.Controls.Add(this.groupBoxEnhance); - this.Controls.Add(this.groupBoxPipe); - this.Controls.Add(this.groupBox6); - this.Controls.Add(this.groupBox5); - this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBoxLog); + this.Controls.Add(this.groupBoxComonSettings); this.Controls.Add(this.groupBoxAdvanceSettings); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.progressBar1); + this.Controls.Add(this.groupBoxPipeConcurrent); + this.Controls.Add(this.groupBoxEnhance); + this.Controls.Add(this.groupBoxGist); + this.Controls.Add(this.groupBoxR2); + this.Controls.Add(this.groupBoxWebdav); + this.Controls.Add(this.progressBarAll); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.MaximizeBox = false; - this.Name = "Form1"; + this.Name = "MainGui"; this.Text = "SubsCheck Win GUI"; - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + this.groupBoxComonSettings.ResumeLayout(false); + this.groupBoxComonSettings.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).EndInit(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWebUIPort)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDLTimehot)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubStorePort)).EndInit(); + this.groupBoxLog.ResumeLayout(false); + this.groupBoxLog.PerformLayout(); this.groupBoxAdvanceSettings.ResumeLayout(false); this.groupBoxAdvanceSettings.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalBandwidthLimit)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).EndInit(); - this.groupBox4.ResumeLayout(false); - this.groupBox4.PerformLayout(); - this.groupBox5.ResumeLayout(false); - this.groupBox5.PerformLayout(); - this.groupBox6.ResumeLayout(false); - this.groupBox6.PerformLayout(); - this.groupBoxPipe.ResumeLayout(false); - this.groupBoxPipe.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDownloadMb)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSuccessLimit)).EndInit(); + this.groupBoxGist.ResumeLayout(false); + this.groupBoxGist.PerformLayout(); + this.groupBoxR2.ResumeLayout(false); + this.groupBoxR2.PerformLayout(); + this.groupBoxWebdav.ResumeLayout(false); + this.groupBoxWebdav.PerformLayout(); + this.groupBoxPipeConcurrent.ResumeLayout(false); + this.groupBoxPipeConcurrent.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeMedia)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeSpeed)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPipeAlive)).EndInit(); @@ -1846,40 +1836,40 @@ private void InitializeComponent() #endregion private System.Windows.Forms.NotifyIcon notifyIcon1; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label LogLabelNodeInfo; + private System.Windows.Forms.Timer timerinitial; + private System.Windows.Forms.GroupBox groupBoxComonSettings; + private System.Windows.Forms.GroupBox groupBoxLog; + private System.Windows.Forms.Label labelLogNodeInfo; private System.Windows.Forms.Button buttonAdvanceSettings; - private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button buttonStartCheck; private System.Windows.Forms.GroupBox groupBoxAdvanceSettings; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label labelSubUrls; + private System.Windows.Forms.Label labelSaveMethod; + private System.Windows.Forms.Label labelWebUIPort; + private System.Windows.Forms.Label labelDownloadTimeout; + private System.Windows.Forms.Label labelMinSpped; + private System.Windows.Forms.Label labelTimeout; + private System.Windows.Forms.Label labelInterval; private System.Windows.Forms.Label labelCron; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.NumericUpDown numericUpDown6; - private System.Windows.Forms.NumericUpDown numericUpDown5; + private System.Windows.Forms.Label labelConcurrent; + private System.Windows.Forms.NumericUpDown numericUpDownWebUIPort; + private System.Windows.Forms.NumericUpDown numericUpDownDLTimehot; private System.Windows.Forms.NumericUpDown numericUpDownMinSpeed; - private System.Windows.Forms.NumericUpDown numericUpDown3; - private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.NumericUpDown numericUpDownTimeout; + private System.Windows.Forms.NumericUpDown numericUpDownInterval; private System.Windows.Forms.NumericUpDown numericUpDownConcurrent; - private System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.ComboBox comboBox1; - private System.Windows.Forms.ComboBox comboBox2; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.ComboBox comboBox3; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.CheckBox checkBox1; - private System.Windows.Forms.RichTextBox richTextBox1; - private System.Windows.Forms.ProgressBar progressBar1; - private System.Windows.Forms.Button button3; - private System.Windows.Forms.Timer timer2; - private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBoxSubsUrls; + private System.Windows.Forms.ComboBox comboBoxSaveMethod; + private System.Windows.Forms.ComboBox comboBoxSpeedtestUrl; + private System.Windows.Forms.Label labelSpeedtestUrl; + private System.Windows.Forms.ComboBox comboBoxGithubProxyUrl; + private System.Windows.Forms.Label labelGithubProxyUrl; + private System.Windows.Forms.CheckBox checkBoxEnableRenameNode; + private System.Windows.Forms.RichTextBox richTextBoxAllLog; + private System.Windows.Forms.ProgressBar progressBarAll; + private System.Windows.Forms.Button buttonCopySubscriptionUrl; + private System.Windows.Forms.Timer timerCopySubscriptionUrl; + private System.Windows.Forms.GroupBox groupBoxGist; private System.Windows.Forms.TextBox textBox4; private System.Windows.Forms.Label label13; private System.Windows.Forms.TextBox textBox3; @@ -1887,46 +1877,45 @@ private void InitializeComponent() private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Label label11; private System.Windows.Forms.ToolTip toolTip1; - private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.GroupBox groupBoxR2; private System.Windows.Forms.TextBox textBox6; private System.Windows.Forms.Label label15; private System.Windows.Forms.TextBox textBox7; private System.Windows.Forms.Label label16; - private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.GroupBox groupBoxWebdav; private System.Windows.Forms.TextBox textBox5; private System.Windows.Forms.Label label14; private System.Windows.Forms.TextBox textBox8; private System.Windows.Forms.Label label17; private System.Windows.Forms.TextBox textBox9; private System.Windows.Forms.Label label18; - private System.Windows.Forms.Button button5; - private System.Windows.Forms.ComboBox comboBox4; - private System.Windows.Forms.NumericUpDown numericUpDown7; - private System.Windows.Forms.Label label20; - private System.Windows.Forms.Label label19; - private System.Windows.Forms.ComboBox comboBox5; - private System.Windows.Forms.CheckBox checkBox2; - private System.Windows.Forms.Timer timer3; - private System.Windows.Forms.Button button4; - private System.Windows.Forms.NumericUpDown numericUpDown8; - private System.Windows.Forms.CheckBox checkBox3; - private System.Windows.Forms.TextBox textBox10; - private System.Windows.Forms.CheckBox checkBox4; - private System.Windows.Forms.Button button6; - private System.Windows.Forms.Timer timer4; - private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button buttonUpdateKernel; + private System.Windows.Forms.ComboBox comboBoxSubscriptionType; + private System.Windows.Forms.NumericUpDown numericUpDownSubStorePort; + private System.Windows.Forms.Label labelSubstorePort; + private System.Windows.Forms.Label labelOverwriteUrls; + private System.Windows.Forms.ComboBox comboBoxOverwriteUrls; + private System.Windows.Forms.CheckBox checkBoxEnableMediaCheck; + private System.Windows.Forms.Timer timerRestartSchedule; + private System.Windows.Forms.Button buttonCheckUpdate; + private System.Windows.Forms.NumericUpDown numericUpDownSuccessLimit; + private System.Windows.Forms.CheckBox checkBoxEnableSuccessLimit; + private System.Windows.Forms.TextBox textBoxWebUiAPIKey; + private System.Windows.Forms.CheckBox checkBoxEnableWebUI; + private System.Windows.Forms.Button buttonWebUi; + private System.Windows.Forms.Timer timerRefresh; + private System.Windows.Forms.Button buttonTriggerCheck; private System.Windows.Forms.TextBox textBoxCron; - private System.Windows.Forms.LinkLabel linkLabel1; - private System.Windows.Forms.Button button8; - private System.Windows.Forms.CheckBox checkBox5; - private System.Windows.Forms.NumericUpDown numericUpDown9; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.Label label22; - private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.LinkLabel linkLabelAbout; + private System.Windows.Forms.Button buttonMoreSettings; + private System.Windows.Forms.CheckBox checkBoxStartup; + private System.Windows.Forms.NumericUpDown numericUpDownDownloadMb; + private System.Windows.Forms.Label labelDownloadMb; + private System.Windows.Forms.CheckBox checkBoxTotalBandwidthLimit; private System.Windows.Forms.NumericUpDown numericUpDownTotalBandwidthLimit; private System.Windows.Forms.CheckBox checkBoxSwitchArch64; private System.Windows.Forms.CheckBox checkBoxHighConcurrent; - private System.Windows.Forms.GroupBox groupBoxPipe; + private System.Windows.Forms.GroupBox groupBoxPipeConcurrent; private System.Windows.Forms.NumericUpDown numericUpDownPipeAlive; private System.Windows.Forms.Label labelPipeAlive; private System.Windows.Forms.CheckBox checkBoxPipeAuto; diff --git a/Form1.cs b/MainGui.cs similarity index 86% rename from Form1.cs rename to MainGui.cs index 1206262..fe7376b 100644 --- a/Form1.cs +++ b/MainGui.cs @@ -16,7 +16,7 @@ namespace subs_check.win.gui { - public partial class Form1 : Form + public partial class MainGui : Form { //string 版本号; string 标题; @@ -47,39 +47,39 @@ public partial class Form1 : Form - public Form1() + public MainGui() { InitializeComponent(); originalNotifyIcon = notifyIcon1.Icon; toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。"); - toolTip1.SetToolTip(numericUpDown2, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); - toolTip1.SetToolTip(label2, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); + toolTip1.SetToolTip(numericUpDownInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); + toolTip1.SetToolTip(labelInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); - toolTip1.SetToolTip(numericUpDown3, "超时时间(毫秒):节点的最大延迟。"); + toolTip1.SetToolTip(numericUpDownTimeout, "超时时间(毫秒):节点的最大延迟。"); toolTip1.SetToolTip(numericUpDownMinSpeed, "最低测速结果舍弃(KB/s)。"); - toolTip1.SetToolTip(numericUpDown5, "下载测试时间(s):与下载链接大小相关,默认最大测试10s。"); - toolTip1.SetToolTip(numericUpDown6, "本地监听端口:用于直接返回测速结果的节点信息,方便 Sub-Store 实现订阅转换。"); - toolTip1.SetToolTip(numericUpDown7, "Sub-Store监听端口:用于订阅订阅转换。\n注意:除非你知道你在干什么,否则不要将你的 Sub-Store 暴露到公网,否则可能会被滥用"); - toolTip1.SetToolTip(numericUpDown9, "下载测试限制(MB):当达到下载数据大小时,停止下载,可节省测速流量,减少测速测死的概率"); + toolTip1.SetToolTip(numericUpDownDLTimehot, "下载测试时间(s):与下载链接大小相关,默认最大测试10s。"); + toolTip1.SetToolTip(numericUpDownWebUIPort, "本地监听端口:用于直接返回测速结果的节点信息,方便 Sub-Store 实现订阅转换。"); + toolTip1.SetToolTip(numericUpDownSubStorePort, "Sub-Store监听端口:用于订阅订阅转换。\n注意:除非你知道你在干什么,否则不要将你的 Sub-Store 暴露到公网,否则可能会被滥用"); + toolTip1.SetToolTip(numericUpDownDownloadMb, "下载测试限制(MB):当达到下载数据大小时,停止下载,可节省测速流量,减少测速测死的概率"); toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, "总下载速度限制(MB/s):建议设置为 <=带宽/8, 比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20"); - toolTip1.SetToolTip(textBox1, "节点池订阅地址:支持 Link、Base64、Clash 格式的订阅链接。"); - toolTip1.SetToolTip(checkBox1, "以节点IP查询位置重命名节点。\n质量差的节点可能造成IP查询失败,造成整体检查速度稍微变慢。"); - toolTip1.SetToolTip(checkBox2, "是否开启流媒体检测,其中IP欺诈依赖'节点地址查询',内核版本需要 v2.0.8 以上\n\n示例:美国1 | ⬇️ 5.6MB/s |0%|Netflix|Disney|Openai\n风控值:0% (使用ping0.cc标准)\n流媒体解锁:Netflix、Disney、Openai"); - toolTip1.SetToolTip(comboBox3, "GitHub 代理:代理订阅 GitHub raw 节点池。"); - toolTip1.SetToolTip(comboBox2, "测速地址:注意 并发数*节点速度<最大网速 否则测速结果不准确\n尽量不要使用Speedtest,Cloudflare提供的下载链接,因为很多节点屏蔽测速网站。"); + toolTip1.SetToolTip(textBoxSubsUrls, "节点池订阅地址:支持 Link、Base64、Clash 格式的订阅链接。"); + toolTip1.SetToolTip(checkBoxEnableRenameNode, "以节点IP查询位置重命名节点。\n质量差的节点可能造成IP查询失败,造成整体检查速度稍微变慢。"); + toolTip1.SetToolTip(checkBoxEnableMediaCheck, "是否开启流媒体检测,其中IP欺诈依赖'节点地址查询',内核版本需要 v2.0.8 以上\n\n示例:美国1 | ⬇️ 5.6MB/s |0%|Netflix|Disney|Openai\n风控值:0% (使用ping0.cc标准)\n流媒体解锁:Netflix、Disney、Openai"); + toolTip1.SetToolTip(comboBoxGithubProxyUrl, "GitHub 代理:代理订阅 GitHub raw 节点池。"); + toolTip1.SetToolTip(comboBoxSpeedtestUrl, "测速地址:注意 并发数*节点速度<最大网速 否则测速结果不准确\n尽量不要使用Speedtest,Cloudflare提供的下载链接,因为很多节点屏蔽测速网站。"); toolTip1.SetToolTip(textBox7, "将测速结果推送到Worker的地址。"); toolTip1.SetToolTip(textBox6, "Worker令牌。"); - toolTip1.SetToolTip(comboBox1, "测速结果的保存方法。"); + toolTip1.SetToolTip(comboBoxSaveMethod, "测速结果的保存方法。"); toolTip1.SetToolTip(textBox2, "Gist ID:注意!非Github用户名!"); toolTip1.SetToolTip(textBox3, "Github TOKEN"); - toolTip1.SetToolTip(comboBox4, "通用订阅:内置了Sub-Store程序,自适应订阅格式。\nClash订阅:带规则的 Mihomo、Clash 订阅格式。"); - toolTip1.SetToolTip(comboBox5, "生成带规则的 Clash 订阅所需的覆写规则文件"); + toolTip1.SetToolTip(comboBoxSubscriptionType, "通用订阅:内置了Sub-Store程序,自适应订阅格式。\nClash订阅:带规则的 Mihomo、Clash 订阅格式。"); + toolTip1.SetToolTip(comboBoxOverwriteUrls, "生成带规则的 Clash 订阅所需的覆写规则文件"); - toolTip1.SetToolTip(checkBox3, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); - toolTip1.SetToolTip(checkBox6, "总的下载速度限制,不选代表不限制"); - toolTip1.SetToolTip(numericUpDown8, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); + toolTip1.SetToolTip(checkBoxEnableSuccessLimit, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); + toolTip1.SetToolTip(checkBoxTotalBandwidthLimit, "总的下载速度限制,不选代表不限制"); + toolTip1.SetToolTip(numericUpDownSuccessLimit, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, "总的下载速度限制,不选代表不限制"); @@ -87,7 +87,7 @@ public Form1() toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); - toolTip1.SetToolTip(checkBox5, "开机启动:勾选后,程序将在Windows启动时自动运行"); + toolTip1.SetToolTip(checkBoxStartup, "开机启动:勾选后,程序将在Windows启动时自动运行"); // 设置通知图标的上下文菜单 SetupNotifyIconContextMenu(); } @@ -121,7 +121,7 @@ private void SetupNotifyIconContextMenu() startMenuItem = new ToolStripMenuItem("启动"); startMenuItem.Click += (sender, e) => { - if (button1.Text == "▶️ 启动") + if (buttonStartCheck.Text == "▶️ 启动") { button1_Click(sender, e); } @@ -131,7 +131,7 @@ private void SetupNotifyIconContextMenu() stopMenuItem = new ToolStripMenuItem("停止"); stopMenuItem.Click += (sender, e) => { - if (button1.Text == "⏹️ 停止") + if (buttonStartCheck.Text == "⏹️ 停止") { button1_Click(sender, e); } @@ -193,7 +193,7 @@ protected override void OnFormClosing(FormClosingEventArgs e) private async void timer1_Tick(object sender, EventArgs e)//初始化 { - timer1.Enabled = false; + timerinitial.Enabled = false; if (buttonAdvanceSettings.Text == "高级设置∧") button2_Click(sender, e); // 检查并创建config文件夹 string executablePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); @@ -220,13 +220,13 @@ private async void timer1_Tick(object sender, EventArgs e)//初始化 最新GUI版本号 = 当前GUI版本号; 标题 = "SubsCheck Win GUI " + 当前GUI版本号; this.Text = 标题;// + " TG:CMLiussss BY:CM喂饭 干货满满"; - comboBox1.Text = "本地"; - comboBox4.Text = "通用订阅"; + comboBoxSaveMethod.Text = "本地"; + comboBoxSubscriptionType.Text = "通用订阅"; ReadConfig(); if (checkBoxHighConcurrent.Checked) { - groupBox4.Location = new Point(groupBox4.Location.X, groupBox4.Location.Y + groupBoxPipe.Height); + groupBoxGist.Location = new Point(groupBoxGist.Location.X, groupBoxGist.Location.Y + groupBoxPipeConcurrent.Height); } if (CheckCommandLineParameter("-auto")) @@ -283,7 +283,7 @@ private bool IsNetworkAvailable() private async void ReadConfig()//读取配置文件 { - checkBox5.CheckedChanged -= checkBox5_CheckedChanged;// 临时移除事件处理器,防止触发事件 + checkBoxStartup.CheckedChanged -= checkBox5_CheckedChanged;// 临时移除事件处理器,防止触发事件 try { string executablePath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); @@ -378,19 +378,19 @@ private async void ReadConfig()//读取配置文件 int? checkIntervalValue = 读取config整数(config, "check-interval"); - if (checkIntervalValue.HasValue) numericUpDown2.Value = checkIntervalValue.Value; + if (checkIntervalValue.HasValue) numericUpDownInterval.Value = checkIntervalValue.Value; int? timeoutValue = 读取config整数(config, "timeout"); - if (timeoutValue.HasValue) numericUpDown3.Value = timeoutValue.Value; + if (timeoutValue.HasValue) numericUpDownTimeout.Value = timeoutValue.Value; int? minspeedValue = 读取config整数(config, "min-speed"); if (minspeedValue.HasValue) numericUpDownMinSpeed.Value = minspeedValue.Value; int? downloadtimeoutValue = 读取config整数(config, "download-timeout"); - if (downloadtimeoutValue.HasValue) numericUpDown5.Value = downloadtimeoutValue.Value; + if (downloadtimeoutValue.HasValue) numericUpDownDLTimehot.Value = downloadtimeoutValue.Value; int? downloadLimitSizeValue = 读取config整数(config, "download-mb"); - if (downloadLimitSizeValue.HasValue) numericUpDown9.Value = downloadLimitSizeValue.Value; + if (downloadLimitSizeValue.HasValue) numericUpDownDownloadMb.Value = downloadLimitSizeValue.Value; int? downloadLimitSpeedValue = 读取config整数(config, "total-speed-limit"); if (downloadLimitSpeedValue.HasValue) numericUpDownTotalBandwidthLimit.Value = downloadLimitSpeedValue.Value; @@ -398,8 +398,8 @@ private async void ReadConfig()//读取配置文件 string speedTestUrl = 读取config字符串(config, "speed-test-url"); if (speedTestUrl != null) { - comboBox2.Items.Add(speedTestUrl); - comboBox2.Text = speedTestUrl; + comboBoxSpeedtestUrl.Items.Add(speedTestUrl); + comboBoxSpeedtestUrl.Text = speedTestUrl; } string listenport = 读取config字符串(config, "listen-port"); @@ -413,7 +413,7 @@ private async void ReadConfig()//读取配置文件 string portStr = listenport.Substring(colonIndex + 1); if (decimal.TryParse(portStr, out decimal port)) { - numericUpDown6.Value = port; + numericUpDownWebUIPort.Value = port; } } } @@ -434,13 +434,13 @@ private async void ReadConfig()//读取配置文件 string portStr = substoreport.Substring(colonIndex + 1); if (decimal.TryParse(portStr, out decimal port)) { - numericUpDown7.Value = port; + numericUpDownSubStorePort.Value = port; } } } string githubproxy = 读取config字符串(config, "githubproxy"); - if (githubproxy != null) comboBox3.Text = githubproxy; + if (githubproxy != null) comboBoxGithubProxyUrl.Text = githubproxy; const string githubRawPrefix = "https://raw.githubusercontent.com/"; @@ -452,17 +452,17 @@ private async void ReadConfig()//读取配置文件 { if (mihomoOverwriteUrl.EndsWith("bdg.yaml", StringComparison.OrdinalIgnoreCase)) { - comboBox5.Text = "[内置]布丁狗的订阅转换"; + comboBoxOverwriteUrls.Text = "[内置]布丁狗的订阅转换"; await ProcessComboBox5Selection(); } else if (mihomoOverwriteUrl.EndsWith("ACL4SSR_Online_Full.yaml", StringComparison.OrdinalIgnoreCase)) { - comboBox5.Text = "[内置]ACL4SSR_Online_Full"; + comboBoxOverwriteUrls.Text = "[内置]ACL4SSR_Online_Full"; await ProcessComboBox5Selection(); } } - else if (mihomoOverwriteUrlIndex > 0) comboBox5.Text = mihomoOverwriteUrl.Substring(mihomoOverwriteUrlIndex); - else comboBox5.Text = mihomoOverwriteUrl; + else if (mihomoOverwriteUrlIndex > 0) comboBoxOverwriteUrls.Text = mihomoOverwriteUrl.Substring(mihomoOverwriteUrlIndex); + else comboBoxOverwriteUrls.Text = mihomoOverwriteUrl; } // 处理URLs,检查是否包含GitHub raw链接 @@ -475,7 +475,7 @@ private async void ReadConfig()//读取配置文件 for (int i = 0; i < subUrls.Count; i++) { // 排除本地URL - string localUrlPattern = $"http://127.0.0.1:{numericUpDown6.Value}/all.yaml"; + string localUrlPattern = $"http://127.0.0.1:{numericUpDownWebUIPort.Value}/all.yaml"; if (!subUrls[i].Equals(localUrlPattern, StringComparison.OrdinalIgnoreCase)) { // 处理GitHub raw链接 @@ -494,16 +494,16 @@ private async void ReadConfig()//读取配置文件 } // 将过滤后的列表中的每个URL放在单独的行上 - textBox1.Text = string.Join(Environment.NewLine, filteredUrls); + textBoxSubsUrls.Text = string.Join(Environment.NewLine, filteredUrls); } string renamenode = 读取config字符串(config, "rename-node"); - if (renamenode != null && renamenode == "true") checkBox1.Checked = true; - else checkBox1.Checked = false; + if (renamenode != null && renamenode == "true") checkBoxEnableRenameNode.Checked = true; + else checkBoxEnableRenameNode.Checked = false; string mediacheck = 读取config字符串(config, "media-check"); - if (mediacheck != null && mediacheck == "true") checkBox2.Checked = true; - else checkBox2.Checked = false; + if (mediacheck != null && mediacheck == "true") checkBoxEnableMediaCheck.Checked = true; + else checkBoxEnableMediaCheck.Checked = false; string githubapimirror = 读取config字符串(config, "github-api-mirror"); if (githubapimirror != null) textBox4.Text = githubapimirror; @@ -512,8 +512,8 @@ private async void ReadConfig()//读取配置文件 string savemethod = 读取config字符串(config, "save-method"); if (savemethod != null) { - if (savemethod == "local") comboBox1.Text = "本地"; - else comboBox1.Text = savemethod; + if (savemethod == "local") comboBoxSaveMethod.Text = "本地"; + else comboBoxSaveMethod.Text = savemethod; } string githubgistid = 读取config字符串(config, "github-gist-id"); @@ -541,14 +541,14 @@ private async void ReadConfig()//读取配置文件 { if (successlimit.Value == 0) { - checkBox3.Checked = false; - numericUpDown8.Enabled = false; + checkBoxEnableSuccessLimit.Checked = false; + numericUpDownSuccessLimit.Enabled = false; } else { - checkBox3.Checked = true; - numericUpDown8.Enabled = true; - numericUpDown8.Value = successlimit.Value; + checkBoxEnableSuccessLimit.Checked = true; + numericUpDownSuccessLimit.Enabled = true; + numericUpDownSuccessLimit.Value = successlimit.Value; } } @@ -557,42 +557,42 @@ private async void ReadConfig()//读取配置文件 { if (totalspeedlimit.Value == 0) { - checkBox6.Checked = false; + checkBoxTotalBandwidthLimit.Checked = false; numericUpDownTotalBandwidthLimit.Enabled = false; } else { - checkBox6.Checked = true; + checkBoxTotalBandwidthLimit.Checked = true; numericUpDownTotalBandwidthLimit.Enabled = true; numericUpDownTotalBandwidthLimit.Value = totalspeedlimit.Value; } } string enablewebui = 读取config字符串(config, "enable-web-ui"); - if (enablewebui != null && enablewebui == "true") checkBox4.Checked = true; - else checkBox4.Checked = false; + if (enablewebui != null && enablewebui == "true") checkBoxEnableWebUI.Checked = true; + else checkBoxEnableWebUI.Checked = false; string apikey = 读取config字符串(config, "api-key"); if (apikey != null) { if (apikey == GetComputerNameMD5()) { - checkBox4.Checked = false; + checkBoxEnableWebUI.Checked = false; string oldapikey = 读取config字符串(config, "old-api-key"); if (oldapikey != null) { - textBox10.Text = oldapikey; + textBoxWebUiAPIKey.Text = oldapikey; } else { - textBox10.PasswordChar = '\0'; - textBox10.Text = "请输入密钥"; - textBox10.ForeColor = Color.Gray; + textBoxWebUiAPIKey.PasswordChar = '\0'; + textBoxWebUiAPIKey.Text = "请输入密钥"; + textBoxWebUiAPIKey.ForeColor = Color.Gray; } } else { - textBox10.Text = apikey; + textBoxWebUiAPIKey.Text = apikey; } } @@ -601,22 +601,22 @@ private async void ReadConfig()//读取配置文件 { textBoxCron.Text = cronexpression; string cronDescription = GetCronExpressionDescription(textBoxCron.Text); - labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); - textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDown2.Location.Y); + labelCron.Location = new Point(labelCron.Location.X, labelInterval.Location.Y); + textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDownInterval.Location.Y); labelCron.Visible = true; textBoxCron.Visible = true; - label2.Visible = false; - numericUpDown2.Visible = false; + labelInterval.Visible = false; + numericUpDownInterval.Visible = false; } string guiauto = 读取config字符串(config, "gui-auto"); - if (guiauto != null && guiauto == "true") checkBox5.Checked = true; - else checkBox5.Checked = false; + if (guiauto != null && guiauto == "true") checkBoxStartup.Checked = true; + else checkBoxStartup.Checked = false; } else { - comboBox3.Text = "自动选择"; - comboBox5.Text = "[内置]布丁狗的订阅转换"; + comboBoxGithubProxyUrl.Text = "自动选择"; + comboBoxOverwriteUrls.Text = "[内置]布丁狗的订阅转换"; } } catch (Exception ex) @@ -624,7 +624,7 @@ private async void ReadConfig()//读取配置文件 MessageBox.Show($"读取配置文件时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } - checkBox5.CheckedChanged += checkBox5_CheckedChanged;// 重新绑定事件处理器 + checkBoxStartup.CheckedChanged += checkBox5_CheckedChanged;// 重新绑定事件处理器 } private int? 读取config整数(Dictionary config, string fieldName) @@ -687,19 +687,19 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["drop-bad-cf-nodes"] = checkBoxDropBadCFNodes.Checked; - config["check-interval"] = (int)numericUpDown2.Value; + config["check-interval"] = (int)numericUpDownInterval.Value; if (textBoxCron.Visible) config["cron-expression"] = textBoxCron.Text; - config["timeout"] = (int)numericUpDown3.Value; + config["timeout"] = (int)numericUpDownTimeout.Value; config["min-speed"] = (int)numericUpDownMinSpeed.Value; - config["download-timeout"] = (int)numericUpDown5.Value; - config["download-mb"] = (int)numericUpDown9.Value; + config["download-timeout"] = (int)numericUpDownDLTimehot.Value; + config["download-mb"] = (int)numericUpDownDownloadMb.Value; config["total-speed-limit"] = (int)numericUpDownTotalBandwidthLimit.Value; - if (!string.IsNullOrEmpty(comboBox2.Text)) config["speed-test-url"] = comboBox2.Text; + if (!string.IsNullOrEmpty(comboBoxSpeedtestUrl.Text)) config["speed-test-url"] = comboBoxSpeedtestUrl.Text; // 保存save-method,将"本地"转换为"local" - config["save-method"] = comboBox1.Text == "本地" ? "local" : comboBox1.Text; + config["save-method"] = comboBoxSaveMethod.Text == "本地" ? "local" : comboBoxSaveMethod.Text; // 保存gist参数 config["github-gist-id"] = textBox2.Text; @@ -720,21 +720,21 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["enable-web-ui"] = true; // 保存listen-port - if (checkBox4.Checked) + if (checkBoxEnableWebUI.Checked) { - WebUIapiKey = textBox10.Text; - config["listen-port"] = $@":{numericUpDown6.Value}"; + WebUIapiKey = textBoxWebUiAPIKey.Text; + config["listen-port"] = $@":{numericUpDownWebUIPort.Value}"; } else { WebUIapiKey = GetComputerNameMD5(); - config["listen-port"] = $@"127.0.0.1:{numericUpDown6.Value}"; - if (textBox10.Text != "请输入密钥") config["old-api-key"] = textBox10.Text; + config["listen-port"] = $@"127.0.0.1:{numericUpDownWebUIPort.Value}"; + if (textBoxWebUiAPIKey.Text != "请输入密钥") config["old-api-key"] = textBoxWebUiAPIKey.Text; } config["api-key"] = WebUIapiKey; // 保存sub-store-port - config["sub-store-port"] = $@":{numericUpDown7.Value}"; + config["sub-store-port"] = $@":{numericUpDownSubStorePort.Value}"; string githubRawPrefix = "https://raw.githubusercontent.com/"; if (githubProxyCheck) @@ -743,8 +743,8 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 githubProxyURL = await GetGithubProxyUrlAsync(); } - if (comboBox3.Text != "自动选择") githubProxyURL = $"https://{comboBox3.Text}/"; - config["githubproxy"] = comboBox3.Text; + if (comboBoxGithubProxyUrl.Text != "自动选择") githubProxyURL = $"https://{comboBoxGithubProxyUrl.Text}/"; + config["githubproxy"] = comboBoxGithubProxyUrl.Text; config["github-proxy"] = githubProxyURL; // 保存sub-urls列表 @@ -752,13 +752,13 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 string allyamlFilePath = System.IO.Path.Combine(executablePath, "output", "all.yaml"); if (System.IO.File.Exists(allyamlFilePath)) { - subUrls.Add($"http://127.0.0.1:{numericUpDown6.Value}/all.yaml"); + subUrls.Add($"http://127.0.0.1:{numericUpDownWebUIPort.Value}/all.yaml"); Log("已加载上次测试结果。"); } - if (!string.IsNullOrEmpty(textBox1.Text)) + if (!string.IsNullOrEmpty(textBoxSubsUrls.Text)) { - subUrls.AddRange(textBox1.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList()); + subUrls.AddRange(textBoxSubsUrls.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList()); // 处理URLs for (int i = 0; i < subUrls.Count; i++) { @@ -775,7 +775,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["sub-urls"] = subUrls; // 处理配置文件下载与配置 - if (comboBox5.Text.Contains("[内置]")) + if (comboBoxOverwriteUrls.Text.Contains("[内置]")) { // 确定文件名和下载URL string fileName; @@ -783,7 +783,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 string downloadUrl; string displayName; - if (comboBox5.Text.Contains("[内置]布丁狗")) + if (comboBoxOverwriteUrls.Text.Contains("[内置]布丁狗")) { fileName = "bdg.yaml"; displayName = "[内置]布丁狗的订阅转换"; @@ -816,16 +816,16 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 else { Log($"{displayName} 覆写配置文件 加载成功。"); - config["mihomo-overwrite-url"] = $"http://127.0.0.1:{numericUpDown6.Value}/{fileName}"; + config["mihomo-overwrite-url"] = $"http://127.0.0.1:{numericUpDownWebUIPort.Value}/{fileName}"; } } - else if (comboBox5.Text.StartsWith(githubRawPrefix)) config["mihomo-overwrite-url"] = githubProxyURL + comboBox5.Text; - else config["mihomo-overwrite-url"] = comboBox5.Text != "" ? comboBox5.Text : $"http://127.0.0.1:{numericUpDown6.Value}/ACL4SSR_Online_Full.yaml"; + else if (comboBoxOverwriteUrls.Text.StartsWith(githubRawPrefix)) config["mihomo-overwrite-url"] = githubProxyURL + comboBoxOverwriteUrls.Text; + else config["mihomo-overwrite-url"] = comboBoxOverwriteUrls.Text != "" ? comboBoxOverwriteUrls.Text : $"http://127.0.0.1:{numericUpDownWebUIPort.Value}/ACL4SSR_Online_Full.yaml"; config["enable-high-concurrent"] = checkBoxHighConcurrent.Checked;//使用自适应高并发版本 config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 - config["rename-node"] = checkBox1.Checked;//以节点IP查询位置重命名节点 - config["media-check"] = checkBox2.Checked;//是否开启流媒体检测 + config["rename-node"] = checkBoxEnableRenameNode.Checked;//以节点IP查询位置重命名节点 + config["media-check"] = checkBoxEnableMediaCheck.Checked;//是否开启流媒体检测 config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["keep-success-proxies"] = false; config["print-progress"] = false;//是否显示进度 @@ -834,14 +834,14 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["subscheck-arch"] = currentArch; //当前subsCheck架构 config["subscheck-kernel"] = currentKernel; //当前内核 - config["gui-auto"] = checkBox5.Checked;//是否开机自启 + config["gui-auto"] = checkBoxStartup.Checked;//是否开机自启 //保存几个成功的节点,为0代表不限制 - if (checkBox3.Checked) config["success-limit"] = (int)numericUpDown8.Value; + if (checkBoxEnableSuccessLimit.Checked) config["success-limit"] = (int)numericUpDownSuccessLimit.Value; else config["success-limit"] = 0; //下载速度限制,为0代表不限制 - if (checkBox6.Checked) config["total-speed-limit"] = (int)numericUpDownTotalBandwidthLimit.Value; + if (checkBoxTotalBandwidthLimit.Checked) config["total-speed-limit"] = (int)numericUpDownTotalBandwidthLimit.Value; else config["total-speed-limit"] = 0; // 使用YamlDotNet序列化配置 @@ -912,7 +912,7 @@ private void button2_Click(object sender, EventArgs e) if (!_originalLocationSaved) { _originalLocationSaved = true; - _pipeOriginalLocation = groupBoxPipe.Location; + _pipeOriginalLocation = groupBoxPipeConcurrent.Location; _enhanceOriginalLocation = groupBoxEnhance.Location; } //展开状态 @@ -922,19 +922,19 @@ private void button2_Click(object sender, EventArgs e) groupBoxAdvanceSettings.Visible = false; if (!checkBoxHighConcurrent.Checked) { - groupBoxPipe.Visible = false; + groupBoxPipeConcurrent.Visible = false; groupBoxEnhance.Visible = false; - groupBox4.Location = _pipeOriginalLocation; - groupBox5.Location = _pipeOriginalLocation; - groupBox6.Location = _pipeOriginalLocation; + groupBoxGist.Location = _pipeOriginalLocation; + groupBoxR2.Location = _pipeOriginalLocation; + groupBoxWebdav.Location = _pipeOriginalLocation; } else { - groupBoxPipe.Visible = true; + groupBoxPipeConcurrent.Visible = true; groupBoxEnhance.Visible = true; - groupBoxPipe.Location = groupBoxAdvanceSettings.Location; + groupBoxPipeConcurrent.Location = groupBoxAdvanceSettings.Location; groupBoxEnhance.Location = new Point(groupBoxEnhance.Location.X, groupBoxAdvanceSettings.Location.Y); } } @@ -945,14 +945,14 @@ private void button2_Click(object sender, EventArgs e) groupBoxAdvanceSettings.Visible = true; if (!checkBoxHighConcurrent.Checked) { - groupBoxPipe.Visible = false; + groupBoxPipeConcurrent.Visible = false; groupBoxEnhance.Visible = false; } else { - groupBoxPipe.Visible = true; + groupBoxPipeConcurrent.Visible = true; groupBoxEnhance.Visible = true; - groupBoxPipe.Location = _pipeOriginalLocation; + groupBoxPipeConcurrent.Location = _pipeOriginalLocation; groupBoxEnhance.Location = _enhanceOriginalLocation; } } @@ -961,50 +961,50 @@ private void button2_Click(object sender, EventArgs e) private async void button1_Click(object sender, EventArgs e) { - button1.Enabled = false; - if (button1.Text == "▶️ 启动") + buttonStartCheck.Enabled = false; + if (buttonStartCheck.Text == "▶️ 启动") { - if (checkBox4.Checked && textBox10.Text == "请输入密钥") + if (checkBoxEnableWebUI.Checked && textBoxWebUiAPIKey.Text == "请输入密钥") { MessageBox.Show("您已启用WebUI,请设置WebUI API密钥!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } run = 1; - if (button3.Enabled == false) + if (buttonCopySubscriptionUrl.Enabled == false) { string executablePath = Path.GetDirectoryName(Application.ExecutablePath); string allyamlFilePath = Path.Combine(executablePath, "output", "all.yaml"); - button3.Enabled = File.Exists(allyamlFilePath); + buttonCopySubscriptionUrl.Enabled = File.Exists(allyamlFilePath); } numericUpDownConcurrent.Enabled = false; - numericUpDown2.Enabled = false; + numericUpDownInterval.Enabled = false; labelCron.Enabled = false; textBoxCron.Enabled = false; - numericUpDown3.Enabled = false; + numericUpDownTimeout.Enabled = false; numericUpDownMinSpeed.Enabled = false; - numericUpDown5.Enabled = false; - numericUpDown9.Enabled = false; + numericUpDownDLTimehot.Enabled = false; + numericUpDownDownloadMb.Enabled = false; numericUpDownTotalBandwidthLimit.Enabled = false; - numericUpDown6.Enabled = false; - numericUpDown7.Enabled = false; + numericUpDownWebUIPort.Enabled = false; + numericUpDownSubStorePort.Enabled = false; // 运行时禁用流水线并发和增强标签相关设置项 - groupBoxPipe.Enabled = false; + groupBoxPipeConcurrent.Enabled = false; groupBoxEnhance.Enabled = false; - comboBox1.Enabled = false; - textBox1.Enabled = false; + comboBoxSaveMethod.Enabled = false; + textBoxSubsUrls.Enabled = false; groupBoxAdvanceSettings.Enabled = false; - groupBox4.Enabled = false; - groupBox5.Enabled = false; - groupBox6.Enabled = false; - if (checkBox4.Checked) button6.Enabled = true; - button1.Text = "⏹️ 停止"; + groupBoxGist.Enabled = false; + groupBoxR2.Enabled = false; + groupBoxWebdav.Enabled = false; + if (checkBoxEnableWebUI.Checked) buttonWebUi.Enabled = true; + buttonStartCheck.Text = "⏹️ 停止"; //timer3.Enabled = true; // 清空 richTextBox1 - richTextBox1.Clear(); + richTextBoxAllLog.Clear(); await KillNodeProcessAsync(); await SaveConfig(); @@ -1027,51 +1027,51 @@ private async void button1_Click(object sender, EventArgs e) { run = 0; Log("任务停止"); - progressBar1.Value = 0; - progressBar1.Visible = false; - LogLabelNodeInfo.Text = "实时日志"; + progressBarAll.Value = 0; + progressBarAll.Visible = false; + labelLogNodeInfo.Text = "实时日志"; notifyIcon1.Text = "SubsCheck: 未运行"; // 停止 subs-check.exe 程序 StopSubsCheckProcess(); // 结束 Sub-Store await KillNodeProcessAsync(); - if (checkBox4.Checked) ReadConfig(); - button3.Enabled = false; + if (checkBoxEnableWebUI.Checked) ReadConfig(); + buttonCopySubscriptionUrl.Enabled = false; numericUpDownConcurrent.Enabled = true; - numericUpDown2.Enabled = true; + numericUpDownInterval.Enabled = true; labelCron.Enabled = true; textBoxCron.Enabled = true; - numericUpDown3.Enabled = true; + numericUpDownTimeout.Enabled = true; numericUpDownMinSpeed.Enabled = true; - numericUpDown5.Enabled = true; - numericUpDown9.Enabled = true; + numericUpDownDLTimehot.Enabled = true; + numericUpDownDownloadMb.Enabled = true; numericUpDownTotalBandwidthLimit.Enabled = true; - numericUpDown6.Enabled = true; - numericUpDown7.Enabled = true; + numericUpDownWebUIPort.Enabled = true; + numericUpDownSubStorePort.Enabled = true; // 重新启用 - groupBoxPipe.Enabled = true; + groupBoxPipeConcurrent.Enabled = true; groupBoxEnhance.Enabled = true; - comboBox1.Enabled = true; - textBox1.Enabled = true; + comboBoxSaveMethod.Enabled = true; + textBoxSubsUrls.Enabled = true; groupBoxAdvanceSettings.Enabled = true; - groupBox4.Enabled = true; - groupBox5.Enabled = true; - groupBox6.Enabled = true; - button6.Enabled = false; - button1.Text = "▶️ 启动"; + groupBoxGist.Enabled = true; + groupBoxR2.Enabled = true; + groupBoxWebdav.Enabled = true; + buttonWebUi.Enabled = false; + buttonStartCheck.Text = "▶️ 启动"; //timer3.Enabled = false; // 更新菜单项的启用状态 startMenuItem.Enabled = true; stopMenuItem.Enabled = false; } - if (downloading == 0) button1.Enabled = true; + if (downloading == 0) buttonStartCheck.Enabled = true; } public async Task DownloadSubsCheckEXE() { - button1.Enabled = false; + buttonStartCheck.Enabled = false; downloading = 1; try { @@ -1276,8 +1276,8 @@ public async Task DownloadSubsCheckEXE() Log($"所有下载尝试均失败,最后错误: {failureReason}", true); MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); - progressBar1.Value = 0; - progressBar1.Visible = false; + progressBarAll.Value = 0; + progressBarAll.Visible = false; return; } @@ -1331,7 +1331,7 @@ public async Task DownloadSubsCheckEXE() } finally { - button1.Enabled = true; + buttonStartCheck.Enabled = true; downloading = 0; } } @@ -1483,9 +1483,9 @@ private async void StartSubsCheckProcess() try { // 重置进度条 - progressBar1.Value = 0; - progressBar1.Visible = true; - LogLabelNodeInfo.Text = "实时日志"; + progressBarAll.Value = 0; + progressBarAll.Visible = true; + labelLogNodeInfo.Text = "实时日志"; using (MemoryStream ms = new MemoryStream(Properties.Resources.going)) { notifyIcon1.Icon = new Icon(ms); @@ -1565,19 +1565,19 @@ private async void StartSubsCheckProcess() subsCheckProcess.Exited += SubsCheckProcess_Exited; Log($"subs-check.exe {当前subsCheck版本号} 已启动..."); - timer4.Enabled = true; + timerRefresh.Enabled = true; } catch (Exception ex) { Log($"启动 subs-check.exe 时出错: {ex.Message}", true); - button1.Text = "▶️ 启动"; + buttonStartCheck.Text = "▶️ 启动"; } } private void StopSubsCheckProcess() { - timer4.Enabled = false; + timerRefresh.Enabled = false; if (subsCheckProcess != null && !subsCheckProcess.HasExited) { try @@ -1587,8 +1587,8 @@ private void StopSubsCheckProcess() subsCheckProcess.WaitForExit(); Log("subs-check.exe 已停止"); notifyIcon1.Icon = originalNotifyIcon; - button7.Enabled = false; - button7.Text = "🔀未启动"; + buttonTriggerCheck.Enabled = false; + buttonTriggerCheck.Text = "🔀未启动"; } catch (Exception ex) { @@ -1645,14 +1645,14 @@ private void SubsCheckProcess_OutputDataReceived(object sender, DataReceivedEven // 一次性“下次检查时间” if (clean.Contains("下次检查时间:")) { - if (!button3.Enabled) + if (!buttonCopySubscriptionUrl.Enabled) { string executablePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); string outputFolderPath = System.IO.Path.Combine(executablePath, "output"); if (System.IO.Directory.Exists(outputFolderPath)) { string allyamlFilePath = System.IO.Path.Combine(outputFolderPath, "all.yaml"); - if (System.IO.File.Exists(allyamlFilePath)) button3.Enabled = true; + if (System.IO.File.Exists(allyamlFilePath)) buttonCopySubscriptionUrl.Enabled = true; } } int startIndex = clean.IndexOf("下次检查时间:"); @@ -1671,16 +1671,16 @@ private void SubsCheckProcess_OutputDataReceived(object sender, DataReceivedEven } // 批量追加时暂时禁用重绘,减少闪烁 - SuspendRedraw(richTextBox1); + SuspendRedraw(richTextBoxAllLog); try { - richTextBox1.AppendText(sb.ToString()); - richTextBox1.SelectionStart = richTextBox1.TextLength; - richTextBox1.ScrollToCaret(); + richTextBoxAllLog.AppendText(sb.ToString()); + richTextBoxAllLog.SelectionStart = richTextBoxAllLog.TextLength; + richTextBoxAllLog.ScrollToCaret(); } finally { - ResumeRedraw(richTextBox1); + ResumeRedraw(richTextBoxAllLog); } // 若已消费完,停止定时器 @@ -1791,7 +1791,7 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) BeginInvoke(new Action(() => { Log("subs-check.exe 已退出"); - button1.Text = "▶️ 启动"; + buttonStartCheck.Text = "▶️ 启动"; // 更新菜单项的启用状态 startMenuItem.Enabled = true; @@ -1799,17 +1799,17 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) // 重新启用控件 numericUpDownConcurrent.Enabled = true; - numericUpDown2.Enabled = true; - numericUpDown3.Enabled = true; + numericUpDownInterval.Enabled = true; + numericUpDownTimeout.Enabled = true; numericUpDownMinSpeed.Enabled = true; - numericUpDown5.Enabled = true; - numericUpDown9.Enabled = true; + numericUpDownDLTimehot.Enabled = true; + numericUpDownDownloadMb.Enabled = true; numericUpDownTotalBandwidthLimit.Enabled = true; - numericUpDown6.Enabled = true; - textBox1.Enabled = true; + numericUpDownWebUIPort.Enabled = true; + textBoxSubsUrls.Enabled = true; groupBoxAdvanceSettings.Enabled = true; // 重新启用 - groupBoxPipe.Enabled = true; + groupBoxPipeConcurrent.Enabled = true; groupBoxEnhance.Enabled = true; })); } @@ -1968,12 +1968,12 @@ private void button3_Click(object sender, EventArgs e) try { // 构造URL - string url = comboBox4.Text == "Clash" ? $"http://{本地IP}:{numericUpDown7.Value}/api/file/mihomo" : $"http://{本地IP}:{numericUpDown7.Value}/download/sub"; + string url = comboBoxSubscriptionType.Text == "Clash" ? $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/mihomo" : $"http://{本地IP}:{numericUpDownSubStorePort.Value}/download/sub"; // 将URL复制到剪贴板 Clipboard.SetText(url); - button3.Text = "复制成功"; - timer2.Enabled = true; + buttonCopySubscriptionUrl.Text = "复制成功"; + timerCopySubscriptionUrl.Enabled = true; // 可选:显示提示消息 //MessageBox.Show($"URL已复制到剪贴板:\n{url}", "复制成功", MessageBoxButtons.OK, MessageBoxIcon.Information); } @@ -1986,33 +1986,33 @@ private void button3_Click(object sender, EventArgs e) private void timer2_Tick(object sender, EventArgs e) { - button3.Text = "复制订阅"; + buttonCopySubscriptionUrl.Text = "复制订阅"; } private void comboBox2_Leave(object sender, EventArgs e) { // 检查是否有内容 - if (string.IsNullOrWhiteSpace(comboBox2.Text)) + if (string.IsNullOrWhiteSpace(comboBoxSpeedtestUrl.Text)) { return; } - string input = comboBox2.Text.Trim(); + string input = comboBoxSpeedtestUrl.Text.Trim(); // 更新 comboBox2 的文本和选项 - comboBox2.Items.Add(input); - comboBox2.Text = input; + comboBoxSpeedtestUrl.Items.Add(input); + comboBoxSpeedtestUrl.Text = input; } private void comboBox3_Leave(object sender, EventArgs e) { // 检查是否有内容 - if (string.IsNullOrWhiteSpace(comboBox3.Text)) + if (string.IsNullOrWhiteSpace(comboBoxGithubProxyUrl.Text)) { - comboBox3.Text = "自动选择"; + comboBoxGithubProxyUrl.Text = "自动选择"; return; } - string input = comboBox3.Text.Trim(); + string input = comboBoxGithubProxyUrl.Text.Trim(); // 检查是否存在 "://" 协议部分 int protocolIndex = input.IndexOf("://"); @@ -2031,59 +2031,59 @@ private void comboBox3_Leave(object sender, EventArgs e) } // 更新 comboBox3 的文本 - comboBox3.Text = input; + comboBoxGithubProxyUrl.Text = input; } private void 判断保存类型() { - if (comboBox1.Text == "本地" || buttonAdvanceSettings.Text == "高级设置∨") + if (comboBoxSaveMethod.Text == "本地" || buttonAdvanceSettings.Text == "高级设置∨") { - groupBox4.Visible = false; - groupBox5.Visible = false; - groupBox6.Visible = false; + groupBoxGist.Visible = false; + groupBoxR2.Visible = false; + groupBoxWebdav.Visible = false; } - else if (comboBox1.Text == "gist" && buttonAdvanceSettings.Text == "高级设置∧") + else if (comboBoxSaveMethod.Text == "gist" && buttonAdvanceSettings.Text == "高级设置∧") { if (!checkBoxHighConcurrent.Checked) { - groupBox4.Location = _pipeOriginalLocation; + groupBoxGist.Location = _pipeOriginalLocation; } - groupBox4.Visible = true; + groupBoxGist.Visible = true; - groupBox5.Visible = false; - groupBox6.Visible = false; + groupBoxR2.Visible = false; + groupBoxWebdav.Visible = false; } - else if (comboBox1.Text == "r2" && buttonAdvanceSettings.Text == "高级设置∧") + else if (comboBoxSaveMethod.Text == "r2" && buttonAdvanceSettings.Text == "高级设置∧") { if (!checkBoxHighConcurrent.Checked) { - groupBox5.Location = _pipeOriginalLocation; + groupBoxR2.Location = _pipeOriginalLocation; } - groupBox5.Location = groupBox4.Location; - groupBox5.Visible = true; + groupBoxR2.Location = groupBoxGist.Location; + groupBoxR2.Visible = true; - groupBox4.Visible = false; - groupBox6.Visible = false; + groupBoxGist.Visible = false; + groupBoxWebdav.Visible = false; } - else if (comboBox1.Text == "webdav" && buttonAdvanceSettings.Text == "高级设置∧") + else if (comboBoxSaveMethod.Text == "webdav" && buttonAdvanceSettings.Text == "高级设置∧") { if (!checkBoxHighConcurrent.Checked) { - groupBox6.Location = _pipeOriginalLocation; + groupBoxWebdav.Location = _pipeOriginalLocation; } - groupBox6.Location = groupBox4.Location; - groupBox6.Visible = true; + groupBoxWebdav.Location = groupBoxGist.Location; + groupBoxWebdav.Visible = true; - groupBox4.Visible = false; - groupBox5.Visible = false; + groupBoxGist.Visible = false; + groupBoxR2.Visible = false; } } private void comboBox1_TextChanged(object sender, EventArgs e) { 判断保存类型(); - if (!(comboBox1.Text == "本地" || comboBox1.Text == "") && buttonAdvanceSettings.Text == "高级设置∨") button2_Click(sender, e); + if (!(comboBoxSaveMethod.Text == "本地" || comboBoxSaveMethod.Text == "") && buttonAdvanceSettings.Text == "高级设置∨") button2_Click(sender, e); } private void textBox3_Enter(object sender, EventArgs e) @@ -2102,27 +2102,27 @@ private void textBox3_Leave(object sender, EventArgs e) private void textBox10_Enter(object sender, EventArgs e) { - textBox10.PasswordChar = '\0'; - if (textBox10.Text == "请输入密钥") + textBoxWebUiAPIKey.PasswordChar = '\0'; + if (textBoxWebUiAPIKey.Text == "请输入密钥") { - textBox10.Text = ""; - textBox10.ForeColor = Color.Black; + textBoxWebUiAPIKey.Text = ""; + textBoxWebUiAPIKey.ForeColor = Color.Black; } } private void textBox10_Leave(object sender, EventArgs e) { - if (textBox10.Text == "") + if (textBoxWebUiAPIKey.Text == "") { - textBox10.PasswordChar = '\0'; - textBox10.Text = "请输入密钥"; - textBox10.ForeColor = Color.Gray; + textBoxWebUiAPIKey.PasswordChar = '\0'; + textBoxWebUiAPIKey.Text = "请输入密钥"; + textBoxWebUiAPIKey.ForeColor = Color.Gray; } else { - textBox10.ForeColor = Color.Black; - textBox10.PasswordChar = '*'; + textBoxWebUiAPIKey.ForeColor = Color.Black; + textBoxWebUiAPIKey.PasswordChar = '*'; } } @@ -2166,15 +2166,15 @@ private void Log(string message, bool isError = false) { string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string logType = isError ? "ERR" : "INF"; - richTextBox1.AppendText($"{timestamp} {logType} {message}\r\n"); + richTextBoxAllLog.AppendText($"{timestamp} {logType} {message}\r\n"); - if (richTextBox1.IsHandleCreated) + if (richTextBoxAllLog.IsHandleCreated) { - richTextBox1.BeginInvoke((MethodInvoker)(() => + richTextBoxAllLog.BeginInvoke((MethodInvoker)(() => { // 滚动到最底部 - richTextBox1.SelectionStart = richTextBox1.Text.Length; - richTextBox1.ScrollToCaret(); + richTextBoxAllLog.SelectionStart = richTextBoxAllLog.Text.Length; + richTextBoxAllLog.ScrollToCaret(); })); } } @@ -2246,7 +2246,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { string checkUrl = $"https://{proxyItem}/https://raw.githubusercontent.com/cmliu/SubsCheck-Win-GUI/master/packages.config"; Log($"正在测试 GitHub 代理: {proxyItem}"); - richTextBox1.Refresh(); + richTextBoxAllLog.Refresh(); try { @@ -2272,7 +2272,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { // 记录错误但继续尝试下一个 Log($"代理 {proxyItem} 测试失败: {ex.Message}", true); - richTextBox1.Refresh(); + richTextBoxAllLog.Refresh(); } } @@ -2293,10 +2293,10 @@ private async void button5_Click(object sender, EventArgs e) { try { - button5.Enabled = false; - button1.Enabled = false; + buttonUpdateKernel.Enabled = false; + buttonStartCheck.Enabled = false; // 清空日志 - richTextBox1.Clear(); + richTextBoxAllLog.Clear(); Log("开始检查和下载最新版本的 subs-check.exe..."); // 获取当前应用程序目录 @@ -2338,7 +2338,7 @@ private async void button5_Click(object sender, EventArgs e) { Log($"删除 subs-check.exe 时出错: {ex.Message}", true); MessageBox.Show($"无法删除现有的 subs-check.exe 文件: {ex.Message}\n\n请手动删除后重试,或者检查文件是否被其他程序占用。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); - button5.Enabled = true; + buttonUpdateKernel.Enabled = true; return; } } @@ -2367,8 +2367,8 @@ private async void button5_Click(object sender, EventArgs e) } finally { - button5.Enabled = true; - button1.Enabled = true; + buttonUpdateKernel.Enabled = true; + buttonStartCheck.Enabled = true; } } @@ -2377,7 +2377,7 @@ private async void button5_Click(object sender, EventArgs e) private void numericUpDown6_ValueChanged(object sender, EventArgs e) { // 检查numericUpDown7是否存在并且与numericUpDown6的值相等 - if (numericUpDown6.Value == numericUpDown7.Value) + if (numericUpDownWebUIPort.Value == numericUpDownSubStorePort.Value) { // 显示警告消息 MessageBox.Show("订阅端口 和 Sub-Store端口 不能相同!", @@ -2386,14 +2386,14 @@ private void numericUpDown6_ValueChanged(object sender, EventArgs e) MessageBoxIcon.Warning); // 将numericUpDown6的值恢复为更改前的值 - numericUpDown6.Value = 订阅端口; - numericUpDown7.Value = SubStore端口; + numericUpDownWebUIPort.Value = 订阅端口; + numericUpDownSubStorePort.Value = SubStore端口; } else { // 保存当前值作为下次比较的基准 - 订阅端口 = numericUpDown6.Value; - SubStore端口 = numericUpDown7.Value; + 订阅端口 = numericUpDownWebUIPort.Value; + SubStore端口 = numericUpDownSubStorePort.Value; } } @@ -2481,15 +2481,15 @@ await Task.Run(() => private async void textBox1_DoubleClick(object sender, EventArgs e) { - if (textBox1.Enabled) + if (textBoxSubsUrls.Enabled) { // 创建EditURLs窗口的实例 EditURLs editURLsForm = new EditURLs(); // 传递当前textBox1的内容到EditURLs窗口 - editURLsForm.UrlContent = textBox1.Text + "\n"; - editURLsForm.githubProxys = comboBox3.Items; - editURLsForm.githubProxy = comboBox3.Text; + editURLsForm.UrlContent = textBoxSubsUrls.Text + "\n"; + editURLsForm.githubProxys = comboBoxGithubProxyUrl.Items; + editURLsForm.githubProxy = comboBoxGithubProxyUrl.Text; // 显示对话框并等待结果 DialogResult result = editURLsForm.ShowDialog(); @@ -2511,7 +2511,7 @@ private async void textBox1_DoubleClick(object sender, EventArgs e) lines = lines.Where(line => !string.IsNullOrWhiteSpace(line)).ToArray(); // 将处理后的内容更新到Form1的textBox1 - textBox1.Text = string.Join(Environment.NewLine, lines); + textBoxSubsUrls.Text = string.Join(Environment.NewLine, lines); await SaveConfig(false); Log("已保存订阅地址列表。"); } @@ -2521,17 +2521,17 @@ private async void textBox1_DoubleClick(object sender, EventArgs e) private void checkBox1_CheckedChanged(object sender, EventArgs e) { - if (checkBox1.Checked == false) checkBox2.Checked = false; + if (checkBoxEnableRenameNode.Checked == false) checkBoxEnableMediaCheck.Checked = false; } private void checkBox2_CheckedChanged(object sender, EventArgs e) { - if (checkBox2.Checked == true) checkBox1.Checked = true; + if (checkBoxEnableMediaCheck.Checked == true) checkBoxEnableRenameNode.Checked = true; } private async void timer3_Tick(object sender, EventArgs e) { - if (button1.Text == "⏹️ 停止") + if (buttonStartCheck.Text == "⏹️ 停止") { Log("subs-check.exe 运行时满24小时,自动重启清理内存占用。"); // 停止 subs-check.exe 程序 @@ -2541,21 +2541,21 @@ private async void timer3_Tick(object sender, EventArgs e) // 重新启动 subs-check.exe 程序 StartSubsCheckProcess(); numericUpDownConcurrent.Enabled = false; - numericUpDown2.Enabled = false; - numericUpDown3.Enabled = false; + numericUpDownInterval.Enabled = false; + numericUpDownTimeout.Enabled = false; numericUpDownMinSpeed.Enabled = false; - numericUpDown5.Enabled = false; - numericUpDown9.Enabled = false; + numericUpDownDLTimehot.Enabled = false; + numericUpDownDownloadMb.Enabled = false; numericUpDownTotalBandwidthLimit.Enabled = false; - numericUpDown6.Enabled = false; - numericUpDown7.Enabled = false; - comboBox1.Enabled = false; - textBox1.Enabled = false; + numericUpDownWebUIPort.Enabled = false; + numericUpDownSubStorePort.Enabled = false; + comboBoxSaveMethod.Enabled = false; + textBoxSubsUrls.Enabled = false; groupBoxAdvanceSettings.Enabled = false; - groupBox4.Enabled = false; - groupBox5.Enabled = false; - groupBox6.Enabled = false; - button1.Text = "⏹️ 停止"; + groupBoxGist.Enabled = false; + groupBoxR2.Enabled = false; + groupBoxWebdav.Enabled = false; + buttonStartCheck.Text = "⏹️ 停止"; } } @@ -2565,8 +2565,8 @@ private void button4_Click(object sender, EventArgs e) CheckUpdates checkUpdatesForm = new CheckUpdates(); // 传递必要的数据和状态 - checkUpdatesForm.githubProxys = comboBox3.Items; - checkUpdatesForm.githubProxy = comboBox3.Text; + checkUpdatesForm.githubProxys = comboBoxGithubProxyUrl.Items; + checkUpdatesForm.githubProxy = comboBoxGithubProxyUrl.Text; checkUpdatesForm.当前subsCheck版本号 = 当前subsCheck版本号; checkUpdatesForm.当前GUI版本号 = 当前GUI版本号; @@ -2596,19 +2596,19 @@ private void button4_Click(object sender, EventArgs e) private void checkBox3_CheckedChanged(object sender, EventArgs e) { - if (checkBox3.Checked) numericUpDown8.Enabled = true; - else numericUpDown8.Enabled = false; + if (checkBoxEnableSuccessLimit.Checked) numericUpDownSuccessLimit.Enabled = true; + else numericUpDownSuccessLimit.Enabled = false; } private void checkBox6_CheckedChanged(object sender, EventArgs e) { - if (checkBox6.Checked) numericUpDownTotalBandwidthLimit.Enabled = true; + if (checkBoxTotalBandwidthLimit.Checked) numericUpDownTotalBandwidthLimit.Enabled = true; else numericUpDownTotalBandwidthLimit.Enabled = false; } private async void comboBox5_SelectedIndexChanged(object sender, EventArgs e) { - if (comboBox5.Text.Contains("[内置]")) await ProcessComboBox5Selection(true); + if (comboBoxOverwriteUrls.Text.Contains("[内置]")) await ProcessComboBox5Selection(true); } private async Task ProcessComboBox5Selection(bool 汇报Log = false) @@ -2619,7 +2619,7 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) string downloadUrl; string displayName; string executablePath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); - if (comboBox5.Text.Contains("[内置]布丁狗")) + if (comboBoxOverwriteUrls.Text.Contains("[内置]布丁狗")) { fileName = "bdg.yaml"; displayName = "[内置]布丁狗的订阅转换"; @@ -2648,8 +2648,8 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) Log($"{displayName} 覆写配置文件 未找到,正在下载..."); // 重置进度条 - progressBar1.Value = 0; - progressBar1.Visible = true; + progressBarAll.Value = 0; + progressBarAll.Visible = true; // 添加GitHub代理前缀如果有 string fullDownloadUrl = githubProxyURL + downloadUrl; @@ -2696,12 +2696,12 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) int progressPercentage = (int)((totalBytesRead * 100) / totalBytes); // 确保进度值在有效范围内 (0-100) progressPercentage = Math.Min(100, Math.Max(0, progressPercentage)); - progressBar1.Value = progressPercentage; + progressBarAll.Value = progressPercentage; } } // 确保进度条显示100% - progressBar1.Value = 100; + progressBarAll.Value = 100; } Log($"{displayName} 覆写配置文件 下载成功"); @@ -2717,8 +2717,8 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) { Log($"{displayName} 覆写配置文件 下载失败: {ex.Message}", true); // 出错时重置进度条 - progressBar1.Value = 0; - progressBar1.Visible = false; + progressBarAll.Value = 0; + progressBarAll.Visible = false; } } else @@ -2748,8 +2748,8 @@ private void numericUpDown1_ValueChanged(object sender, EventArgs e) private void checkBox4_CheckedChanged(object sender, EventArgs e) { - if (checkBox4.Checked) textBox10.Enabled = true; - else textBox10.Enabled = false; + if (checkBoxEnableWebUI.Checked) textBoxWebUiAPIKey.Enabled = true; + else textBoxWebUiAPIKey.Enabled = false; } private void button6_Click(object sender, EventArgs e) @@ -2758,7 +2758,7 @@ private void button6_Click(object sender, EventArgs e) try { // 构造URL - string url = $"http://{本地IP}:{numericUpDown6.Value}/admin"; + string url = $"http://{本地IP}:{numericUpDownWebUIPort.Value}/admin"; // 使用系统默认浏览器打开URL System.Diagnostics.Process.Start(url); @@ -2787,7 +2787,7 @@ private void button6_Click(object sender, EventArgs e) private async Task GetApiStatusAsync() { string[] resultArray = new string[6]; - string baseUrl = $"http://127.0.0.1:{numericUpDown6.Value}"; + string baseUrl = $"http://127.0.0.1:{numericUpDownWebUIPort.Value}"; try { @@ -2882,7 +2882,7 @@ private async void timer4_Tick(object sender, EventArgs e) if (状态类型 == "checking") { - button7.Text = button7.Text == "⏸️ 暂停" ? button7.Text : "⏸️ 暂停"; + buttonTriggerCheck.Text = buttonTriggerCheck.Text == "⏸️ 暂停" ? buttonTriggerCheck.Text : "⏸️ 暂停"; nodeInfo = $"({进度百分比}/{节点总数}) 可用: {可用节点数量}"; int.TryParse(节点总数, out int nodeTotal); @@ -2894,9 +2894,9 @@ private async void timer4_Tick(object sender, EventArgs e) if (进度条百分比 < 0) 进度条百分比 = 0; if (进度条百分比 > 100) 进度条百分比 = 100; - progressBar1.Value = 进度条百分比; + progressBarAll.Value = 进度条百分比; - if (!button7.Enabled) button7.Enabled = true; + if (!buttonTriggerCheck.Enabled) buttonTriggerCheck.Enabled = true; } // 仅在文本变化时更新 NotifyIcon,避免频繁重绘 @@ -2908,13 +2908,13 @@ private async void timer4_Tick(object sender, EventArgs e) notifyIcon1.Text = notifyText; } - if (textBox1.Enabled) textBox1.Enabled = false; // 仅在需要时改变 + if (textBoxSubsUrls.Enabled) textBoxSubsUrls.Enabled = false; // 仅在需要时改变 } else if (状态类型 == "idle") { - if (button7.Text != "⏯️ 开始") button7.Text = "⏯️ 开始"; + if (buttonTriggerCheck.Text != "⏯️ 开始") buttonTriggerCheck.Text = "⏯️ 开始"; - progressBar1.Value = 100; + progressBarAll.Value = 100; nodeInfo = $"等待{nextCheckTime}"; string idleNotify = "SubsCheck: 已就绪\n" + nextCheckTime; @@ -2924,11 +2924,11 @@ private async void timer4_Tick(object sender, EventArgs e) notifyIcon1.Text = idleNotify; } - if (!textBox1.Enabled) textBox1.Enabled = true; + if (!textBoxSubsUrls.Enabled) textBoxSubsUrls.Enabled = true; } else if (状态类型 == "error") { - if (button7.Text != "🔀 未知") button7.Text = "🔀 未知"; + if (buttonTriggerCheck.Text != "🔀 未知") buttonTriggerCheck.Text = "🔀 未知"; nodeInfo = 状态文本; } @@ -2937,26 +2937,26 @@ private async void timer4_Tick(object sender, EventArgs e) if (_lastLogLabelNodeInfoText != groupTitle) { _lastLogLabelNodeInfoText = groupTitle; - LogLabelNodeInfo.Text = groupTitle; + labelLogNodeInfo.Text = groupTitle; } } private async void button7_Click(object sender, EventArgs e) { - button7.Enabled = false; - timer4.Enabled = false; + buttonTriggerCheck.Enabled = false; + timerRefresh.Enabled = false; try { bool isSuccess; - if (button7.Text == "⏯️ 开始") + if (buttonTriggerCheck.Text == "⏯️ 开始") { isSuccess = await SendApiRequestAsync("/api/trigger-check", "节点检查"); if (isSuccess) { - button7.Text = "⏸️ 暂停"; - textBox1.Enabled = false; // 检查开始后禁用订阅编辑 + buttonTriggerCheck.Text = "⏸️ 暂停"; + textBoxSubsUrls.Enabled = false; // 检查开始后禁用订阅编辑 } } else // "⏸️ 暂停" @@ -2965,13 +2965,13 @@ private async void button7_Click(object sender, EventArgs e) } // 如果请求失败,更新按钮状态为未知 - if (!isSuccess) button7.Text = "🔀 未知"; + if (!isSuccess) buttonTriggerCheck.Text = "🔀 未知"; } finally { // 无论成功失败都重新启用定时器和按钮 - timer4.Enabled = true; - timer4.Start(); + timerRefresh.Enabled = true; + timerRefresh.Start(); //button7.Enabled = true; } } @@ -2987,7 +2987,7 @@ private async Task SendApiRequestAsync(string endpoint, string operationNa try { // 获取API基础地址和API密钥 - string baseUrl = $"http://127.0.0.1:{numericUpDown6.Value}"; + string baseUrl = $"http://127.0.0.1:{numericUpDownWebUIPort.Value}"; using (HttpClient client = new HttpClient()) { @@ -3253,18 +3253,18 @@ private void 切换cron表达式(object sender, EventArgs e) { labelCron.Visible = false; textBoxCron.Visible = false; - label2.Visible = true; - numericUpDown2.Visible = true; + labelInterval.Visible = true; + numericUpDownInterval.Visible = true; Log("下次检查时间间隔 使用分钟倒计时"); } else { - labelCron.Location = new Point(labelCron.Location.X, label2.Location.Y); - textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDown2.Location.Y); + labelCron.Location = new Point(labelCron.Location.X, labelInterval.Location.Y); + textBoxCron.Location = new Point(textBoxCron.Location.X, numericUpDownInterval.Location.Y); labelCron.Visible = true; textBoxCron.Visible = true; - label2.Visible = false; - numericUpDown2.Visible = false; + labelInterval.Visible = false; + numericUpDownInterval.Visible = false; Log("下次检查时间间隔 使用cron表达式"); } } @@ -3338,7 +3338,7 @@ async Task DownloadFileAsync(HttpClient httpClient, string url, string fil { int progressPercentage = (int)((totalBytesRead * 100) / totalBytes); progressPercentage = Math.Min(100, Math.Max(0, progressPercentage)); - progressBar1.Value = progressPercentage; + progressBarAll.Value = progressPercentage; } } } @@ -3411,7 +3411,7 @@ private void button8_Click(object sender, EventArgs e) private async void checkBox5_CheckedChanged(object sender, EventArgs e) { - checkBox5.Enabled = false; + checkBoxStartup.Enabled = false; try { // 获取当前应用程序的可执行文件路径 @@ -3423,7 +3423,7 @@ private async void checkBox5_CheckedChanged(object sender, EventArgs e) // 快捷方式文件的完整路径 string shortcutPath = Path.Combine(startupFolderPath, $"{appName}.lnk"); - if (checkBox5.Checked) + if (checkBoxStartup.Checked) { // 检查启动文件夹中是否已存在该快捷方式 if (File.Exists(shortcutPath)) @@ -3453,11 +3453,11 @@ private async void checkBox5_CheckedChanged(object sender, EventArgs e) MessageBox.Show($"设置开机启动项失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); // 恢复CheckBox状态,避免UI状态与实际状态不一致 - checkBox5.CheckedChanged -= checkBox5_CheckedChanged; - checkBox5.Checked = !checkBox5.Checked; - checkBox5.CheckedChanged += checkBox5_CheckedChanged; + checkBoxStartup.CheckedChanged -= checkBox5_CheckedChanged; + checkBoxStartup.Checked = !checkBoxStartup.Checked; + checkBoxStartup.CheckedChanged += checkBox5_CheckedChanged; } - checkBox5.Enabled = true; + checkBoxStartup.Enabled = true; await SaveConfig(false); } @@ -3517,7 +3517,7 @@ private bool CheckCommandLineParameter(string parameterName) private void richTextBox1_DoubleClick(object sender, EventArgs e) { // 检查是否有日志内容 - if (richTextBox1.TextLength > 0) + if (richTextBoxAllLog.TextLength > 0) { // 显示确认对话框,询问用户是否要清空日志 DialogResult result = MessageBox.Show( @@ -3530,7 +3530,7 @@ private void richTextBox1_DoubleClick(object sender, EventArgs e) if (result == DialogResult.Yes) { // 清空richTextBox1内容 - richTextBox1.Clear(); + richTextBoxAllLog.Clear(); // 记录一条清空日志的操作信息 Log("日志已清空"); } @@ -3557,7 +3557,7 @@ private void numericUpDown4_ValueChanged(object sender, EventArgs e) private void numericUpDown3_ValueChanged(object sender, EventArgs e) { - if (numericUpDown3.Value < 5000) + if (numericUpDownTimeout.Value < 5000) { string warningMessage = "⚠️ 超时时间设置提醒 ⚠️\n\n" + @@ -3578,13 +3578,13 @@ private void numericUpDown3_ValueChanged(object sender, EventArgs e) public async Task GetGithubProxyUrlAsync() { const string AUTO = "自动选择"; - if (comboBox3 == null) return githubProxyURL; + if (comboBoxGithubProxyUrl == null) return githubProxyURL; // 如已指定githubproxy,直接返回结果 - var text = (comboBox3.Text ?? ""); + var text = (comboBoxGithubProxyUrl.Text ?? ""); if (text != AUTO && text.Length > 0) return $"https://{text}/"; - var candidates = comboBox3.Items + var candidates = comboBoxGithubProxyUrl.Items .OfType() .Where(s => !string.IsNullOrWhiteSpace(s) && s != AUTO) .OrderBy(_ => Guid.NewGuid()) @@ -3599,7 +3599,7 @@ public async Task GetGithubProxyUrlAsync() private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) { bool collapsed = buttonAdvanceSettings.Text == "高级设置∨"; - groupBoxPipe.Visible = EnableHighConcurrent; + groupBoxPipeConcurrent.Visible = EnableHighConcurrent; groupBoxEnhance.Visible = EnableHighConcurrent; if (collapsed) { @@ -3608,10 +3608,10 @@ private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) if (!_originalLocationSaved) { _originalLocationSaved = true; - _pipeOriginalLocation = groupBoxPipe.Location; + _pipeOriginalLocation = groupBoxPipeConcurrent.Location; _enhanceOriginalLocation = groupBoxEnhance.Location; } - groupBoxPipe.Location = groupBoxAdvanceSettings.Location; + groupBoxPipeConcurrent.Location = groupBoxAdvanceSettings.Location; groupBoxEnhance.Location = new Point(groupBoxEnhance.Location.X, groupBoxAdvanceSettings.Location.Y); } } @@ -3619,14 +3619,14 @@ private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) { if (EnableHighConcurrent) { - groupBoxPipe.Location = _pipeOriginalLocation; + groupBoxPipeConcurrent.Location = _pipeOriginalLocation; groupBoxEnhance.Location = _enhanceOriginalLocation; - groupBox4.Location = new Point(groupBox4.Location.X, groupBox4.Location.Y + groupBoxPipe.Height); - groupBox5.Location = groupBox4.Location; groupBox6.Location = groupBox4.Location; + groupBoxGist.Location = new Point(groupBoxGist.Location.X, groupBoxGist.Location.Y + groupBoxPipeConcurrent.Height); + groupBoxR2.Location = groupBoxGist.Location; groupBoxWebdav.Location = groupBoxGist.Location; } else { - groupBox4.Location = _pipeOriginalLocation; groupBox5.Location = groupBox4.Location; groupBox6.Location = groupBox4.Location; + groupBoxGist.Location = _pipeOriginalLocation; groupBoxR2.Location = groupBoxGist.Location; groupBoxWebdav.Location = groupBoxGist.Location; } } } diff --git a/Form1.resx b/MainGui.resx similarity index 99% rename from Form1.resx rename to MainGui.resx index 87066a8..c3120ae 100644 --- a/Form1.resx +++ b/MainGui.resx @@ -3465,29 +3465,32 @@ 8ZBk6w0zXkiXmGb795jdrR8Fo/3iU+0ts/2GUBRFUXKE/wXQTDn6LYQ2BAAAAABJRU5ErkJggg== - - 136, 17 + + 354, 19 - + https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta.yaml https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta-2.yaml https://raw.githubusercontent.com/go4sharing/sub/main/sub.yaml https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt - 320, 17 + 196, 21 - - 228, 17 + + 822, 19 - - 423, 17 + + 196, 21 + + + 533, 19 - - 515, 17 + + 1149, 19 - 89 + 72 diff --git a/Program.cs b/Program.cs index 66ef724..281f15a 100644 --- a/Program.cs +++ b/Program.cs @@ -31,7 +31,7 @@ static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); + Application.Run(new MainGui()); } finally { diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index 520dccb..7396834 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -83,11 +83,11 @@ EditURLs.cs - + Form - - Form1.cs + + MainGui.cs Form @@ -106,8 +106,8 @@ EditURLs.cs - - Form1.cs + + MainGui.cs MoreYAML.cs From 5aaaa1fa312625568fd52ab0d91fb9a9c49bb49c Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 29 Aug 2025 13:59:35 +0800 Subject: [PATCH 18/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E7=A4=BA=EF=BC=8C=E6=8F=90=E5=8D=87=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 321 ++++++++++++++++++++++---------------------- MainGui.cs | 77 +++++++---- 2 files changed, 214 insertions(+), 184 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 1ed5fd5..7ec0b77 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -37,25 +37,25 @@ private void InitializeComponent() this.numericUpDownConcurrent = new System.Windows.Forms.NumericUpDown(); this.labelInterval = new System.Windows.Forms.Label(); this.numericUpDownInterval = new System.Windows.Forms.NumericUpDown(); + this.labelTimeout = new System.Windows.Forms.Label(); + this.numericUpDownTimeout = new System.Windows.Forms.NumericUpDown(); + this.labelMinSpped = new System.Windows.Forms.Label(); + this.numericUpDownMinSpeed = new System.Windows.Forms.NumericUpDown(); + this.labelSaveMethod = new System.Windows.Forms.Label(); + this.comboBoxSaveMethod = new System.Windows.Forms.ComboBox(); this.checkBoxHighConcurrent = new System.Windows.Forms.CheckBox(); this.checkBoxSwitchArch64 = new System.Windows.Forms.CheckBox(); + this.comboBoxSubscriptionType = new System.Windows.Forms.ComboBox(); + this.buttonCopySubscriptionUrl = new System.Windows.Forms.Button(); this.buttonTriggerCheck = new System.Windows.Forms.Button(); this.buttonWebUi = new System.Windows.Forms.Button(); - this.comboBoxSubscriptionType = new System.Windows.Forms.ComboBox(); this.checkBoxStartup = new System.Windows.Forms.CheckBox(); - this.buttonCopySubscriptionUrl = new System.Windows.Forms.Button(); - this.comboBoxSaveMethod = new System.Windows.Forms.ComboBox(); - this.labelTimeout = new System.Windows.Forms.Label(); - this.numericUpDownMinSpeed = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownTimeout = new System.Windows.Forms.NumericUpDown(); - this.labelSaveMethod = new System.Windows.Forms.Label(); - this.labelMinSpped = new System.Windows.Forms.Label(); this.textBoxCron = new System.Windows.Forms.TextBox(); this.labelCron = new System.Windows.Forms.Label(); - this.buttonAdvanceSettings = new System.Windows.Forms.Button(); - this.buttonStartCheck = new System.Windows.Forms.Button(); this.labelSubUrls = new System.Windows.Forms.Label(); this.textBoxSubsUrls = new System.Windows.Forms.TextBox(); + this.buttonStartCheck = new System.Windows.Forms.Button(); + this.buttonAdvanceSettings = new System.Windows.Forms.Button(); this.numericUpDownWebUIPort = new System.Windows.Forms.NumericUpDown(); this.numericUpDownDLTimehot = new System.Windows.Forms.NumericUpDown(); this.labelWebUIPort = new System.Windows.Forms.Label(); @@ -124,8 +124,8 @@ private void InitializeComponent() this.groupBoxComonSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWebUIPort)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDLTimehot)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubStorePort)).BeginInit(); @@ -261,6 +261,100 @@ private void InitializeComponent() 0}); this.numericUpDownInterval.DoubleClick += new System.EventHandler(this.切换cron表达式); // + // labelTimeout + // + this.labelTimeout.AutoSize = true; + this.labelTimeout.Location = new System.Drawing.Point(13, 138); + this.labelTimeout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelTimeout.Name = "labelTimeout"; + this.labelTimeout.Size = new System.Drawing.Size(179, 21); + this.labelTimeout.TabIndex = 4; + this.labelTimeout.Text = "超时时间(毫秒):"; + // + // numericUpDownTimeout + // + this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 135); + this.numericUpDownTimeout.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownTimeout.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownTimeout.Minimum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownTimeout.Name = "numericUpDownTimeout"; + this.numericUpDownTimeout.Size = new System.Drawing.Size(106, 31); + this.numericUpDownTimeout.TabIndex = 12; + this.numericUpDownTimeout.Value = new decimal(new int[] { + 5000, + 0, + 0, + 0}); + this.numericUpDownTimeout.ValueChanged += new System.EventHandler(this.numericUpDown3_ValueChanged); + // + // labelMinSpped + // + this.labelMinSpped.AutoSize = true; + this.labelMinSpped.Location = new System.Drawing.Point(13, 189); + this.labelMinSpped.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelMinSpped.Name = "labelMinSpped"; + this.labelMinSpped.Size = new System.Drawing.Size(181, 21); + this.labelMinSpped.TabIndex = 5; + this.labelMinSpped.Text = "测速下限(KB/s):"; + // + // numericUpDownMinSpeed + // + this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 186); + this.numericUpDownMinSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownMinSpeed.Maximum = new decimal(new int[] { + 20480, + 0, + 0, + 0}); + this.numericUpDownMinSpeed.Minimum = new decimal(new int[] { + 128, + 0, + 0, + 0}); + this.numericUpDownMinSpeed.Name = "numericUpDownMinSpeed"; + this.numericUpDownMinSpeed.Size = new System.Drawing.Size(106, 31); + this.numericUpDownMinSpeed.TabIndex = 13; + this.numericUpDownMinSpeed.Value = new decimal(new int[] { + 1024, + 0, + 0, + 0}); + this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDown4_ValueChanged); + // + // labelSaveMethod + // + this.labelSaveMethod.AutoSize = true; + this.labelSaveMethod.Location = new System.Drawing.Point(13, 240); + this.labelSaveMethod.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelSaveMethod.Name = "labelSaveMethod"; + this.labelSaveMethod.Size = new System.Drawing.Size(115, 21); + this.labelSaveMethod.TabIndex = 8; + this.labelSaveMethod.Text = "保存方法:"; + // + // comboBoxSaveMethod + // + this.comboBoxSaveMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSaveMethod.FormattingEnabled = true; + this.comboBoxSaveMethod.Items.AddRange(new object[] { + "本地", + "gist", + "r2", + "webdav"}); + this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 236); + this.comboBoxSaveMethod.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; + this.comboBoxSaveMethod.Size = new System.Drawing.Size(103, 29); + this.comboBoxSaveMethod.TabIndex = 16; + this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + // // checkBoxHighConcurrent // this.checkBoxHighConcurrent.AutoSize = true; @@ -283,6 +377,31 @@ private void InitializeComponent() this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.checkBoxSwitchArch64_CheckedChanged); // + // comboBoxSubscriptionType + // + this.comboBoxSubscriptionType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubscriptionType.FormattingEnabled = true; + this.comboBoxSubscriptionType.Items.AddRange(new object[] { + "通用订阅", + "Clash"}); + this.comboBoxSubscriptionType.Location = new System.Drawing.Point(15, 651); + this.comboBoxSubscriptionType.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSubscriptionType.Name = "comboBoxSubscriptionType"; + this.comboBoxSubscriptionType.Size = new System.Drawing.Size(132, 29); + this.comboBoxSubscriptionType.TabIndex = 19; + // + // buttonCopySubscriptionUrl + // + this.buttonCopySubscriptionUrl.Enabled = false; + this.buttonCopySubscriptionUrl.Location = new System.Drawing.Point(161, 648); + this.buttonCopySubscriptionUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonCopySubscriptionUrl.Name = "buttonCopySubscriptionUrl"; + this.buttonCopySubscriptionUrl.Size = new System.Drawing.Size(138, 40); + this.buttonCopySubscriptionUrl.TabIndex = 18; + this.buttonCopySubscriptionUrl.Text = "复制订阅"; + this.buttonCopySubscriptionUrl.UseVisualStyleBackColor = true; + this.buttonCopySubscriptionUrl.Click += new System.EventHandler(this.button3_Click); + // // buttonTriggerCheck // this.buttonTriggerCheck.Enabled = false; @@ -307,19 +426,6 @@ private void InitializeComponent() this.buttonWebUi.UseVisualStyleBackColor = true; this.buttonWebUi.Click += new System.EventHandler(this.button6_Click); // - // comboBoxSubscriptionType - // - this.comboBoxSubscriptionType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubscriptionType.FormattingEnabled = true; - this.comboBoxSubscriptionType.Items.AddRange(new object[] { - "通用订阅", - "Clash"}); - this.comboBoxSubscriptionType.Location = new System.Drawing.Point(15, 651); - this.comboBoxSubscriptionType.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBoxSubscriptionType.Name = "comboBoxSubscriptionType"; - this.comboBoxSubscriptionType.Size = new System.Drawing.Size(132, 29); - this.comboBoxSubscriptionType.TabIndex = 19; - // // checkBoxStartup // this.checkBoxStartup.AutoSize = true; @@ -332,112 +438,6 @@ private void InitializeComponent() this.checkBoxStartup.UseVisualStyleBackColor = true; this.checkBoxStartup.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); // - // buttonCopySubscriptionUrl - // - this.buttonCopySubscriptionUrl.Enabled = false; - this.buttonCopySubscriptionUrl.Location = new System.Drawing.Point(161, 648); - this.buttonCopySubscriptionUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.buttonCopySubscriptionUrl.Name = "buttonCopySubscriptionUrl"; - this.buttonCopySubscriptionUrl.Size = new System.Drawing.Size(138, 40); - this.buttonCopySubscriptionUrl.TabIndex = 18; - this.buttonCopySubscriptionUrl.Text = "复制订阅"; - this.buttonCopySubscriptionUrl.UseVisualStyleBackColor = true; - this.buttonCopySubscriptionUrl.Click += new System.EventHandler(this.button3_Click); - // - // comboBoxSaveMethod - // - this.comboBoxSaveMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSaveMethod.FormattingEnabled = true; - this.comboBoxSaveMethod.Items.AddRange(new object[] { - "本地", - "gist", - "r2", - "webdav"}); - this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 236); - this.comboBoxSaveMethod.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; - this.comboBoxSaveMethod.Size = new System.Drawing.Size(103, 29); - this.comboBoxSaveMethod.TabIndex = 16; - this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); - // - // labelTimeout - // - this.labelTimeout.AutoSize = true; - this.labelTimeout.Location = new System.Drawing.Point(13, 138); - this.labelTimeout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.labelTimeout.Name = "labelTimeout"; - this.labelTimeout.Size = new System.Drawing.Size(179, 21); - this.labelTimeout.TabIndex = 4; - this.labelTimeout.Text = "超时时间(毫秒):"; - // - // numericUpDownMinSpeed - // - this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 186); - this.numericUpDownMinSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDownMinSpeed.Maximum = new decimal(new int[] { - 20480, - 0, - 0, - 0}); - this.numericUpDownMinSpeed.Minimum = new decimal(new int[] { - 128, - 0, - 0, - 0}); - this.numericUpDownMinSpeed.Name = "numericUpDownMinSpeed"; - this.numericUpDownMinSpeed.Size = new System.Drawing.Size(106, 31); - this.numericUpDownMinSpeed.TabIndex = 13; - this.numericUpDownMinSpeed.Value = new decimal(new int[] { - 1024, - 0, - 0, - 0}); - this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDown4_ValueChanged); - // - // numericUpDownTimeout - // - this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 135); - this.numericUpDownTimeout.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDownTimeout.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownTimeout.Minimum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownTimeout.Name = "numericUpDownTimeout"; - this.numericUpDownTimeout.Size = new System.Drawing.Size(106, 31); - this.numericUpDownTimeout.TabIndex = 12; - this.numericUpDownTimeout.Value = new decimal(new int[] { - 5000, - 0, - 0, - 0}); - this.numericUpDownTimeout.ValueChanged += new System.EventHandler(this.numericUpDown3_ValueChanged); - // - // labelSaveMethod - // - this.labelSaveMethod.AutoSize = true; - this.labelSaveMethod.Location = new System.Drawing.Point(13, 240); - this.labelSaveMethod.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.labelSaveMethod.Name = "labelSaveMethod"; - this.labelSaveMethod.Size = new System.Drawing.Size(115, 21); - this.labelSaveMethod.TabIndex = 8; - this.labelSaveMethod.Text = "保存方法:"; - // - // labelMinSpped - // - this.labelMinSpped.AutoSize = true; - this.labelMinSpped.Location = new System.Drawing.Point(13, 189); - this.labelMinSpped.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.labelMinSpped.Name = "labelMinSpped"; - this.labelMinSpped.Size = new System.Drawing.Size(181, 21); - this.labelMinSpped.TabIndex = 5; - this.labelMinSpped.Text = "测速下限(KB/s):"; - // // textBoxCron // this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -463,29 +463,6 @@ private void InitializeComponent() this.labelCron.Visible = false; this.labelCron.DoubleClick += new System.EventHandler(this.切换cron表达式); // - // buttonAdvanceSettings - // - this.buttonAdvanceSettings.Location = new System.Drawing.Point(161, 788); - this.buttonAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.buttonAdvanceSettings.Name = "buttonAdvanceSettings"; - this.buttonAdvanceSettings.Size = new System.Drawing.Size(138, 40); - this.buttonAdvanceSettings.TabIndex = 1; - this.buttonAdvanceSettings.Text = "高级设置∧"; - this.buttonAdvanceSettings.UseVisualStyleBackColor = true; - this.buttonAdvanceSettings.Click += new System.EventHandler(this.button2_Click); - // - // buttonStartCheck - // - this.buttonStartCheck.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.buttonStartCheck.Location = new System.Drawing.Point(13, 749); - this.buttonStartCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.buttonStartCheck.Name = "buttonStartCheck"; - this.buttonStartCheck.Size = new System.Drawing.Size(138, 79); - this.buttonStartCheck.TabIndex = 0; - this.buttonStartCheck.Text = "▶️ 启动"; - this.buttonStartCheck.UseVisualStyleBackColor = true; - this.buttonStartCheck.Click += new System.EventHandler(this.button1_Click); - // // labelSubUrls // this.labelSubUrls.AutoSize = true; @@ -512,6 +489,29 @@ private void InitializeComponent() this.textBoxSubsUrls.Click += new System.EventHandler(this.textBox1_DoubleClick); this.textBoxSubsUrls.DoubleClick += new System.EventHandler(this.textBox1_DoubleClick); // + // buttonStartCheck + // + this.buttonStartCheck.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.buttonStartCheck.Location = new System.Drawing.Point(13, 749); + this.buttonStartCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonStartCheck.Name = "buttonStartCheck"; + this.buttonStartCheck.Size = new System.Drawing.Size(138, 79); + this.buttonStartCheck.TabIndex = 0; + this.buttonStartCheck.Text = "▶️ 启动"; + this.buttonStartCheck.UseVisualStyleBackColor = true; + this.buttonStartCheck.Click += new System.EventHandler(this.button1_Click); + // + // buttonAdvanceSettings + // + this.buttonAdvanceSettings.Location = new System.Drawing.Point(161, 788); + this.buttonAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonAdvanceSettings.Name = "buttonAdvanceSettings"; + this.buttonAdvanceSettings.Size = new System.Drawing.Size(138, 40); + this.buttonAdvanceSettings.TabIndex = 1; + this.buttonAdvanceSettings.Text = "高级设置∧"; + this.buttonAdvanceSettings.UseVisualStyleBackColor = true; + this.buttonAdvanceSettings.Click += new System.EventHandler(this.button2_Click); + // // numericUpDownWebUIPort // this.numericUpDownWebUIPort.Location = new System.Drawing.Point(515, 33); @@ -730,6 +730,7 @@ private void InitializeComponent() 0, 0, 0}); + this.numericUpDownTotalBandwidthLimit.ValueChanged += new System.EventHandler(this.NumericUpDownTotalBandwidthLimit_ValueChanged); // // checkBoxTotalBandwidthLimit // @@ -1425,7 +1426,7 @@ private void InitializeComponent() this.groupBoxGist.Controls.Add(this.label12); this.groupBoxGist.Controls.Add(this.textBox2); this.groupBoxGist.Controls.Add(this.label11); - this.groupBoxGist.Location = new System.Drawing.Point(24, 1202); + this.groupBoxGist.Location = new System.Drawing.Point(24, 1211); this.groupBoxGist.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxGist.Name = "groupBoxGist"; this.groupBoxGist.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1505,7 +1506,7 @@ private void InitializeComponent() this.groupBoxR2.Controls.Add(this.label15); this.groupBoxR2.Controls.Add(this.textBox7); this.groupBoxR2.Controls.Add(this.label16); - this.groupBoxR2.Location = new System.Drawing.Point(24, 1300); + this.groupBoxR2.Location = new System.Drawing.Point(24, 1314); this.groupBoxR2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxR2.Name = "groupBoxR2"; this.groupBoxR2.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1565,7 +1566,7 @@ private void InitializeComponent() this.groupBoxWebdav.Controls.Add(this.label17); this.groupBoxWebdav.Controls.Add(this.textBox9); this.groupBoxWebdav.Controls.Add(this.label18); - this.groupBoxWebdav.Location = new System.Drawing.Point(24, 1398); + this.groupBoxWebdav.Location = new System.Drawing.Point(24, 1417); this.groupBoxWebdav.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxWebdav.Name = "groupBoxWebdav"; this.groupBoxWebdav.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1653,7 +1654,7 @@ private void InitializeComponent() this.groupBoxPipeConcurrent.Controls.Add(this.checkBoxPipeAuto); this.groupBoxPipeConcurrent.Controls.Add(this.numericUpDownPipeAlive); this.groupBoxPipeConcurrent.Controls.Add(this.labelPipeAlive); - this.groupBoxPipeConcurrent.Location = new System.Drawing.Point(24, 1104); + this.groupBoxPipeConcurrent.Location = new System.Drawing.Point(24, 1108); this.groupBoxPipeConcurrent.Name = "groupBoxPipeConcurrent"; this.groupBoxPipeConcurrent.Size = new System.Drawing.Size(998, 89); this.groupBoxPipeConcurrent.TabIndex = 7; @@ -1749,7 +1750,7 @@ private void InitializeComponent() // this.groupBoxEnhance.Controls.Add(this.checkBoxDropBadCFNodes); this.groupBoxEnhance.Controls.Add(this.checkBoxEhanceTag); - this.groupBoxEnhance.Location = new System.Drawing.Point(1028, 1104); + this.groupBoxEnhance.Location = new System.Drawing.Point(1028, 1108); this.groupBoxEnhance.Name = "groupBoxEnhance"; this.groupBoxEnhance.Size = new System.Drawing.Size(426, 89); this.groupBoxEnhance.TabIndex = 44; @@ -1785,7 +1786,7 @@ private void InitializeComponent() this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.BackColor = System.Drawing.SystemColors.Control; - this.ClientSize = new System.Drawing.Size(1466, 1510); + this.ClientSize = new System.Drawing.Size(1466, 1518); this.Controls.Add(this.groupBoxLog); this.Controls.Add(this.groupBoxComonSettings); this.Controls.Add(this.groupBoxAdvanceSettings); @@ -1804,8 +1805,8 @@ private void InitializeComponent() this.groupBoxComonSettings.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWebUIPort)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDLTimehot)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubStorePort)).EndInit(); diff --git a/MainGui.cs b/MainGui.cs index fe7376b..0cccf3d 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json.Linq; + using System; using System.Collections.Generic; using System.Data; @@ -52,17 +53,39 @@ public MainGui() InitializeComponent(); originalNotifyIcon = notifyIcon1.Icon; - toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。"); + toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。\n\n如启用高并发而未单独设置分段并发数,将使用该值计算自适应并发数.\n启用高并发后,此值可安全设置,下载速度会被限制在一个较小的值,同时加快检测速度"); toolTip1.SetToolTip(numericUpDownInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); toolTip1.SetToolTip(labelInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); - + toolTip1.SetToolTip(labelCron, "双击切换 使用「分钟倒计时」"); + toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); toolTip1.SetToolTip(numericUpDownTimeout, "超时时间(毫秒):节点的最大延迟。"); toolTip1.SetToolTip(numericUpDownMinSpeed, "最低测速结果舍弃(KB/s)。"); + + toolTip1.SetToolTip(checkBoxHighConcurrent, "启用流水线分段高并发版本内核。"); + toolTip1.SetToolTip(checkBoxSwitchArch64, "启用64位版本内核。"); + + toolTip1.SetToolTip(checkBoxPipeAuto, "auto: 切换自适应流水线分段并发模式。"); + toolTip1.SetToolTip(numericUpDownPipeAlive, "测活任务并发数:\n取决于CPU和路由器芯片性能,建议设置 100-1000。\n\n量力而行!"); + toolTip1.SetToolTip(numericUpDownPipeSpeed, "测速任务并发数。\n建议设置 10-32。"); + toolTip1.SetToolTip(numericUpDownPipeMedia, "流媒体检测任务并发数。\n建议设置100-200。"); + + toolTip1.SetToolTip(checkBoxEhanceTag, "开启增强位置标签:\n- 无法访问 CF 的 CF 节点: HK⁻¹\r\n- 正常访问 CF: a.出口位置与cdn位置一致: HK¹⁺; b.位置不一致: HK¹-US⁰\r\n- 非 CF 节点,直接显示: HK²\r\n- 未获取到位置: HKˣ (使用原方案)\r\n- 前两位字母是实际浏览网站识别的位置,-US⁰为使用CF CDN服务的网站识别的位置,比如GPT, X等。"); + toolTip1.SetToolTip(checkBoxDropBadCFNodes, "丢弃无法访问CF CDN网站的节点。\r\n- 这类节点可以正常访问YouTube、Google等网站。\r\n- 无法访问cloudflare及使用了CDN服务的网站,比如Twitter、claude等。\r\n- 开启会导致节点数量大幅减少。"); + + + toolTip1.SetToolTip(comboBoxSubscriptionType, "通用订阅:内置了Sub-Store程序,自适应订阅格式。\nClash订阅:带规则的 Mihomo、Clash 订阅格式。"); + toolTip1.SetToolTip(comboBoxOverwriteUrls, "生成带规则的 Clash 订阅所需的覆写规则文件"); + + toolTip1.SetToolTip(checkBoxStartup, "开机启动:勾选后,程序将在Windows启动时自动运行"); + toolTip1.SetToolTip(buttonAdvanceSettings, "高级设置:展开更多设置参数项"); + + toolTip1.SetToolTip(buttonMoreSettings, "更多参数: 添加GUI未涵盖的参数项"); + toolTip1.SetToolTip(buttonCheckUpdate, "检查GUI和内核版本更新"); + toolTip1.SetToolTip(numericUpDownDLTimehot, "下载测试时间(s):与下载链接大小相关,默认最大测试10s。"); toolTip1.SetToolTip(numericUpDownWebUIPort, "本地监听端口:用于直接返回测速结果的节点信息,方便 Sub-Store 实现订阅转换。"); toolTip1.SetToolTip(numericUpDownSubStorePort, "Sub-Store监听端口:用于订阅订阅转换。\n注意:除非你知道你在干什么,否则不要将你的 Sub-Store 暴露到公网,否则可能会被滥用"); toolTip1.SetToolTip(numericUpDownDownloadMb, "下载测试限制(MB):当达到下载数据大小时,停止下载,可节省测速流量,减少测速测死的概率"); - toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, "总下载速度限制(MB/s):建议设置为 <=带宽/8, 比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20"); toolTip1.SetToolTip(textBoxSubsUrls, "节点池订阅地址:支持 Link、Base64、Clash 格式的订阅链接。"); toolTip1.SetToolTip(checkBoxEnableRenameNode, "以节点IP查询位置重命名节点。\n质量差的节点可能造成IP查询失败,造成整体检查速度稍微变慢。"); toolTip1.SetToolTip(checkBoxEnableMediaCheck, "是否开启流媒体检测,其中IP欺诈依赖'节点地址查询',内核版本需要 v2.0.8 以上\n\n示例:美国1 | ⬇️ 5.6MB/s |0%|Netflix|Disney|Openai\n风控值:0% (使用ping0.cc标准)\n流媒体解锁:Netflix、Disney、Openai"); @@ -74,20 +97,12 @@ public MainGui() toolTip1.SetToolTip(textBox2, "Gist ID:注意!非Github用户名!"); toolTip1.SetToolTip(textBox3, "Github TOKEN"); - toolTip1.SetToolTip(comboBoxSubscriptionType, "通用订阅:内置了Sub-Store程序,自适应订阅格式。\nClash订阅:带规则的 Mihomo、Clash 订阅格式。"); - toolTip1.SetToolTip(comboBoxOverwriteUrls, "生成带规则的 Clash 订阅所需的覆写规则文件"); - toolTip1.SetToolTip(checkBoxEnableSuccessLimit, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); toolTip1.SetToolTip(checkBoxTotalBandwidthLimit, "总的下载速度限制,不选代表不限制"); toolTip1.SetToolTip(numericUpDownSuccessLimit, "保存几个成功的节点,不选代表不限制,内核版本需要 v2.1.0 以上\n如果你的并发数量超过这个参数,那么成功的结果可能会大于这个数值"); toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, "总的下载速度限制,不选代表不限制"); - toolTip1.SetToolTip(labelCron, "双击切换 使用「分钟倒计时」"); - - toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); - - toolTip1.SetToolTip(checkBoxStartup, "开机启动:勾选后,程序将在Windows启动时自动运行"); // 设置通知图标的上下文菜单 SetupNotifyIconContextMenu(); } @@ -2729,20 +2744,27 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) private void numericUpDown1_ValueChanged(object sender, EventArgs e) { - if (numericUpDownConcurrent.Value > 128) + if (checkBoxHighConcurrent.Checked) { - string warningMessage = - "⚠️ 高并发风险提醒 ⚠️\n\n" + - "您设置的并发数值过高,可能导致:\n\n" + - "• 运营商判定为异常流量并限制网络\n" + - "• 路由器性能压力过大\n" + - "• 测速结果不准确\n\n" + - "并发数设置建议:\n" + - "• 宽带峰值/50Mbps:一般对网络无影响\n" + - "• 宽带峰值/25Mbps:可能会影响同网络下载任务\n" + - "• 宽带峰值/10Mbps:可能会影响同网络下其他设备的上网体验\n"; + Log("已启用流水线高并发模式✨\n- 此值将作为计算测活-测速-流媒体检测各阶段并发数的基准.\n- 内核已启用衰减算法,可放心设置"); + } + else + { + if (numericUpDownConcurrent.Value > 128) + { + string warningMessage = + "⚠️ 高并发风险提醒 ⚠️\n\n" + + "您设置的并发数值过高,可能导致:\n\n" + + "• 运营商判定为异常流量并限制网络\n" + + "• 路由器性能压力过大\n" + + "• 测速结果不准确\n\n" + + "并发数设置建议:\n" + + "• 宽带峰值/50Mbps:一般对网络无影响\n" + + "• 宽带峰值/25Mbps:可能会影响同网络下载任务\n" + + "• 宽带峰值/10Mbps:可能会影响同网络下其他设备的上网体验\n"; - Log(warningMessage); + Log(warningMessage); + } } } @@ -3796,7 +3818,7 @@ private void checkBoxPipeAuto_CheckedChanged(object sender, EventArgs e) SetNumericUpDownValueSafe(numericUpDownPipeAlive, alive); SetNumericUpDownValueSafe(numericUpDownPipeSpeed, speed); SetNumericUpDownValueSafe(numericUpDownPipeMedia, media); - Log($"默认并发参数: 测活: {alive}, 测速: {speed}, 流媒体: {media}"); + Log($"默认并发参数: 测活: {alive}, 测速: {speed}, 流媒体: {media} [根据并发数 {numericUpDownConcurrent.Value} 计算]"); } } finally @@ -3824,5 +3846,12 @@ private void numericUpDownPipeMedia_ValueChanged(object sender, EventArgs e) switchPipeAutoConcurrent(); Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}"); } + + private void NumericUpDownTotalBandwidthLimit_ValueChanged(object sender, EventArgs e) + { + float calcBandWidth = (float)numericUpDownTotalBandwidthLimit.Value * 8; + Log($"当前设置下载速度限制带宽 {calcBandWidth} 兆。"); + toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, $"总下载速度限制(MB/s):\n建议设置为 <=带宽/8, \n比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20。\n\n当前设置下载速度对应带宽 {calcBandWidth}"); + } } } \ No newline at end of file From 17cbac3f9a35ad1dadd45063e7f830905a731cc5 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 29 Aug 2025 17:22:09 +0800 Subject: [PATCH 19/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=9E=B6=E6=9E=84=E5=88=87=E6=8D=A2=E9=80=BB=E8=BE=91?= =?UTF-8?q?,=E9=81=BF=E5=85=8D=E4=B8=8B=E8=BD=BD=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 0cccf3d..77b0abb 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -2618,7 +2618,11 @@ private void checkBox3_CheckedChanged(object sender, EventArgs e) private void checkBox6_CheckedChanged(object sender, EventArgs e) { if (checkBoxTotalBandwidthLimit.Checked) numericUpDownTotalBandwidthLimit.Enabled = true; - else numericUpDownTotalBandwidthLimit.Enabled = false; + else + { + numericUpDownTotalBandwidthLimit.Enabled = false; + numericUpDownTotalBandwidthLimit.Value = 0; + } } private async void comboBox5_SelectedIndexChanged(object sender, EventArgs e) @@ -3665,11 +3669,15 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg string want = EnableHighConcurrent ? "高并发内核" : "原版内核"; if (currentKernel != want) { + checkBoxSwitchArch64.Enabled = false; checkBoxHighConcurrent.Enabled = false; + buttonCheckUpdate.Enabled = false; Log(EnableHighConcurrent ? "切换为 高并发 内核,可单独设置测活-测速-媒体检测各阶段并发数,大幅提高性能" : "切换为 原版 内核"); await DownloadSubsCheckEXE();// 若要后台并行改为 _ = DownloadSubsCheckEXE(); currentKernel = want; + checkBoxSwitchArch64.Enabled = true; checkBoxHighConcurrent.Enabled = true; + buttonCheckUpdate.Enabled = true; } Log(EnableHighConcurrent ? "已切换高并发内核,测活-测速-媒体检测 流水线式并发运行。" : "使用原版内核。"); } @@ -3682,11 +3690,15 @@ private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs if (currentArch != want) { checkBoxSwitchArch64.Enabled = false; + checkBoxHighConcurrent.Enabled = false; + buttonCheckUpdate.Enabled = false; githubProxyURL = await GetGithubProxyUrlAsync(); Log(useX64 ? "切换为 x64 内核,内存占用更高,但CPU占用可能较低" : "切换为 i386 内核,内存占用更低,但CPU占用可能更高"); await DownloadSubsCheckEXE(); currentArch = want; checkBoxSwitchArch64.Enabled = true; + checkBoxHighConcurrent.Enabled = true; + buttonCheckUpdate.Enabled = true; } Log(useX64 ? "使用64位内核,如内存占用较高,可在[高级设置]切换" : "使用32位内核,如CPU占用较高,可在[高级设置]切换"); } @@ -3850,8 +3862,10 @@ private void numericUpDownPipeMedia_ValueChanged(object sender, EventArgs e) private void NumericUpDownTotalBandwidthLimit_ValueChanged(object sender, EventArgs e) { float calcBandWidth = (float)numericUpDownTotalBandwidthLimit.Value * 8; - Log($"当前设置下载速度限制带宽 {calcBandWidth} 兆。"); - toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, $"总下载速度限制(MB/s):\n建议设置为 <=带宽/8, \n比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20。\n\n当前设置下载速度对应带宽 {calcBandWidth}"); + if (calcBandWidth > 0) { + Log($"当前设置下载速度限制带宽 {calcBandWidth} 兆。"); + toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, $"总下载速度限制(MB/s):\n建议设置为 <=带宽/8, \n比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20。\n\n当前设置下载速度对应带宽 {calcBandWidth}"); + } } } } \ No newline at end of file From 1b9019e2f062ca3755ef6224e1d65b7604a4849d Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 29 Aug 2025 18:16:37 +0800 Subject: [PATCH 20/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E4=B9=8B=E5=89=8D=E6=88=90=E5=8A=9F=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 64 +++++++++++++++++++++++++++------------------ MainGui.cs | 32 ++++++++++++++++++----- 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 7ec0b77..5380e9f 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -121,6 +121,7 @@ private void InitializeComponent() this.groupBoxEnhance = new System.Windows.Forms.GroupBox(); this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); + this.checkBoxKeepSucced = new System.Windows.Forms.CheckBox(); this.groupBoxComonSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).BeginInit(); @@ -678,6 +679,7 @@ private void InitializeComponent() // // groupBoxAdvanceSettings // + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxKeepSucced); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownTotalBandwidthLimit); this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxTotalBandwidthLimit); this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadMb); @@ -1438,16 +1440,16 @@ private void InitializeComponent() // // textBox4 // - this.textBox4.Location = new System.Drawing.Point(856, 32); + this.textBox4.Location = new System.Drawing.Point(830, 32); this.textBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox4.Name = "textBox4"; - this.textBox4.Size = new System.Drawing.Size(558, 31); + this.textBox4.Size = new System.Drawing.Size(584, 31); this.textBox4.TabIndex = 5; // // label13 // this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(658, 37); + this.label13.Location = new System.Drawing.Point(633, 37); this.label13.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label13.Name = "label13"; this.label13.Size = new System.Drawing.Size(205, 21); @@ -1460,7 +1462,7 @@ private void InitializeComponent() this.textBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox3.Name = "textBox3"; this.textBox3.PasswordChar = '*'; - this.textBox3.Size = new System.Drawing.Size(180, 31); + this.textBox3.Size = new System.Drawing.Size(157, 31); this.textBox3.TabIndex = 3; this.textBox3.Enter += new System.EventHandler(this.textBox3_Enter); this.textBox3.Leave += new System.EventHandler(this.textBox3_Leave); @@ -1480,7 +1482,7 @@ private void InitializeComponent() this.textBox2.Location = new System.Drawing.Point(114, 32); this.textBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox2.Name = "textBox2"; - this.textBox2.Size = new System.Drawing.Size(180, 31); + this.textBox2.Size = new System.Drawing.Size(185, 31); this.textBox2.TabIndex = 1; // // label11 @@ -1518,11 +1520,11 @@ private void InitializeComponent() // // textBox6 // - this.textBox6.Location = new System.Drawing.Point(856, 32); + this.textBox6.Location = new System.Drawing.Point(794, 32); this.textBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox6.Name = "textBox6"; this.textBox6.PasswordChar = '*'; - this.textBox6.Size = new System.Drawing.Size(558, 31); + this.textBox6.Size = new System.Drawing.Size(620, 31); this.textBox6.TabIndex = 3; this.textBox6.Text = "1234567890"; this.textBox6.Enter += new System.EventHandler(this.textBox3_Enter); @@ -1531,7 +1533,7 @@ private void InitializeComponent() // label15 // this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(700, 37); + this.label15.Location = new System.Drawing.Point(633, 37); this.label15.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label15.Name = "label15"; this.label15.Size = new System.Drawing.Size(163, 21); @@ -1543,7 +1545,7 @@ private void InitializeComponent() this.textBox7.Location = new System.Drawing.Point(161, 32); this.textBox7.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox7.Name = "textBox7"; - this.textBox7.Size = new System.Drawing.Size(519, 31); + this.textBox7.Size = new System.Drawing.Size(460, 31); this.textBox7.TabIndex = 1; this.textBox7.Text = "https://example.worker.dev"; this.textBox7.Leave += new System.EventHandler(this.textBox7_Leave); @@ -1578,17 +1580,17 @@ private void InitializeComponent() // // textBox5 // - this.textBox5.Location = new System.Drawing.Point(856, 32); + this.textBox5.Location = new System.Drawing.Point(768, 32); this.textBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox5.Name = "textBox5"; - this.textBox5.Size = new System.Drawing.Size(558, 31); + this.textBox5.Size = new System.Drawing.Size(646, 31); this.textBox5.TabIndex = 5; this.textBox5.Text = "https://example.com/dav/"; // // label14 // this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(700, 37); + this.label14.Location = new System.Drawing.Point(633, 37); this.label14.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label14.Name = "label14"; this.label14.Size = new System.Drawing.Size(141, 21); @@ -1597,11 +1599,11 @@ private void InitializeComponent() // // textBox8 // - this.textBox8.Location = new System.Drawing.Point(471, 32); + this.textBox8.Location = new System.Drawing.Point(424, 32); this.textBox8.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox8.Name = "textBox8"; this.textBox8.PasswordChar = '*'; - this.textBox8.Size = new System.Drawing.Size(198, 31); + this.textBox8.Size = new System.Drawing.Size(197, 31); this.textBox8.TabIndex = 3; this.textBox8.Text = "admin"; this.textBox8.Enter += new System.EventHandler(this.textBox3_Enter); @@ -1610,7 +1612,7 @@ private void InitializeComponent() // label17 // this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(341, 37); + this.label17.Location = new System.Drawing.Point(308, 37); this.label17.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label17.Name = "label17"; this.label17.Size = new System.Drawing.Size(119, 21); @@ -1622,7 +1624,7 @@ private void InitializeComponent() this.textBox9.Location = new System.Drawing.Point(128, 32); this.textBox9.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox9.Name = "textBox9"; - this.textBox9.Size = new System.Drawing.Size(198, 31); + this.textBox9.Size = new System.Drawing.Size(171, 31); this.textBox9.TabIndex = 1; this.textBox9.Text = "admin"; // @@ -1656,14 +1658,14 @@ private void InitializeComponent() this.groupBoxPipeConcurrent.Controls.Add(this.labelPipeAlive); this.groupBoxPipeConcurrent.Location = new System.Drawing.Point(24, 1108); this.groupBoxPipeConcurrent.Name = "groupBoxPipeConcurrent"; - this.groupBoxPipeConcurrent.Size = new System.Drawing.Size(998, 89); + this.groupBoxPipeConcurrent.Size = new System.Drawing.Size(967, 89); this.groupBoxPipeConcurrent.TabIndex = 7; this.groupBoxPipeConcurrent.TabStop = false; this.groupBoxPipeConcurrent.Text = "流水线并发 参数"; // // numericUpDownPipeMedia // - this.numericUpDownPipeMedia.Location = new System.Drawing.Point(866, 36); + this.numericUpDownPipeMedia.Location = new System.Drawing.Point(830, 36); this.numericUpDownPipeMedia.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownPipeMedia.Maximum = new decimal(new int[] { 1000, @@ -1678,7 +1680,7 @@ private void InitializeComponent() // labelPipeMedia // this.labelPipeMedia.AutoSize = true; - this.labelPipeMedia.Location = new System.Drawing.Point(667, 41); + this.labelPipeMedia.Location = new System.Drawing.Point(633, 41); this.labelPipeMedia.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelPipeMedia.Name = "labelPipeMedia"; this.labelPipeMedia.Size = new System.Drawing.Size(199, 21); @@ -1687,7 +1689,7 @@ private void InitializeComponent() // // numericUpDownPipeSpeed // - this.numericUpDownPipeSpeed.Location = new System.Drawing.Point(534, 36); + this.numericUpDownPipeSpeed.Location = new System.Drawing.Point(513, 36); this.numericUpDownPipeSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownPipeSpeed.Maximum = new decimal(new int[] { 500, @@ -1702,7 +1704,7 @@ private void InitializeComponent() // labelPipeSpeed // this.labelPipeSpeed.AutoSize = true; - this.labelPipeSpeed.Location = new System.Drawing.Point(400, 41); + this.labelPipeSpeed.Location = new System.Drawing.Point(387, 41); this.labelPipeSpeed.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelPipeSpeed.Name = "labelPipeSpeed"; this.labelPipeSpeed.Size = new System.Drawing.Size(136, 21); @@ -1712,10 +1714,11 @@ private void InitializeComponent() // checkBoxPipeAuto // this.checkBoxPipeAuto.AutoSize = true; + this.checkBoxPipeAuto.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.checkBoxPipeAuto.Location = new System.Drawing.Point(18, 39); this.checkBoxPipeAuto.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBoxPipeAuto.Name = "checkBoxPipeAuto"; - this.checkBoxPipeAuto.Size = new System.Drawing.Size(99, 25); + this.checkBoxPipeAuto.Size = new System.Drawing.Size(102, 25); this.checkBoxPipeAuto.TabIndex = 38; this.checkBoxPipeAuto.Text = "自适应"; this.checkBoxPipeAuto.UseVisualStyleBackColor = true; @@ -1723,7 +1726,7 @@ private void InitializeComponent() // // numericUpDownPipeAlive // - this.numericUpDownPipeAlive.Location = new System.Drawing.Point(272, 38); + this.numericUpDownPipeAlive.Location = new System.Drawing.Point(264, 36); this.numericUpDownPipeAlive.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownPipeAlive.Maximum = new decimal(new int[] { 5000, @@ -1750,9 +1753,9 @@ private void InitializeComponent() // this.groupBoxEnhance.Controls.Add(this.checkBoxDropBadCFNodes); this.groupBoxEnhance.Controls.Add(this.checkBoxEhanceTag); - this.groupBoxEnhance.Location = new System.Drawing.Point(1028, 1108); + this.groupBoxEnhance.Location = new System.Drawing.Point(997, 1108); this.groupBoxEnhance.Name = "groupBoxEnhance"; - this.groupBoxEnhance.Size = new System.Drawing.Size(426, 89); + this.groupBoxEnhance.Size = new System.Drawing.Size(457, 89); this.groupBoxEnhance.TabIndex = 44; this.groupBoxEnhance.TabStop = false; this.groupBoxEnhance.Text = "Enhance 参数"; @@ -1779,6 +1782,16 @@ private void InitializeComponent() this.checkBoxEhanceTag.Text = "增强位置标签"; this.checkBoxEhanceTag.UseVisualStyleBackColor = true; // + // checkBoxKeepSucced + // + this.checkBoxKeepSucced.AutoSize = true; + this.checkBoxKeepSucced.Location = new System.Drawing.Point(633, 173); + this.checkBoxKeepSucced.Name = "checkBoxKeepSucced"; + this.checkBoxKeepSucced.Size = new System.Drawing.Size(204, 25); + this.checkBoxKeepSucced.TabIndex = 38; + this.checkBoxKeepSucced.Text = "保留测试成功节点"; + this.checkBoxKeepSucced.UseVisualStyleBackColor = true; + // // MainGui // this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); @@ -1927,6 +1940,7 @@ private void InitializeComponent() private System.Windows.Forms.GroupBox groupBoxEnhance; private System.Windows.Forms.CheckBox checkBoxEhanceTag; private System.Windows.Forms.CheckBox checkBoxDropBadCFNodes; + private System.Windows.Forms.CheckBox checkBoxKeepSucced; } } diff --git a/MainGui.cs b/MainGui.cs index 77b0abb..d775a8f 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -103,6 +103,11 @@ public MainGui() toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, "总的下载速度限制,不选代表不限制"); + toolTip1.SetToolTip(labelCron, "双击切换 使用「分钟倒计时」"); + + toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); + + toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会在内存中保留成功节点以便下次使用(重启后丢失)\n可在订阅链接中添加以下地址作为替代:\n- http://127.0.0.1:8199/all.yaml#KeepSucced\n"); // 设置通知图标的上下文菜单 SetupNotifyIconContextMenu(); } @@ -551,6 +556,11 @@ private async void ReadConfig()//读取配置文件 string subscheckversion = 读取config字符串(config, "subscheck-version"); if (subscheckversion != null) 当前subsCheck版本号 = subscheckversion; + string keepSucced = 读取config字符串(config, "keep-success-proxies"); + if (keepSucced != null && keepSucced == "true") checkBoxKeepSucced.Checked = true; + else checkBoxKeepSucced.Checked = false; + + int? successlimit = 读取config整数(config, "success-limit"); if (successlimit.HasValue) { @@ -762,14 +772,24 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["githubproxy"] = comboBoxGithubProxyUrl.Text; config["github-proxy"] = githubProxyURL; - // 保存sub-urls列表 + // 保存sub-urls列表 List subUrls = new List(); string allyamlFilePath = System.IO.Path.Combine(executablePath, "output", "all.yaml"); if (System.IO.File.Exists(allyamlFilePath)) { - subUrls.Add($"http://127.0.0.1:{numericUpDownWebUIPort.Value}/all.yaml"); + + subUrls.Add($"http://127.0.0.1:{numericUpDownWebUIPort.Value}/all.yaml#KeepSucced"); + Log("已加载上次测试结果。"); + checkBoxKeepSucced.Visible = false; } + else + { + checkBoxKeepSucced.Visible = true; + checkBoxKeepSucced.Checked = true; + Log("将于第二次自动运行时加载上次测试结果。"); + } + if (!string.IsNullOrEmpty(textBoxSubsUrls.Text)) { @@ -841,8 +861,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["rename-node"] = checkBoxEnableRenameNode.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBoxEnableMediaCheck.Checked;//是否开启流媒体检测 - config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 - config["keep-success-proxies"] = false; + config["keep-success-proxies"] = checkBoxKeepSucced.Checked;//是否保留成功的节点 config["print-progress"] = false;//是否显示进度 config["sub-urls-retry"] = 3;//重试次数(获取订阅失败后重试次数) config["subscheck-version"] = 当前subsCheck版本号;//当前subsCheck版本号 @@ -3862,10 +3881,11 @@ private void numericUpDownPipeMedia_ValueChanged(object sender, EventArgs e) private void NumericUpDownTotalBandwidthLimit_ValueChanged(object sender, EventArgs e) { float calcBandWidth = (float)numericUpDownTotalBandwidthLimit.Value * 8; - if (calcBandWidth > 0) { + if (calcBandWidth > 0) + { Log($"当前设置下载速度限制带宽 {calcBandWidth} 兆。"); toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, $"总下载速度限制(MB/s):\n建议设置为 <=带宽/8, \n比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20。\n\n当前设置下载速度对应带宽 {calcBandWidth}"); - } + } } } } \ No newline at end of file From e8c15b7c7ada8156273fc376ed88dc739f5e1398 Mon Sep 17 00:00:00 2001 From: sinspired Date: Sat, 30 Aug 2025 00:49:17 +0800 Subject: [PATCH 21/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E6=A3=80=E6=B5=8B\=E7=BB=93=E6=9D=9F=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E7=9A=84=E6=8C=89=E9=92=AE=E4=BA=8B=E4=BB=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91,=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 94 +++++++++---------- MainGui.cs | 215 ++++++++++++++++++++++++++++---------------- 2 files changed, 187 insertions(+), 122 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 5380e9f..8e4d9d2 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -68,6 +68,7 @@ private void InitializeComponent() this.richTextBoxAllLog = new System.Windows.Forms.RichTextBox(); this.labelLogNodeInfo = new System.Windows.Forms.Label(); this.groupBoxAdvanceSettings = new System.Windows.Forms.GroupBox(); + this.checkBoxKeepSucced = new System.Windows.Forms.CheckBox(); this.numericUpDownTotalBandwidthLimit = new System.Windows.Forms.NumericUpDown(); this.checkBoxTotalBandwidthLimit = new System.Windows.Forms.CheckBox(); this.labelDownloadMb = new System.Windows.Forms.Label(); @@ -121,7 +122,6 @@ private void InitializeComponent() this.groupBoxEnhance = new System.Windows.Forms.GroupBox(); this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); - this.checkBoxKeepSucced = new System.Windows.Forms.CheckBox(); this.groupBoxComonSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).BeginInit(); @@ -157,7 +157,7 @@ private void InitializeComponent() // this.timerinitial.Enabled = true; this.timerinitial.Interval = 1; - this.timerinitial.Tick += new System.EventHandler(this.timer1_Tick); + this.timerinitial.Tick += new System.EventHandler(this.timerinitial_Tick); // // groupBoxComonSettings // @@ -225,7 +225,7 @@ private void InitializeComponent() 0, 0, 0}); - this.numericUpDownConcurrent.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged); + this.numericUpDownConcurrent.ValueChanged += new System.EventHandler(this.numericUpDownConcurrent_ValueChanged); // // labelInterval // @@ -294,7 +294,7 @@ private void InitializeComponent() 0, 0, 0}); - this.numericUpDownTimeout.ValueChanged += new System.EventHandler(this.numericUpDown3_ValueChanged); + this.numericUpDownTimeout.ValueChanged += new System.EventHandler(this.numericUpDownTimeout_ValueChanged); // // labelMinSpped // @@ -328,7 +328,7 @@ private void InitializeComponent() 0, 0, 0}); - this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDown4_ValueChanged); + this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDownMinSpeed_ValueChanged); // // labelSaveMethod // @@ -354,7 +354,7 @@ private void InitializeComponent() this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; this.comboBoxSaveMethod.Size = new System.Drawing.Size(103, 29); this.comboBoxSaveMethod.TabIndex = 16; - this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBoxSaveMethod_TextChanged); // // checkBoxHighConcurrent // @@ -401,7 +401,7 @@ private void InitializeComponent() this.buttonCopySubscriptionUrl.TabIndex = 18; this.buttonCopySubscriptionUrl.Text = "复制订阅"; this.buttonCopySubscriptionUrl.UseVisualStyleBackColor = true; - this.buttonCopySubscriptionUrl.Click += new System.EventHandler(this.button3_Click); + this.buttonCopySubscriptionUrl.Click += new System.EventHandler(this.buttonCopySubscriptionUrl_Click); // // buttonTriggerCheck // @@ -413,7 +413,7 @@ private void InitializeComponent() this.buttonTriggerCheck.TabIndex = 30; this.buttonTriggerCheck.Text = "🔀未启动"; this.buttonTriggerCheck.UseVisualStyleBackColor = true; - this.buttonTriggerCheck.Click += new System.EventHandler(this.button7_Click); + this.buttonTriggerCheck.Click += new System.EventHandler(this.buttonTriggerCheck_Click); // // buttonWebUi // @@ -425,7 +425,7 @@ private void InitializeComponent() this.buttonWebUi.TabIndex = 29; this.buttonWebUi.Text = "访问WebUI"; this.buttonWebUi.UseVisualStyleBackColor = true; - this.buttonWebUi.Click += new System.EventHandler(this.button6_Click); + this.buttonWebUi.Click += new System.EventHandler(this.buttonWebUi_Click); // // checkBoxStartup // @@ -437,7 +437,7 @@ private void InitializeComponent() this.checkBoxStartup.TabIndex = 30; this.checkBoxStartup.Text = "开机自启"; this.checkBoxStartup.UseVisualStyleBackColor = true; - this.checkBoxStartup.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); + this.checkBoxStartup.CheckedChanged += new System.EventHandler(this.checkBoxStartup_CheckedChanged); // // textBoxCron // @@ -473,7 +473,7 @@ private void InitializeComponent() this.labelSubUrls.Size = new System.Drawing.Size(284, 21); this.labelSubUrls.TabIndex = 9; this.labelSubUrls.Text = "节点池订阅链接(点击编辑):"; - this.labelSubUrls.Click += new System.EventHandler(this.textBox1_DoubleClick); + this.labelSubUrls.Click += new System.EventHandler(this.textBoxSubsUrls_DoubleClick); // // textBoxSubsUrls // @@ -487,8 +487,8 @@ private void InitializeComponent() this.textBoxSubsUrls.TabIndex = 17; this.textBoxSubsUrls.Text = resources.GetString("textBoxSubsUrls.Text"); this.textBoxSubsUrls.WordWrap = false; - this.textBoxSubsUrls.Click += new System.EventHandler(this.textBox1_DoubleClick); - this.textBoxSubsUrls.DoubleClick += new System.EventHandler(this.textBox1_DoubleClick); + this.textBoxSubsUrls.Click += new System.EventHandler(this.textBoxSubsUrls_DoubleClick); + this.textBoxSubsUrls.DoubleClick += new System.EventHandler(this.textBoxSubsUrls_DoubleClick); // // buttonStartCheck // @@ -500,7 +500,7 @@ private void InitializeComponent() this.buttonStartCheck.TabIndex = 0; this.buttonStartCheck.Text = "▶️ 启动"; this.buttonStartCheck.UseVisualStyleBackColor = true; - this.buttonStartCheck.Click += new System.EventHandler(this.button1_Click); + this.buttonStartCheck.Click += new System.EventHandler(this.buttonStartCheck_Click); // // buttonAdvanceSettings // @@ -511,7 +511,7 @@ private void InitializeComponent() this.buttonAdvanceSettings.TabIndex = 1; this.buttonAdvanceSettings.Text = "高级设置∧"; this.buttonAdvanceSettings.UseVisualStyleBackColor = true; - this.buttonAdvanceSettings.Click += new System.EventHandler(this.button2_Click); + this.buttonAdvanceSettings.Click += new System.EventHandler(this.buttonAdvanceSettings_Click); // // numericUpDownWebUIPort // @@ -535,7 +535,7 @@ private void InitializeComponent() 0, 0, 0}); - this.numericUpDownWebUIPort.ValueChanged += new System.EventHandler(this.numericUpDown6_ValueChanged); + this.numericUpDownWebUIPort.ValueChanged += new System.EventHandler(this.numericUpDownWebUIPort_ValueChanged); // // numericUpDownDLTimehot // @@ -602,7 +602,7 @@ private void InitializeComponent() 0, 0, 0}); - this.numericUpDownSubStorePort.ValueChanged += new System.EventHandler(this.numericUpDown6_ValueChanged); + this.numericUpDownSubStorePort.ValueChanged += new System.EventHandler(this.numericUpDownWebUIPort_ValueChanged); // // labelSubstorePort // @@ -639,7 +639,7 @@ private void InitializeComponent() this.linkLabelAbout.TabIndex = 21; this.linkLabelAbout.TabStop = true; this.linkLabelAbout.Text = "关于 SubsCheck Win GUI"; - this.linkLabelAbout.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + this.linkLabelAbout.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelAbout_LinkClicked); // // buttonUpdateKernel // @@ -651,7 +651,7 @@ private void InitializeComponent() this.buttonUpdateKernel.Text = "更新内核"; this.buttonUpdateKernel.UseVisualStyleBackColor = true; this.buttonUpdateKernel.Visible = false; - this.buttonUpdateKernel.Click += new System.EventHandler(this.button5_Click); + this.buttonUpdateKernel.Click += new System.EventHandler(this.buttonUpdateKernel_Click); // // richTextBoxAllLog // @@ -666,7 +666,7 @@ private void InitializeComponent() this.richTextBoxAllLog.Size = new System.Drawing.Size(1088, 813); this.richTextBoxAllLog.TabIndex = 0; this.richTextBoxAllLog.Text = ""; - this.richTextBoxAllLog.DoubleClick += new System.EventHandler(this.richTextBox1_DoubleClick); + this.richTextBoxAllLog.DoubleClick += new System.EventHandler(this.richTextBoxAllLog_DoubleClick); // // labelLogNodeInfo // @@ -714,6 +714,16 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.Text = "高级设置"; this.groupBoxAdvanceSettings.Visible = false; // + // checkBoxKeepSucced + // + this.checkBoxKeepSucced.AutoSize = true; + this.checkBoxKeepSucced.Location = new System.Drawing.Point(633, 173); + this.checkBoxKeepSucced.Name = "checkBoxKeepSucced"; + this.checkBoxKeepSucced.Size = new System.Drawing.Size(204, 25); + this.checkBoxKeepSucced.TabIndex = 38; + this.checkBoxKeepSucced.Text = "保留测试成功节点"; + this.checkBoxKeepSucced.UseVisualStyleBackColor = true; + // // numericUpDownTotalBandwidthLimit // this.numericUpDownTotalBandwidthLimit.Enabled = false; @@ -744,7 +754,7 @@ private void InitializeComponent() this.checkBoxTotalBandwidthLimit.TabIndex = 36; this.checkBoxTotalBandwidthLimit.Text = "带宽限制(MB/s):"; this.checkBoxTotalBandwidthLimit.UseVisualStyleBackColor = true; - this.checkBoxTotalBandwidthLimit.CheckedChanged += new System.EventHandler(this.checkBox6_CheckedChanged); + this.checkBoxTotalBandwidthLimit.CheckedChanged += new System.EventHandler(this.checkBoxTotalBandwidthLimit_CheckedChanged); // // labelDownloadMb // @@ -784,7 +794,7 @@ private void InitializeComponent() this.buttonMoreSettings.TabIndex = 29; this.buttonMoreSettings.Text = "补充参数"; this.buttonMoreSettings.UseVisualStyleBackColor = true; - this.buttonMoreSettings.Click += new System.EventHandler(this.button8_Click); + this.buttonMoreSettings.Click += new System.EventHandler(this.buttonMoreSettings_Click); // // textBoxWebUiAPIKey // @@ -797,8 +807,8 @@ private void InitializeComponent() this.textBoxWebUiAPIKey.Size = new System.Drawing.Size(363, 31); this.textBoxWebUiAPIKey.TabIndex = 6; this.textBoxWebUiAPIKey.Text = "admin"; - this.textBoxWebUiAPIKey.Enter += new System.EventHandler(this.textBox10_Enter); - this.textBoxWebUiAPIKey.Leave += new System.EventHandler(this.textBox10_Leave); + this.textBoxWebUiAPIKey.Enter += new System.EventHandler(this.textBoxWebUiAPIKey_Enter); + this.textBoxWebUiAPIKey.Leave += new System.EventHandler(this.textBoxWebUiAPIKey_Leave); // // checkBoxEnableWebUI // @@ -810,7 +820,7 @@ private void InitializeComponent() this.checkBoxEnableWebUI.TabIndex = 28; this.checkBoxEnableWebUI.Text = "启用WebUI API密钥:"; this.checkBoxEnableWebUI.UseVisualStyleBackColor = true; - this.checkBoxEnableWebUI.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged); + this.checkBoxEnableWebUI.CheckedChanged += new System.EventHandler(this.checkBoxEnableWebUI_CheckedChanged); // // numericUpDownSuccessLimit // @@ -846,22 +856,22 @@ private void InitializeComponent() this.checkBoxEnableSuccessLimit.TabIndex = 27; this.checkBoxEnableSuccessLimit.Text = "节点保存数目:"; this.checkBoxEnableSuccessLimit.UseVisualStyleBackColor = true; - this.checkBoxEnableSuccessLimit.CheckedChanged += new System.EventHandler(this.checkBox3_CheckedChanged); + this.checkBoxEnableSuccessLimit.CheckedChanged += new System.EventHandler(this.checkBoxEnableSuccessLimit_CheckedChanged); // // buttonCheckUpdate // - this.buttonCheckUpdate.BackColor = System.Drawing.Color.LimeGreen; + this.buttonCheckUpdate.BackColor = System.Drawing.SystemColors.Control; this.buttonCheckUpdate.FlatAppearance.BorderSize = 0; this.buttonCheckUpdate.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.buttonCheckUpdate.ForeColor = System.Drawing.SystemColors.HighlightText; + this.buttonCheckUpdate.ForeColor = System.Drawing.SystemColors.ControlText; this.buttonCheckUpdate.Location = new System.Drawing.Point(1276, 165); this.buttonCheckUpdate.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonCheckUpdate.Name = "buttonCheckUpdate"; this.buttonCheckUpdate.Size = new System.Drawing.Size(138, 40); this.buttonCheckUpdate.TabIndex = 26; this.buttonCheckUpdate.Text = "检查更新"; - this.buttonCheckUpdate.UseVisualStyleBackColor = false; - this.buttonCheckUpdate.Click += new System.EventHandler(this.button4_Click); + this.buttonCheckUpdate.UseVisualStyleBackColor = true; + this.buttonCheckUpdate.Click += new System.EventHandler(this.buttonCheckUpdate_Click); // // checkBoxEnableRenameNode // @@ -875,7 +885,7 @@ private void InitializeComponent() this.checkBoxEnableRenameNode.TabIndex = 22; this.checkBoxEnableRenameNode.Text = "节点地址查询"; this.checkBoxEnableRenameNode.UseVisualStyleBackColor = true; - this.checkBoxEnableRenameNode.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + this.checkBoxEnableRenameNode.CheckedChanged += new System.EventHandler(this.checkBoxEnableRenameNode_CheckedChanged); // // checkBoxEnableMediaCheck // @@ -887,7 +897,7 @@ private void InitializeComponent() this.checkBoxEnableMediaCheck.TabIndex = 25; this.checkBoxEnableMediaCheck.Text = "流媒体检测"; this.checkBoxEnableMediaCheck.UseVisualStyleBackColor = true; - this.checkBoxEnableMediaCheck.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged); + this.checkBoxEnableMediaCheck.CheckedChanged += new System.EventHandler(this.checkBoxEnableMediaCheck_CheckedChanged); // // comboBoxOverwriteUrls // @@ -916,7 +926,7 @@ private void InitializeComponent() this.comboBoxOverwriteUrls.Name = "comboBoxOverwriteUrls"; this.comboBoxOverwriteUrls.Size = new System.Drawing.Size(517, 29); this.comboBoxOverwriteUrls.TabIndex = 24; - this.comboBoxOverwriteUrls.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBoxOverwriteUrls.SelectedIndexChanged += new System.EventHandler(this.comboBoxOverwriteUrls_SelectedIndexChanged); // // labelOverwriteUrls // @@ -1363,7 +1373,7 @@ private void InitializeComponent() this.comboBoxGithubProxyUrl.Name = "comboBoxGithubProxyUrl"; this.comboBoxGithubProxyUrl.Size = new System.Drawing.Size(308, 29); this.comboBoxGithubProxyUrl.TabIndex = 21; - this.comboBoxGithubProxyUrl.Leave += new System.EventHandler(this.comboBox3_Leave); + this.comboBoxGithubProxyUrl.Leave += new System.EventHandler(this.comboBoxGithubProxyUrl_Leave); // // labelGithubProxyUrl // @@ -1418,7 +1428,7 @@ private void InitializeComponent() // timerCopySubscriptionUrl // this.timerCopySubscriptionUrl.Interval = 2000; - this.timerCopySubscriptionUrl.Tick += new System.EventHandler(this.timer2_Tick); + this.timerCopySubscriptionUrl.Tick += new System.EventHandler(this.timerCopySubscriptionUrl_Tick); // // groupBoxGist // @@ -1641,11 +1651,11 @@ private void InitializeComponent() // timerRestartSchedule // this.timerRestartSchedule.Interval = 86400000; - this.timerRestartSchedule.Tick += new System.EventHandler(this.timer3_Tick); + this.timerRestartSchedule.Tick += new System.EventHandler(this.timerRestartSchedule_Tick); // // timerRefresh // - this.timerRefresh.Tick += new System.EventHandler(this.timer4_Tick); + this.timerRefresh.Tick += new System.EventHandler(this.timerRefresh_Tick); // // groupBoxPipeConcurrent // @@ -1782,16 +1792,6 @@ private void InitializeComponent() this.checkBoxEhanceTag.Text = "增强位置标签"; this.checkBoxEhanceTag.UseVisualStyleBackColor = true; // - // checkBoxKeepSucced - // - this.checkBoxKeepSucced.AutoSize = true; - this.checkBoxKeepSucced.Location = new System.Drawing.Point(633, 173); - this.checkBoxKeepSucced.Name = "checkBoxKeepSucced"; - this.checkBoxKeepSucced.Size = new System.Drawing.Size(204, 25); - this.checkBoxKeepSucced.TabIndex = 38; - this.checkBoxKeepSucced.Text = "保留测试成功节点"; - this.checkBoxKeepSucced.UseVisualStyleBackColor = true; - // // MainGui // this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); diff --git a/MainGui.cs b/MainGui.cs index d775a8f..b5c43e0 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -64,6 +64,10 @@ public MainGui() toolTip1.SetToolTip(checkBoxHighConcurrent, "启用流水线分段高并发版本内核。"); toolTip1.SetToolTip(checkBoxSwitchArch64, "启用64位版本内核。"); + toolTip1.SetToolTip(buttonTriggerCheck, "⏯️开始检测:发送开始检测信号,开始检测;\n⏸️结束检测:发送停止信号,内核保持后台运行。"); + + toolTip1.SetToolTip(buttonStartCheck, "启动内核检测进程。"); + toolTip1.SetToolTip(checkBoxPipeAuto, "auto: 切换自适应流水线分段并发模式。"); toolTip1.SetToolTip(numericUpDownPipeAlive, "测活任务并发数:\n取决于CPU和路由器芯片性能,建议设置 100-1000。\n\n量力而行!"); toolTip1.SetToolTip(numericUpDownPipeSpeed, "测速任务并发数。\n建议设置 10-32。"); @@ -143,7 +147,8 @@ private void SetupNotifyIconContextMenu() { if (buttonStartCheck.Text == "▶️ 启动") { - button1_Click(sender, e); + buttonStartCheck.ForeColor = Color.Black; + buttonStartCheck_Click(sender, e); } }; @@ -153,7 +158,8 @@ private void SetupNotifyIconContextMenu() { if (buttonStartCheck.Text == "⏹️ 停止") { - button1_Click(sender, e); + buttonStartCheck.ForeColor = Color.Red; + buttonStartCheck_Click(sender, e); } }; stopMenuItem.Enabled = false; // 初始状态下禁用 @@ -211,10 +217,10 @@ protected override void OnFormClosing(FormClosingEventArgs e) } } - private async void timer1_Tick(object sender, EventArgs e)//初始化 + private async void timerinitial_Tick(object sender, EventArgs e)//初始化 { timerinitial.Enabled = false; - if (buttonAdvanceSettings.Text == "高级设置∧") button2_Click(sender, e); + if (buttonAdvanceSettings.Text == "高级设置∧") buttonAdvanceSettings_Click(sender, e); // 检查并创建config文件夹 string executablePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); string configFolderPath = System.IO.Path.Combine(executablePath, "config"); @@ -252,7 +258,7 @@ private async void timer1_Tick(object sender, EventArgs e)//初始化 if (CheckCommandLineParameter("-auto")) { Log("检测到开机启动,准备执行任务..."); - button1_Click(this, EventArgs.Empty); + buttonStartCheck_Click(this, EventArgs.Empty); this.Hide(); notifyIcon1.Visible = true; } @@ -303,7 +309,7 @@ private bool IsNetworkAvailable() private async void ReadConfig()//读取配置文件 { - checkBoxStartup.CheckedChanged -= checkBox5_CheckedChanged;// 临时移除事件处理器,防止触发事件 + checkBoxStartup.CheckedChanged -= checkBoxStartup_CheckedChanged;// 临时移除事件处理器,防止触发事件 try { string executablePath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); @@ -326,6 +332,11 @@ private async void ReadConfig()//读取配置文件 string subscheckKernel = 读取config字符串(config, "subscheck-kernel"); if (!string.IsNullOrWhiteSpace(subscheckKernel)) currentKernel = subscheckKernel; + string githubproxy = 读取config字符串(config, "githubproxy"); + if (githubproxy != null) comboBoxGithubProxyUrl.Text = githubproxy; + + const string githubRawPrefix = "https://raw.githubusercontent.com/"; + // 使用新函数获取整数值并设置UI控件 int? concurrentValue = 读取config整数(config, "concurrent"); if (concurrentValue.HasValue) numericUpDownConcurrent.Value = concurrentValue.Value; @@ -379,16 +390,11 @@ private async void ReadConfig()//读取配置文件 bool.TryParse(enableHighConcurrentRaw.Trim(), out enableHighConcurrentFlag); } - // 从控件读取最终并发数(确保不会访问 Nullable.Value) - int alive = (int)numericUpDownPipeAlive.Value; - int speed = (int)numericUpDownPipeSpeed.Value; - int media = (int)numericUpDownPipeMedia.Value; - // 决定是否启用高并发:只要显式开启 或 drop/enhance 为 true 或 三阶段并发均 > 0 bool needHighConcurrent = enableHighConcurrentFlag || dropBadCFFlag || enhanceTagFlag - || (alive > 0 && speed > 0 && media > 0); + || (aliveConcurrentValue > 0 && speedConcurrentValue > 0 && mediaConcurrentValue > 0); checkBoxHighConcurrent.Checked = needHighConcurrent; @@ -459,11 +465,6 @@ private async void ReadConfig()//读取配置文件 } } - string githubproxy = 读取config字符串(config, "githubproxy"); - if (githubproxy != null) comboBoxGithubProxyUrl.Text = githubproxy; - - const string githubRawPrefix = "https://raw.githubusercontent.com/"; - string mihomoOverwriteUrl = 读取config字符串(config, "mihomo-overwrite-url"); int mihomoOverwriteUrlIndex = mihomoOverwriteUrl.IndexOf(githubRawPrefix); if (mihomoOverwriteUrl != null) @@ -649,7 +650,7 @@ private async void ReadConfig()//读取配置文件 MessageBox.Show($"读取配置文件时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } - checkBoxStartup.CheckedChanged += checkBox5_CheckedChanged;// 重新绑定事件处理器 + checkBoxStartup.CheckedChanged += checkBoxStartup_CheckedChanged;// 重新绑定事件处理器 } private int? 读取config整数(Dictionary config, string fieldName) @@ -772,14 +773,20 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["githubproxy"] = comboBoxGithubProxyUrl.Text; config["github-proxy"] = githubProxyURL; - // 保存sub-urls列表 + // 保存订阅列表 List subUrls = new List(); + // 使用 HashSet 来快速判重(不区分大小写),只比较主干部分(去掉 fragment) + var seen = new HashSet(StringComparer.OrdinalIgnoreCase); + string allyamlFilePath = System.IO.Path.Combine(executablePath, "output", "all.yaml"); - if (System.IO.File.Exists(allyamlFilePath)) + if (System.IO.File.Exists(allyamlFilePath) && checkBoxEnableWebUI.Checked) { - - subUrls.Add($"http://127.0.0.1:{numericUpDownWebUIPort.Value}/all.yaml#KeepSucced"); - + string succedProxiesUrl = $"http://127.0.0.1:{Convert.ToInt32(numericUpDownWebUIPort.Value)}/all.yaml#KeepSucced"; + string succedProxiesUrlKey = succedProxiesUrl.Split('#')[0]; + if (seen.Add(succedProxiesUrlKey)) + { + subUrls.Add(succedProxiesUrl); + } Log("已加载上次测试结果。"); checkBoxKeepSucced.Visible = false; } @@ -790,19 +797,28 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 Log("将于第二次自动运行时加载上次测试结果。"); } - - if (!string.IsNullOrEmpty(textBoxSubsUrls.Text)) + if (!string.IsNullOrWhiteSpace(textBoxSubsUrls.Text)) { - subUrls.AddRange(textBoxSubsUrls.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList()); - // 处理URLs + var lines = textBoxSubsUrls.Text + .Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) + .Select(s => s.Trim()) + .Where(s => !string.IsNullOrEmpty(s)); + + foreach (var line in lines) + { + string key = line.Split('#')[0]; + if (seen.Add(key)) + { + subUrls.Add(line); + } + } + for (int i = 0; i < subUrls.Count; i++) { - if (subUrls[i].StartsWith(githubRawPrefix) && !string.IsNullOrEmpty(githubProxyURL)) + var url = subUrls[i]; + if (url.StartsWith(githubRawPrefix, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(githubProxyURL)) { - // 替换为代理 URL 格式 - //subUrls[i] = githubProxyURL + githubRawPrefix + subUrls[i].Substring(githubRawPrefix.Length); - // 使用subs-check内置github-proxy参数 - subUrls[i] = githubRawPrefix + subUrls[i].Substring(githubRawPrefix.Length); + subUrls[i] = githubRawPrefix + url.Substring(githubRawPrefix.Length); } } } @@ -941,7 +957,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 } } - private void button2_Click(object sender, EventArgs e) + private void buttonAdvanceSettings_Click(object sender, EventArgs e) { if (!_originalLocationSaved) { @@ -993,11 +1009,13 @@ private void button2_Click(object sender, EventArgs e) 判断保存类型(); } - private async void button1_Click(object sender, EventArgs e) + private async void buttonStartCheck_Click(object sender, EventArgs e) { buttonStartCheck.Enabled = false; if (buttonStartCheck.Text == "▶️ 启动") { + toolTip1.SetToolTip(buttonStartCheck, "启动检测流程!"); + buttonStartCheck.ForeColor = Color.Black; if (checkBoxEnableWebUI.Checked && textBoxWebUiAPIKey.Text == "请输入密钥") { MessageBox.Show("您已启用WebUI,请设置WebUI API密钥!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -1035,7 +1053,9 @@ private async void button1_Click(object sender, EventArgs e) groupBoxR2.Enabled = false; groupBoxWebdav.Enabled = false; if (checkBoxEnableWebUI.Checked) buttonWebUi.Enabled = true; - buttonStartCheck.Text = "⏹️ 停止"; + buttonStartCheck.Text = "⌛检测代理"; + toolTip1.SetToolTip(buttonStartCheck, "正在检测可用github代理"); + //timer3.Enabled = true; // 清空 richTextBox1 richTextBoxAllLog.Clear(); @@ -1054,6 +1074,9 @@ private async void button1_Click(object sender, EventArgs e) notifyIcon1.Text = "SubsCheck: 已就绪"; // 启动 subs-check.exe 程序 + buttonStartCheck.ForeColor = Color.Red; + buttonStartCheck.Text = "⏹️ 停止"; + toolTip1.SetToolTip(buttonStartCheck, "停止内核检测进程!"); StartSubsCheckProcess(); } } @@ -1095,6 +1118,8 @@ private async void button1_Click(object sender, EventArgs e) groupBoxWebdav.Enabled = true; buttonWebUi.Enabled = false; buttonStartCheck.Text = "▶️ 启动"; + buttonStartCheck.ForeColor = Color.Black; + toolTip1.SetToolTip(buttonStartCheck, "启动检测流程!"); //timer3.Enabled = false; // 更新菜单项的启用状态 startMenuItem.Enabled = true; @@ -1605,6 +1630,7 @@ private async void StartSubsCheckProcess() { Log($"启动 subs-check.exe 时出错: {ex.Message}", true); buttonStartCheck.Text = "▶️ 启动"; + buttonStartCheck.ForeColor = Color.Black; } } @@ -1826,6 +1852,7 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) { Log("subs-check.exe 已退出"); buttonStartCheck.Text = "▶️ 启动"; + buttonStartCheck.ForeColor = Color.Black; // 更新菜单项的启用状态 startMenuItem.Enabled = true; @@ -1996,7 +2023,7 @@ private string GetLocalLANIP() } } - private void button3_Click(object sender, EventArgs e) + private void buttonCopySubscriptionUrl_Click(object sender, EventArgs e) { string 本地IP = GetLocalLANIP(); try @@ -2018,7 +2045,7 @@ private void button3_Click(object sender, EventArgs e) } } - private void timer2_Tick(object sender, EventArgs e) + private void timerCopySubscriptionUrl_Tick(object sender, EventArgs e) { buttonCopySubscriptionUrl.Text = "复制订阅"; } @@ -2037,7 +2064,7 @@ private void comboBox2_Leave(object sender, EventArgs e) comboBoxSpeedtestUrl.Items.Add(input); comboBoxSpeedtestUrl.Text = input; } - private void comboBox3_Leave(object sender, EventArgs e) + private void comboBoxGithubProxyUrl_Leave(object sender, EventArgs e) { // 检查是否有内容 if (string.IsNullOrWhiteSpace(comboBoxGithubProxyUrl.Text)) @@ -2114,10 +2141,10 @@ private void 判断保存类型() } } - private void comboBox1_TextChanged(object sender, EventArgs e) + private void comboBoxSaveMethod_TextChanged(object sender, EventArgs e) { 判断保存类型(); - if (!(comboBoxSaveMethod.Text == "本地" || comboBoxSaveMethod.Text == "") && buttonAdvanceSettings.Text == "高级设置∨") button2_Click(sender, e); + if (!(comboBoxSaveMethod.Text == "本地" || comboBoxSaveMethod.Text == "") && buttonAdvanceSettings.Text == "高级设置∨") buttonAdvanceSettings_Click(sender, e); } private void textBox3_Enter(object sender, EventArgs e) @@ -2134,7 +2161,7 @@ private void textBox3_Leave(object sender, EventArgs e) textBox8.PasswordChar = '*'; } - private void textBox10_Enter(object sender, EventArgs e) + private void textBoxWebUiAPIKey_Enter(object sender, EventArgs e) { textBoxWebUiAPIKey.PasswordChar = '\0'; if (textBoxWebUiAPIKey.Text == "请输入密钥") @@ -2144,7 +2171,7 @@ private void textBox10_Enter(object sender, EventArgs e) } } - private void textBox10_Leave(object sender, EventArgs e) + private void textBoxWebUiAPIKey_Leave(object sender, EventArgs e) { if (textBoxWebUiAPIKey.Text == "") @@ -2323,7 +2350,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) return detectedProxyURL; } - private async void button5_Click(object sender, EventArgs e) + private async void buttonUpdateKernel_Click(object sender, EventArgs e) { try { @@ -2408,7 +2435,7 @@ private async void button5_Click(object sender, EventArgs e) private decimal 订阅端口; private decimal SubStore端口; - private void numericUpDown6_ValueChanged(object sender, EventArgs e) + private void numericUpDownWebUIPort_ValueChanged(object sender, EventArgs e) { // 检查numericUpDown7是否存在并且与numericUpDown6的值相等 if (numericUpDownWebUIPort.Value == numericUpDownSubStorePort.Value) @@ -2513,7 +2540,7 @@ await Task.Run(() => } } - private async void textBox1_DoubleClick(object sender, EventArgs e) + private async void textBoxSubsUrls_DoubleClick(object sender, EventArgs e) { if (textBoxSubsUrls.Enabled) { @@ -2553,20 +2580,21 @@ private async void textBox1_DoubleClick(object sender, EventArgs e) } - private void checkBox1_CheckedChanged(object sender, EventArgs e) + private void checkBoxEnableRenameNode_CheckedChanged(object sender, EventArgs e) { if (checkBoxEnableRenameNode.Checked == false) checkBoxEnableMediaCheck.Checked = false; } - private void checkBox2_CheckedChanged(object sender, EventArgs e) + private void checkBoxEnableMediaCheck_CheckedChanged(object sender, EventArgs e) { if (checkBoxEnableMediaCheck.Checked == true) checkBoxEnableRenameNode.Checked = true; } - private async void timer3_Tick(object sender, EventArgs e) + private async void timerRestartSchedule_Tick(object sender, EventArgs e) { if (buttonStartCheck.Text == "⏹️ 停止") { + buttonStartCheck.ForeColor = Color.Red; Log("subs-check.exe 运行时满24小时,自动重启清理内存占用。"); // 停止 subs-check.exe 程序 StopSubsCheckProcess(); @@ -2590,10 +2618,11 @@ private async void timer3_Tick(object sender, EventArgs e) groupBoxR2.Enabled = false; groupBoxWebdav.Enabled = false; buttonStartCheck.Text = "⏹️ 停止"; + buttonStartCheck.ForeColor = Color.Red; } } - private void button4_Click(object sender, EventArgs e) + private void buttonCheckUpdate_Click(object sender, EventArgs e) { // 创建 CheckUpdates 窗口实例 CheckUpdates checkUpdatesForm = new CheckUpdates(); @@ -2617,7 +2646,7 @@ private void button4_Click(object sender, EventArgs e) if (checkUpdatesForm.DialogResult == DialogResult.OK) { // 如果返回OK结果,表示按钮被点击并需要更新内核 - button5_Click(this, EventArgs.Empty); + buttonUpdateKernel_Click(this, EventArgs.Empty); } }; @@ -2628,13 +2657,13 @@ private void button4_Click(object sender, EventArgs e) checkUpdatesForm.ShowDialog(); } - private void checkBox3_CheckedChanged(object sender, EventArgs e) + private void checkBoxEnableSuccessLimit_CheckedChanged(object sender, EventArgs e) { if (checkBoxEnableSuccessLimit.Checked) numericUpDownSuccessLimit.Enabled = true; else numericUpDownSuccessLimit.Enabled = false; } - private void checkBox6_CheckedChanged(object sender, EventArgs e) + private void checkBoxTotalBandwidthLimit_CheckedChanged(object sender, EventArgs e) { if (checkBoxTotalBandwidthLimit.Checked) numericUpDownTotalBandwidthLimit.Enabled = true; else @@ -2644,7 +2673,7 @@ private void checkBox6_CheckedChanged(object sender, EventArgs e) } } - private async void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + private async void comboBoxOverwriteUrls_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxOverwriteUrls.Text.Contains("[内置]")) await ProcessComboBox5Selection(true); } @@ -2765,7 +2794,7 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) } } - private void numericUpDown1_ValueChanged(object sender, EventArgs e) + private void numericUpDownConcurrent_ValueChanged(object sender, EventArgs e) { if (checkBoxHighConcurrent.Checked) { @@ -2791,13 +2820,13 @@ private void numericUpDown1_ValueChanged(object sender, EventArgs e) } } - private void checkBox4_CheckedChanged(object sender, EventArgs e) + private void checkBoxEnableWebUI_CheckedChanged(object sender, EventArgs e) { if (checkBoxEnableWebUI.Checked) textBoxWebUiAPIKey.Enabled = true; else textBoxWebUiAPIKey.Enabled = false; } - private void button6_Click(object sender, EventArgs e) + private void buttonWebUi_Click(object sender, EventArgs e) { string 本地IP = GetLocalLANIP(); try @@ -2913,7 +2942,7 @@ private async Task GetApiStatusAsync() return resultArray; } - private async void timer4_Tick(object sender, EventArgs e) + private async void timerRefresh_Tick(object sender, EventArgs e) { //if (!button7.Enabled) button7.Enabled = true; string[] subscheck状态 = await GetApiStatusAsync(); @@ -2927,7 +2956,8 @@ private async void timer4_Tick(object sender, EventArgs e) if (状态类型 == "checking") { - buttonTriggerCheck.Text = buttonTriggerCheck.Text == "⏸️ 暂停" ? buttonTriggerCheck.Text : "⏸️ 暂停"; + buttonTriggerCheck.Text = buttonTriggerCheck.Text == "⌛获取订阅" ? buttonTriggerCheck.Text : "⌛获取订阅"; + labelLogNodeInfo.ForeColor = Color.Black; nodeInfo = $"({进度百分比}/{节点总数}) 可用: {可用节点数量}"; int.TryParse(节点总数, out int nodeTotal); @@ -2942,6 +2972,9 @@ private async void timer4_Tick(object sender, EventArgs e) progressBarAll.Value = 进度条百分比; if (!buttonTriggerCheck.Enabled) buttonTriggerCheck.Enabled = true; + buttonTriggerCheck.Text = "⏸️结束检测"; + buttonTriggerCheck.ForeColor = HexToRgbColor("#6633f4"); + labelLogNodeInfo.ForeColor = Color.Black; } // 仅在文本变化时更新 NotifyIcon,避免频繁重绘 @@ -2957,7 +2990,10 @@ private async void timer4_Tick(object sender, EventArgs e) } else if (状态类型 == "idle") { - if (buttonTriggerCheck.Text != "⏯️ 开始") buttonTriggerCheck.Text = "⏯️ 开始"; + if (buttonTriggerCheck.Text != "⏯️开始检测") buttonTriggerCheck.Text = "⏯️开始检测"; + buttonTriggerCheck.ForeColor = HexToRgbColor("#35bc00"); + labelLogNodeInfo.Text = "空闲"; + labelLogNodeInfo.ForeColor = Color.Green; progressBarAll.Value = 100; @@ -2975,6 +3011,8 @@ private async void timer4_Tick(object sender, EventArgs e) { if (buttonTriggerCheck.Text != "🔀 未知") buttonTriggerCheck.Text = "🔀 未知"; nodeInfo = 状态文本; + labelLogNodeInfo.Text = "实时日志"; + labelLogNodeInfo.ForeColor = Color.Black; } // 仅在标题文字确实变化时更新,避免父容器反复重绘引起的闪烁 @@ -2986,7 +3024,7 @@ private async void timer4_Tick(object sender, EventArgs e) } } - private async void button7_Click(object sender, EventArgs e) + private async void buttonTriggerCheck_Click(object sender, EventArgs e) { buttonTriggerCheck.Enabled = false; timerRefresh.Enabled = false; @@ -2995,22 +3033,30 @@ private async void button7_Click(object sender, EventArgs e) { bool isSuccess; - if (buttonTriggerCheck.Text == "⏯️ 开始") + if (buttonTriggerCheck.Text == "⏯️开始检测") { - isSuccess = await SendApiRequestAsync("/api/trigger-check", "节点检查"); + buttonTriggerCheck.ForeColor = HexToRgbColor("#00BFFF"); + labelLogNodeInfo.Text = "空闲"; + labelLogNodeInfo.ForeColor = Color.Green; + isSuccess = await SendApiRequestAsync("/api/trigger-check", "发送手动检查信号"); if (isSuccess) { - buttonTriggerCheck.Text = "⏸️ 暂停"; + buttonTriggerCheck.Text = "⏸️结束检测"; + buttonTriggerCheck.Enabled = false; + labelLogNodeInfo.ForeColor = Color.Black; textBoxSubsUrls.Enabled = false; // 检查开始后禁用订阅编辑 } } - else // "⏸️ 暂停" + else // "⏸️结束检测" { - isSuccess = await SendApiRequestAsync("/api/force-close", "强制关闭"); + labelLogNodeInfo.ForeColor = Color.Black; + isSuccess = await SendApiRequestAsync("/api/force-close", "发送提前结束检测信号"); } // 如果请求失败,更新按钮状态为未知 if (!isSuccess) buttonTriggerCheck.Text = "🔀 未知"; + buttonTriggerCheck.ForeColor = Color.Gray; + labelLogNodeInfo.ForeColor = Color.Black; } finally { @@ -3398,7 +3444,7 @@ async Task DownloadFileAsync(HttpClient httpClient, string url, string fil } private static about aboutWindow = null; - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + private void linkLabelAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { // 检查窗口是否已经打开 if (aboutWindow != null && !aboutWindow.IsDisposed) @@ -3429,7 +3475,7 @@ private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs })); } - private void button8_Click(object sender, EventArgs e) + private void buttonMoreSettings_Click(object sender, EventArgs e) { try { @@ -3454,7 +3500,7 @@ private void button8_Click(object sender, EventArgs e) } } - private async void checkBox5_CheckedChanged(object sender, EventArgs e) + private async void checkBoxStartup_CheckedChanged(object sender, EventArgs e) { checkBoxStartup.Enabled = false; try @@ -3498,9 +3544,9 @@ private async void checkBox5_CheckedChanged(object sender, EventArgs e) MessageBox.Show($"设置开机启动项失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); // 恢复CheckBox状态,避免UI状态与实际状态不一致 - checkBoxStartup.CheckedChanged -= checkBox5_CheckedChanged; + checkBoxStartup.CheckedChanged -= checkBoxStartup_CheckedChanged; checkBoxStartup.Checked = !checkBoxStartup.Checked; - checkBoxStartup.CheckedChanged += checkBox5_CheckedChanged; + checkBoxStartup.CheckedChanged += checkBoxStartup_CheckedChanged; } checkBoxStartup.Enabled = true; await SaveConfig(false); @@ -3559,7 +3605,7 @@ private bool CheckCommandLineParameter(string parameterName) return false; } - private void richTextBox1_DoubleClick(object sender, EventArgs e) + private void richTextBoxAllLog_DoubleClick(object sender, EventArgs e) { // 检查是否有日志内容 if (richTextBoxAllLog.TextLength > 0) @@ -3582,7 +3628,7 @@ private void richTextBox1_DoubleClick(object sender, EventArgs e) } } - private void numericUpDown4_ValueChanged(object sender, EventArgs e) + private void numericUpDownMinSpeed_ValueChanged(object sender, EventArgs e) { if (numericUpDownMinSpeed.Value > 4096) { @@ -3600,7 +3646,7 @@ private void numericUpDown4_ValueChanged(object sender, EventArgs e) } } - private void numericUpDown3_ValueChanged(object sender, EventArgs e) + private void numericUpDownTimeout_ValueChanged(object sender, EventArgs e) { if (numericUpDownTimeout.Value < 5000) { @@ -3666,8 +3712,9 @@ private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) { groupBoxPipeConcurrent.Location = _pipeOriginalLocation; groupBoxEnhance.Location = _enhanceOriginalLocation; - groupBoxGist.Location = new Point(groupBoxGist.Location.X, groupBoxGist.Location.Y + groupBoxPipeConcurrent.Height); - groupBoxR2.Location = groupBoxGist.Location; groupBoxWebdav.Location = groupBoxGist.Location; + groupBoxGist.Location = new Point(groupBoxGist.Location.X, _pipeOriginalLocation.Y + groupBoxPipeConcurrent.Height); + groupBoxR2.Location = groupBoxGist.Location; + groupBoxWebdav.Location = groupBoxGist.Location; } else { @@ -3694,6 +3741,10 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg Log(EnableHighConcurrent ? "切换为 高并发 内核,可单独设置测活-测速-媒体检测各阶段并发数,大幅提高性能" : "切换为 原版 内核"); await DownloadSubsCheckEXE();// 若要后台并行改为 _ = DownloadSubsCheckEXE(); currentKernel = want; + if (!EnableHighConcurrent) + { + numericUpDownPipeAlive.Value = 0; numericUpDownPipeSpeed.Value = 0; numericUpDownPipeMedia.Value = 0; + } checkBoxSwitchArch64.Enabled = true; checkBoxHighConcurrent.Enabled = true; buttonCheckUpdate.Enabled = true; @@ -3887,5 +3938,19 @@ private void NumericUpDownTotalBandwidthLimit_ValueChanged(object sender, EventA toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, $"总下载速度限制(MB/s):\n建议设置为 <=带宽/8, \n比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20。\n\n当前设置下载速度对应带宽 {calcBandWidth}"); } } + public static Color HexToRgbColor(String hexColour) + { + Color colour = new Color(); + try + { + colour = ColorTranslator.FromHtml(hexColour); + } + catch (System.Exception) + { + return Color.Empty; + } + return colour; + } + } } \ No newline at end of file From ba94d2e2a5410b6e9e44ee93d9e233c348757953 Mon Sep 17 00:00:00 2001 From: sinspired Date: Sat, 30 Aug 2025 01:56:08 +0800 Subject: [PATCH 22/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DR2=E5=92=8Cwebda?= =?UTF-8?q?v=E7=9A=84=E9=BB=98=E8=AE=A4=E8=BD=BD=E5=85=A5=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MainGui.cs b/MainGui.cs index b5c43e0..abddb8d 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -9,7 +9,6 @@ using System.IO.Compression; using System.Linq; using System.Net.Http; -using System.Net.Http.Headers; using System.Net.NetworkInformation; using System.Text; using System.Threading.Tasks; @@ -253,6 +252,8 @@ private async void timerinitial_Tick(object sender, EventArgs e)//初始化 if (checkBoxHighConcurrent.Checked) { groupBoxGist.Location = new Point(groupBoxGist.Location.X, groupBoxGist.Location.Y + groupBoxPipeConcurrent.Height); + groupBoxR2.Location = groupBoxGist.Location; + groupBoxWebdav.Location = groupBoxGist.Location; } if (CheckCommandLineParameter("-auto")) From f8012a6c22980fd2358c9e390cdc4546e7e5b5db Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 1 Sep 2025 16:29:30 +0800 Subject: [PATCH 23/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=A3=80=E6=B5=8B=E6=8C=89=E9=92=AE=E5=92=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A0=87=E7=AD=BE=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index abddb8d..6d6d094 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -1046,6 +1046,8 @@ private async void buttonStartCheck_Click(object sender, EventArgs e) // 运行时禁用流水线并发和增强标签相关设置项 groupBoxPipeConcurrent.Enabled = false; groupBoxEnhance.Enabled = false; + checkBoxHighConcurrent.Enabled = false; + checkBoxSwitchArch64.Enabled = false; comboBoxSaveMethod.Enabled = false; textBoxSubsUrls.Enabled = false; @@ -1110,6 +1112,8 @@ private async void buttonStartCheck_Click(object sender, EventArgs e) // 重新启用 groupBoxPipeConcurrent.Enabled = true; groupBoxEnhance.Enabled = true; + checkBoxHighConcurrent.Enabled = true; + checkBoxSwitchArch64.Enabled = true; comboBoxSaveMethod.Enabled = true; textBoxSubsUrls.Enabled = true; @@ -1141,6 +1145,10 @@ public async Task DownloadSubsCheckEXE() string repoOwner = checkBoxHighConcurrent.Checked ? "sinspired" : "beck-8"; string apiUrl = $"https://api.github.com/repos/{repoOwner}/subs-check/releases/latest"; string releasesPageUrl = $"https://github.com/{repoOwner}/subs-check/releases"; + // 决定目标资源名称:64位优先 (amd64),否则 i386 + string desiredArchToken = checkBoxSwitchArch64.Checked ? "x86_64" : "i386"; + string desiredKernel = checkBoxHighConcurrent.Checked ? "高并发内核" : "原版内核"; + string desiredAssetName = $"subs-check_Windows_{desiredArchToken}.zip"; // 首先检查是否有网络连接 if (!IsNetworkAvailable()) @@ -1161,11 +1169,6 @@ public async Task DownloadSubsCheckEXE() return; } - // 决定目标资源名称:64位优先 (amd64),否则 i386 - string desiredArchToken = checkBoxSwitchArch64.Checked ? "x86_64" : "i386"; - string desiredKernel = checkBoxHighConcurrent.Checked ? "高并发内核" : "原版内核"; - string desiredAssetName = $"subs-check_Windows_{desiredArchToken}.zip"; - // 创建不使用系统代理的 HttpClientHandler HttpClientHandler handler = new HttpClientHandler { @@ -1873,6 +1876,8 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) // 重新启用 groupBoxPipeConcurrent.Enabled = true; groupBoxEnhance.Enabled = true; + checkBoxHighConcurrent.Enabled = true; + checkBoxSwitchArch64.Enabled = true; })); } @@ -2993,15 +2998,16 @@ private async void timerRefresh_Tick(object sender, EventArgs e) { if (buttonTriggerCheck.Text != "⏯️开始检测") buttonTriggerCheck.Text = "⏯️开始检测"; buttonTriggerCheck.ForeColor = HexToRgbColor("#35bc00"); - labelLogNodeInfo.Text = "空闲"; - labelLogNodeInfo.ForeColor = Color.Green; + //labelLogNodeInfo.Text = $"{nextCheckTime}"; + //labelLogNodeInfo.ForeColor = Color.Green; progressBarAll.Value = 100; - nodeInfo = $"等待{nextCheckTime}"; + string idleNotify = "SubsCheck: 已就绪\n" + nextCheckTime; if (_lastNotifyText != idleNotify) { + nodeInfo = $"{nextCheckTime}"; _lastNotifyText = idleNotify; notifyIcon1.Text = idleNotify; } @@ -3037,8 +3043,8 @@ private async void buttonTriggerCheck_Click(object sender, EventArgs e) if (buttonTriggerCheck.Text == "⏯️开始检测") { buttonTriggerCheck.ForeColor = HexToRgbColor("#00BFFF"); - labelLogNodeInfo.Text = "空闲"; - labelLogNodeInfo.ForeColor = Color.Green; + //labelLogNodeInfo.Text = $"启动检测"; + labelLogNodeInfo.ForeColor = Color.Black; isSuccess = await SendApiRequestAsync("/api/trigger-check", "发送手动检查信号"); if (isSuccess) { @@ -3714,7 +3720,7 @@ private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) groupBoxPipeConcurrent.Location = _pipeOriginalLocation; groupBoxEnhance.Location = _enhanceOriginalLocation; groupBoxGist.Location = new Point(groupBoxGist.Location.X, _pipeOriginalLocation.Y + groupBoxPipeConcurrent.Height); - groupBoxR2.Location = groupBoxGist.Location; + groupBoxR2.Location = groupBoxGist.Location; groupBoxWebdav.Location = groupBoxGist.Location; } else From 76adce46d6c6e65c27b414e88719f7e8d1255dc1 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 23 Sep 2025 13:59:31 +0800 Subject: [PATCH 24/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dcron=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=A1=86=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 11 +++++++---- MainGui.cs | 2 -- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 8e4d9d2..3e9abe7 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -161,6 +161,7 @@ private void InitializeComponent() // // groupBoxComonSettings // + this.groupBoxComonSettings.Controls.Add(this.textBoxCron); this.groupBoxComonSettings.Controls.Add(this.labelConcurrent); this.groupBoxComonSettings.Controls.Add(this.numericUpDownConcurrent); this.groupBoxComonSettings.Controls.Add(this.labelInterval); @@ -178,7 +179,6 @@ private void InitializeComponent() this.groupBoxComonSettings.Controls.Add(this.buttonTriggerCheck); this.groupBoxComonSettings.Controls.Add(this.buttonWebUi); this.groupBoxComonSettings.Controls.Add(this.checkBoxStartup); - this.groupBoxComonSettings.Controls.Add(this.textBoxCron); this.groupBoxComonSettings.Controls.Add(this.labelCron); this.groupBoxComonSettings.Controls.Add(this.labelSubUrls); this.groupBoxComonSettings.Controls.Add(this.textBoxSubsUrls); @@ -441,11 +441,14 @@ private void InitializeComponent() // // textBoxCron // + this.textBoxCron.AcceptsReturn = true; + this.textBoxCron.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; + this.textBoxCron.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList; this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxCron.Location = new System.Drawing.Point(79, 562); - this.textBoxCron.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxCron.Location = new System.Drawing.Point(84, 562); + this.textBoxCron.Margin = new System.Windows.Forms.Padding(5); this.textBoxCron.Name = "textBoxCron"; - this.textBoxCron.Size = new System.Drawing.Size(219, 31); + this.textBoxCron.Size = new System.Drawing.Size(214, 31); this.textBoxCron.TabIndex = 21; this.textBoxCron.Text = "0 */2 * * *"; this.textBoxCron.Visible = false; diff --git a/MainGui.cs b/MainGui.cs index 6d6d094..fa04e38 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -789,11 +789,9 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 subUrls.Add(succedProxiesUrl); } Log("已加载上次测试结果。"); - checkBoxKeepSucced.Visible = false; } else { - checkBoxKeepSucced.Visible = true; checkBoxKeepSucced.Checked = true; Log("将于第二次自动运行时加载上次测试结果。"); } From 688ed2df10d83ac1a581d93fb8487dacb4ac0d3d Mon Sep 17 00:00:00 2001 From: sinspired Date: Sun, 28 Sep 2025 18:11:43 +0800 Subject: [PATCH 25/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dlisten-port?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=86=99=E5=85=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 2 +- Resources/download.png | Bin 0 -> 2009 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 Resources/download.png diff --git a/MainGui.cs b/MainGui.cs index fa04e38..35a9909 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -755,7 +755,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 else { WebUIapiKey = GetComputerNameMD5(); - config["listen-port"] = $@"127.0.0.1:{numericUpDownWebUIPort.Value}"; + config["listen-port"] = $@":{numericUpDownWebUIPort.Value}"; if (textBoxWebUiAPIKey.Text != "请输入密钥") config["old-api-key"] = textBoxWebUiAPIKey.Text; } config["api-key"] = WebUIapiKey; diff --git a/Resources/download.png b/Resources/download.png new file mode 100644 index 0000000000000000000000000000000000000000..6f43f2d81924bc86a59f3ff6e390b7672a7c3e05 GIT binary patch literal 2009 zcmb_aX;c$e6rLoIAcP`{hzklFP+Y(yfMAY_C?HXR7;(W`S!5A0Gn1JKDr6=TjDo^Z zT5w}2r7qwC;(`#=8U!~s!KI4gf_1~=QG{AhBlM*z1&@0AqjTQ8d*8j^ci+AD-A&?v z*`~(BjUfm!75RBffSjTKjaXpMDOEiO!e)h^#22=L_dWfIS+!Kg+h>U zCj<>ev&-jCg&^iz@w^}(06;J$iYsJD5{ywWPDwE`7LG&ZDwI&dIEmmCLXapLWSZ=1R&+)f|Zdl1}I8owHhTzDNdspDV5VGp^y^FRd^yy zkO)Si1SN|j-CRqsxCALdtxJiP;tB*+p>YaSMk8xLghZ)6IJrlmlH$}VDFw?ZI8KFN z3KUbwaFC}O0ZT@qa#DsXV`7!-NF|2RDOO8-e|oFrSI4`uK-W^2>@8V3%q8p{a;1a@6v=% zL_GjJSu7IY*YY3qei1(4!3>~80@!8pK3+nv!vy`!m|$jlQ~lVS{?+w*zo4MVT1-FT zVCp~uVAuDsr>93Qeli|RzmAXuECBL<`3z0D>`{wTi?zQU`6+4)bCmMN+xPb}TzqT( zh-NK#*a5RVU(B_>SY;oWUTb;(Z`KE+PMCmSH`kj z$=Y|$QOw`Z{!+ic9MU(Z_T_+4!L0l>s87I}LGEvZ})YGt@P)PifS zy;xOy@oe?^`U=tZIA>=V9%U9d30V%qmeVOoiHT9W$(ydXZ#V{Q!zA@a8IGs#%gqY$ zm})0@W@hDmq3Zmmv?yl7*)FxGpACQ9uJ1F}z7K!UJZ`^IJY#A6Mzwt-+fNidrrV1Z z+$1=vmbbrRSYLL!kdyw7!+Q7#uNmA>^vlJDUE$(g|IK$x@A5+c0g@?^{B8a=-I; zI_1?6JWER#!HO7B*2(-GG^2!UURHK|{n6z;22A$6>^+rriEcLMK!ie&f0!4sS}?^E81pE&An@%%(pg7v(+KJWXnWMS+v~y>mZ^tK@U+0Q{7p=L1J{FO-=Q}jdr}`FmV}EX<>-qCduvu6UEDt3 zG_7oSYD+ciMiE{^bJJWjD)X7{{&iy0`*#&4mFnAtYsws~uGMMsn|*eamu6=TIR}}% z7~IM4X!)6Arjn2Ev`=k+?{^||1Al4MW6I*BMWuSL%QTH9+S7OF^o}aYOe-gsS2*rT z{x$NLYjAGQ1INs~A18hDy1aCCxZ!Qp$S$jGnd-k}VXY5S+QLDJe%00@q~HxMz>NSp|hqMvaDd?EiMXWMHw7jPhvPk?vP%+SQY E0qb&5bN~PV literal 0 HcmV?d00001 From 68de38d6c787eaae6661cd540191dfeb8a41e6c4 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 29 Sep 2025 03:04:11 +0800 Subject: [PATCH 26/92] =?UTF-8?q?chore(UI):=20=E8=B0=83=E6=95=B4=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=B0=BA=E5=AF=B8=EF=BC=8C=E4=BB=A5=E9=80=82=E9=85=8D?= =?UTF-8?q?=E6=97=A7=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 2 +- MainGui.Designer.cs | 132 +++++++++++++++++----------------- Properties/AssemblyInfo.cs | 4 +- about.Designer.cs | 2 +- 4 files changed, 70 insertions(+), 70 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ab09315..3376c73 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,7 +28,7 @@ jobs: - name: Package artifact run: | - mkdir release + mkdir -p release cp -r bin/Release/*.exe bin/Release/*.dll release/ shell: bash diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 3e9abe7..c0af55e 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -33,6 +33,7 @@ private void InitializeComponent() this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.timerinitial = new System.Windows.Forms.Timer(this.components); this.groupBoxComonSettings = new System.Windows.Forms.GroupBox(); + this.textBoxCron = new System.Windows.Forms.TextBox(); this.labelConcurrent = new System.Windows.Forms.Label(); this.numericUpDownConcurrent = new System.Windows.Forms.NumericUpDown(); this.labelInterval = new System.Windows.Forms.Label(); @@ -50,7 +51,6 @@ private void InitializeComponent() this.buttonTriggerCheck = new System.Windows.Forms.Button(); this.buttonWebUi = new System.Windows.Forms.Button(); this.checkBoxStartup = new System.Windows.Forms.CheckBox(); - this.textBoxCron = new System.Windows.Forms.TextBox(); this.labelCron = new System.Windows.Forms.Label(); this.labelSubUrls = new System.Windows.Forms.Label(); this.textBoxSubsUrls = new System.Windows.Forms.TextBox(); @@ -161,19 +161,19 @@ private void InitializeComponent() // // groupBoxComonSettings // + this.groupBoxComonSettings.Controls.Add(this.numericUpDownMinSpeed); + this.groupBoxComonSettings.Controls.Add(this.numericUpDownTimeout); + this.groupBoxComonSettings.Controls.Add(this.numericUpDownInterval); + this.groupBoxComonSettings.Controls.Add(this.numericUpDownConcurrent); + this.groupBoxComonSettings.Controls.Add(this.comboBoxSaveMethod); + this.groupBoxComonSettings.Controls.Add(this.checkBoxSwitchArch64); this.groupBoxComonSettings.Controls.Add(this.textBoxCron); this.groupBoxComonSettings.Controls.Add(this.labelConcurrent); - this.groupBoxComonSettings.Controls.Add(this.numericUpDownConcurrent); this.groupBoxComonSettings.Controls.Add(this.labelInterval); - this.groupBoxComonSettings.Controls.Add(this.numericUpDownInterval); this.groupBoxComonSettings.Controls.Add(this.labelTimeout); - this.groupBoxComonSettings.Controls.Add(this.numericUpDownTimeout); this.groupBoxComonSettings.Controls.Add(this.labelMinSpped); - this.groupBoxComonSettings.Controls.Add(this.numericUpDownMinSpeed); this.groupBoxComonSettings.Controls.Add(this.labelSaveMethod); - this.groupBoxComonSettings.Controls.Add(this.comboBoxSaveMethod); this.groupBoxComonSettings.Controls.Add(this.checkBoxHighConcurrent); - this.groupBoxComonSettings.Controls.Add(this.checkBoxSwitchArch64); this.groupBoxComonSettings.Controls.Add(this.comboBoxSubscriptionType); this.groupBoxComonSettings.Controls.Add(this.buttonCopySubscriptionUrl); this.groupBoxComonSettings.Controls.Add(this.buttonTriggerCheck); @@ -184,19 +184,35 @@ private void InitializeComponent() this.groupBoxComonSettings.Controls.Add(this.textBoxSubsUrls); this.groupBoxComonSettings.Controls.Add(this.buttonStartCheck); this.groupBoxComonSettings.Controls.Add(this.buttonAdvanceSettings); - this.groupBoxComonSettings.Location = new System.Drawing.Point(24, 23); + this.groupBoxComonSettings.Location = new System.Drawing.Point(26, 14); this.groupBoxComonSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxComonSettings.Name = "groupBoxComonSettings"; this.groupBoxComonSettings.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBoxComonSettings.Size = new System.Drawing.Size(319, 847); + this.groupBoxComonSettings.Size = new System.Drawing.Size(319, 768); this.groupBoxComonSettings.TabIndex = 0; this.groupBoxComonSettings.TabStop = false; this.groupBoxComonSettings.Text = "参数设置"; // + // textBoxCron + // + this.textBoxCron.AcceptsReturn = true; + this.textBoxCron.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; + this.textBoxCron.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList; + this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxCron.Location = new System.Drawing.Point(85, 496); + this.textBoxCron.Margin = new System.Windows.Forms.Padding(5); + this.textBoxCron.Name = "textBoxCron"; + this.textBoxCron.Size = new System.Drawing.Size(214, 31); + this.textBoxCron.TabIndex = 21; + this.textBoxCron.Text = "0 */2 * * *"; + this.textBoxCron.Visible = false; + this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); + // // labelConcurrent // this.labelConcurrent.AutoSize = true; - this.labelConcurrent.Location = new System.Drawing.Point(13, 37); + this.labelConcurrent.Location = new System.Drawing.Point(13, 38); this.labelConcurrent.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelConcurrent.Name = "labelConcurrent"; this.labelConcurrent.Size = new System.Drawing.Size(136, 21); @@ -230,7 +246,7 @@ private void InitializeComponent() // labelInterval // this.labelInterval.AutoSize = true; - this.labelInterval.Location = new System.Drawing.Point(13, 88); + this.labelInterval.Location = new System.Drawing.Point(13, 87); this.labelInterval.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelInterval.Name = "labelInterval"; this.labelInterval.Size = new System.Drawing.Size(179, 21); @@ -240,7 +256,7 @@ private void InitializeComponent() // // numericUpDownInterval // - this.numericUpDownInterval.Location = new System.Drawing.Point(192, 84); + this.numericUpDownInterval.Location = new System.Drawing.Point(192, 82); this.numericUpDownInterval.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownInterval.Maximum = new decimal(new int[] { 1440, @@ -265,7 +281,7 @@ private void InitializeComponent() // labelTimeout // this.labelTimeout.AutoSize = true; - this.labelTimeout.Location = new System.Drawing.Point(13, 138); + this.labelTimeout.Location = new System.Drawing.Point(13, 136); this.labelTimeout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelTimeout.Name = "labelTimeout"; this.labelTimeout.Size = new System.Drawing.Size(179, 21); @@ -274,7 +290,7 @@ private void InitializeComponent() // // numericUpDownTimeout // - this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 135); + this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 131); this.numericUpDownTimeout.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownTimeout.Maximum = new decimal(new int[] { 10000, @@ -299,7 +315,7 @@ private void InitializeComponent() // labelMinSpped // this.labelMinSpped.AutoSize = true; - this.labelMinSpped.Location = new System.Drawing.Point(13, 189); + this.labelMinSpped.Location = new System.Drawing.Point(13, 185); this.labelMinSpped.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelMinSpped.Name = "labelMinSpped"; this.labelMinSpped.Size = new System.Drawing.Size(181, 21); @@ -308,7 +324,7 @@ private void InitializeComponent() // // numericUpDownMinSpeed // - this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 186); + this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 180); this.numericUpDownMinSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownMinSpeed.Maximum = new decimal(new int[] { 20480, @@ -333,7 +349,7 @@ private void InitializeComponent() // labelSaveMethod // this.labelSaveMethod.AutoSize = true; - this.labelSaveMethod.Location = new System.Drawing.Point(13, 240); + this.labelSaveMethod.Location = new System.Drawing.Point(13, 234); this.labelSaveMethod.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelSaveMethod.Name = "labelSaveMethod"; this.labelSaveMethod.Size = new System.Drawing.Size(115, 21); @@ -349,17 +365,17 @@ private void InitializeComponent() "gist", "r2", "webdav"}); - this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 236); + this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 230); this.comboBoxSaveMethod.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; - this.comboBoxSaveMethod.Size = new System.Drawing.Size(103, 29); + this.comboBoxSaveMethod.Size = new System.Drawing.Size(106, 29); this.comboBoxSaveMethod.TabIndex = 16; this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBoxSaveMethod_TextChanged); // // checkBoxHighConcurrent // this.checkBoxHighConcurrent.AutoSize = true; - this.checkBoxHighConcurrent.Location = new System.Drawing.Point(18, 608); + this.checkBoxHighConcurrent.Location = new System.Drawing.Point(18, 539); this.checkBoxHighConcurrent.Name = "checkBoxHighConcurrent"; this.checkBoxHighConcurrent.Size = new System.Drawing.Size(141, 25); this.checkBoxHighConcurrent.TabIndex = 39; @@ -370,7 +386,7 @@ private void InitializeComponent() // checkBoxSwitchArch64 // this.checkBoxSwitchArch64.AutoSize = true; - this.checkBoxSwitchArch64.Location = new System.Drawing.Point(167, 608); + this.checkBoxSwitchArch64.Location = new System.Drawing.Point(167, 539); this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; this.checkBoxSwitchArch64.Size = new System.Drawing.Size(111, 25); this.checkBoxSwitchArch64.TabIndex = 38; @@ -385,7 +401,7 @@ private void InitializeComponent() this.comboBoxSubscriptionType.Items.AddRange(new object[] { "通用订阅", "Clash"}); - this.comboBoxSubscriptionType.Location = new System.Drawing.Point(15, 651); + this.comboBoxSubscriptionType.Location = new System.Drawing.Point(15, 578); this.comboBoxSubscriptionType.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBoxSubscriptionType.Name = "comboBoxSubscriptionType"; this.comboBoxSubscriptionType.Size = new System.Drawing.Size(132, 29); @@ -394,7 +410,7 @@ private void InitializeComponent() // buttonCopySubscriptionUrl // this.buttonCopySubscriptionUrl.Enabled = false; - this.buttonCopySubscriptionUrl.Location = new System.Drawing.Point(161, 648); + this.buttonCopySubscriptionUrl.Location = new System.Drawing.Point(161, 575); this.buttonCopySubscriptionUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonCopySubscriptionUrl.Name = "buttonCopySubscriptionUrl"; this.buttonCopySubscriptionUrl.Size = new System.Drawing.Size(138, 40); @@ -406,7 +422,7 @@ private void InitializeComponent() // buttonTriggerCheck // this.buttonTriggerCheck.Enabled = false; - this.buttonTriggerCheck.Location = new System.Drawing.Point(13, 698); + this.buttonTriggerCheck.Location = new System.Drawing.Point(13, 625); this.buttonTriggerCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonTriggerCheck.Name = "buttonTriggerCheck"; this.buttonTriggerCheck.Size = new System.Drawing.Size(138, 40); @@ -418,7 +434,7 @@ private void InitializeComponent() // buttonWebUi // this.buttonWebUi.Enabled = false; - this.buttonWebUi.Location = new System.Drawing.Point(161, 698); + this.buttonWebUi.Location = new System.Drawing.Point(161, 625); this.buttonWebUi.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonWebUi.Name = "buttonWebUi"; this.buttonWebUi.Size = new System.Drawing.Size(138, 40); @@ -430,7 +446,7 @@ private void InitializeComponent() // checkBoxStartup // this.checkBoxStartup.AutoSize = true; - this.checkBoxStartup.Location = new System.Drawing.Point(167, 749); + this.checkBoxStartup.Location = new System.Drawing.Point(167, 676); this.checkBoxStartup.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBoxStartup.Name = "checkBoxStartup"; this.checkBoxStartup.Size = new System.Drawing.Size(120, 25); @@ -439,26 +455,10 @@ private void InitializeComponent() this.checkBoxStartup.UseVisualStyleBackColor = true; this.checkBoxStartup.CheckedChanged += new System.EventHandler(this.checkBoxStartup_CheckedChanged); // - // textBoxCron - // - this.textBoxCron.AcceptsReturn = true; - this.textBoxCron.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.textBoxCron.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList; - this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxCron.Location = new System.Drawing.Point(84, 562); - this.textBoxCron.Margin = new System.Windows.Forms.Padding(5); - this.textBoxCron.Name = "textBoxCron"; - this.textBoxCron.Size = new System.Drawing.Size(214, 31); - this.textBoxCron.TabIndex = 21; - this.textBoxCron.Text = "0 */2 * * *"; - this.textBoxCron.Visible = false; - this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); - this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); - // // labelCron // this.labelCron.AutoSize = true; - this.labelCron.Location = new System.Drawing.Point(13, 567); + this.labelCron.Location = new System.Drawing.Point(13, 501); this.labelCron.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelCron.Name = "labelCron"; this.labelCron.Size = new System.Drawing.Size(73, 21); @@ -470,7 +470,7 @@ private void InitializeComponent() // labelSubUrls // this.labelSubUrls.AutoSize = true; - this.labelSubUrls.Location = new System.Drawing.Point(13, 287); + this.labelSubUrls.Location = new System.Drawing.Point(13, 278); this.labelSubUrls.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelSubUrls.Name = "labelSubUrls"; this.labelSubUrls.Size = new System.Drawing.Size(284, 21); @@ -481,12 +481,12 @@ private void InitializeComponent() // textBoxSubsUrls // this.textBoxSubsUrls.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxSubsUrls.Location = new System.Drawing.Point(16, 313); + this.textBoxSubsUrls.Location = new System.Drawing.Point(17, 304); this.textBoxSubsUrls.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBoxSubsUrls.Multiline = true; this.textBoxSubsUrls.Name = "textBoxSubsUrls"; this.textBoxSubsUrls.ReadOnly = true; - this.textBoxSubsUrls.Size = new System.Drawing.Size(281, 280); + this.textBoxSubsUrls.Size = new System.Drawing.Size(281, 223); this.textBoxSubsUrls.TabIndex = 17; this.textBoxSubsUrls.Text = resources.GetString("textBoxSubsUrls.Text"); this.textBoxSubsUrls.WordWrap = false; @@ -496,7 +496,7 @@ private void InitializeComponent() // buttonStartCheck // this.buttonStartCheck.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.buttonStartCheck.Location = new System.Drawing.Point(13, 749); + this.buttonStartCheck.Location = new System.Drawing.Point(13, 676); this.buttonStartCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonStartCheck.Name = "buttonStartCheck"; this.buttonStartCheck.Size = new System.Drawing.Size(138, 79); @@ -507,7 +507,7 @@ private void InitializeComponent() // // buttonAdvanceSettings // - this.buttonAdvanceSettings.Location = new System.Drawing.Point(161, 788); + this.buttonAdvanceSettings.Location = new System.Drawing.Point(161, 715); this.buttonAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonAdvanceSettings.Name = "buttonAdvanceSettings"; this.buttonAdvanceSettings.Size = new System.Drawing.Size(138, 40); @@ -624,18 +624,18 @@ private void InitializeComponent() this.groupBoxLog.Controls.Add(this.buttonUpdateKernel); this.groupBoxLog.Controls.Add(this.richTextBoxAllLog); this.groupBoxLog.Controls.Add(this.labelLogNodeInfo); - this.groupBoxLog.Location = new System.Drawing.Point(354, 23); + this.groupBoxLog.Location = new System.Drawing.Point(354, 14); this.groupBoxLog.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxLog.Name = "groupBoxLog"; this.groupBoxLog.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBoxLog.Size = new System.Drawing.Size(1100, 847); + this.groupBoxLog.Size = new System.Drawing.Size(1100, 768); this.groupBoxLog.TabIndex = 1; this.groupBoxLog.TabStop = false; // // linkLabelAbout // this.linkLabelAbout.AutoSize = true; - this.linkLabelAbout.Location = new System.Drawing.Point(843, 4); + this.linkLabelAbout.Location = new System.Drawing.Point(850, 0); this.linkLabelAbout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.linkLabelAbout.Name = "linkLabelAbout"; this.linkLabelAbout.Size = new System.Drawing.Size(250, 21); @@ -666,7 +666,7 @@ private void InitializeComponent() this.richTextBoxAllLog.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.richTextBoxAllLog.Name = "richTextBoxAllLog"; this.richTextBoxAllLog.ReadOnly = true; - this.richTextBoxAllLog.Size = new System.Drawing.Size(1088, 813); + this.richTextBoxAllLog.Size = new System.Drawing.Size(1088, 734); this.richTextBoxAllLog.TabIndex = 0; this.richTextBoxAllLog.Text = ""; this.richTextBoxAllLog.DoubleClick += new System.EventHandler(this.richTextBoxAllLog_DoubleClick); @@ -707,7 +707,7 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadTimeout); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSubStorePort); this.groupBoxAdvanceSettings.Controls.Add(this.labelSubstorePort); - this.groupBoxAdvanceSettings.Location = new System.Drawing.Point(24, 880); + this.groupBoxAdvanceSettings.Location = new System.Drawing.Point(26, 792); this.groupBoxAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxAdvanceSettings.Name = "groupBoxAdvanceSettings"; this.groupBoxAdvanceSettings.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); @@ -1441,11 +1441,11 @@ private void InitializeComponent() this.groupBoxGist.Controls.Add(this.label12); this.groupBoxGist.Controls.Add(this.textBox2); this.groupBoxGist.Controls.Add(this.label11); - this.groupBoxGist.Location = new System.Drawing.Point(24, 1211); + this.groupBoxGist.Location = new System.Drawing.Point(26, 1103); this.groupBoxGist.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxGist.Name = "groupBoxGist"; this.groupBoxGist.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBoxGist.Size = new System.Drawing.Size(1430, 89); + this.groupBoxGist.Size = new System.Drawing.Size(1430, 79); this.groupBoxGist.TabIndex = 4; this.groupBoxGist.TabStop = false; this.groupBoxGist.Text = "Gist 上传参数"; @@ -1521,11 +1521,11 @@ private void InitializeComponent() this.groupBoxR2.Controls.Add(this.label15); this.groupBoxR2.Controls.Add(this.textBox7); this.groupBoxR2.Controls.Add(this.label16); - this.groupBoxR2.Location = new System.Drawing.Point(24, 1314); + this.groupBoxR2.Location = new System.Drawing.Point(26, 1192); this.groupBoxR2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxR2.Name = "groupBoxR2"; this.groupBoxR2.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBoxR2.Size = new System.Drawing.Size(1430, 89); + this.groupBoxR2.Size = new System.Drawing.Size(1430, 79); this.groupBoxR2.TabIndex = 6; this.groupBoxR2.TabStop = false; this.groupBoxR2.Text = "R2 上传参数"; @@ -1581,11 +1581,11 @@ private void InitializeComponent() this.groupBoxWebdav.Controls.Add(this.label17); this.groupBoxWebdav.Controls.Add(this.textBox9); this.groupBoxWebdav.Controls.Add(this.label18); - this.groupBoxWebdav.Location = new System.Drawing.Point(24, 1417); + this.groupBoxWebdav.Location = new System.Drawing.Point(26, 1281); this.groupBoxWebdav.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxWebdav.Name = "groupBoxWebdav"; this.groupBoxWebdav.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.groupBoxWebdav.Size = new System.Drawing.Size(1430, 89); + this.groupBoxWebdav.Size = new System.Drawing.Size(1430, 79); this.groupBoxWebdav.TabIndex = 6; this.groupBoxWebdav.TabStop = false; this.groupBoxWebdav.Text = "Webdav 上传参数"; @@ -1669,9 +1669,9 @@ private void InitializeComponent() this.groupBoxPipeConcurrent.Controls.Add(this.checkBoxPipeAuto); this.groupBoxPipeConcurrent.Controls.Add(this.numericUpDownPipeAlive); this.groupBoxPipeConcurrent.Controls.Add(this.labelPipeAlive); - this.groupBoxPipeConcurrent.Location = new System.Drawing.Point(24, 1108); + this.groupBoxPipeConcurrent.Location = new System.Drawing.Point(26, 1016); this.groupBoxPipeConcurrent.Name = "groupBoxPipeConcurrent"; - this.groupBoxPipeConcurrent.Size = new System.Drawing.Size(967, 89); + this.groupBoxPipeConcurrent.Size = new System.Drawing.Size(967, 79); this.groupBoxPipeConcurrent.TabIndex = 7; this.groupBoxPipeConcurrent.TabStop = false; this.groupBoxPipeConcurrent.Text = "流水线并发 参数"; @@ -1727,11 +1727,11 @@ private void InitializeComponent() // checkBoxPipeAuto // this.checkBoxPipeAuto.AutoSize = true; - this.checkBoxPipeAuto.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.checkBoxPipeAuto.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.checkBoxPipeAuto.Location = new System.Drawing.Point(18, 39); this.checkBoxPipeAuto.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBoxPipeAuto.Name = "checkBoxPipeAuto"; - this.checkBoxPipeAuto.Size = new System.Drawing.Size(102, 25); + this.checkBoxPipeAuto.Size = new System.Drawing.Size(99, 25); this.checkBoxPipeAuto.TabIndex = 38; this.checkBoxPipeAuto.Text = "自适应"; this.checkBoxPipeAuto.UseVisualStyleBackColor = true; @@ -1766,9 +1766,9 @@ private void InitializeComponent() // this.groupBoxEnhance.Controls.Add(this.checkBoxDropBadCFNodes); this.groupBoxEnhance.Controls.Add(this.checkBoxEhanceTag); - this.groupBoxEnhance.Location = new System.Drawing.Point(997, 1108); + this.groupBoxEnhance.Location = new System.Drawing.Point(999, 1016); this.groupBoxEnhance.Name = "groupBoxEnhance"; - this.groupBoxEnhance.Size = new System.Drawing.Size(457, 89); + this.groupBoxEnhance.Size = new System.Drawing.Size(457, 79); this.groupBoxEnhance.TabIndex = 44; this.groupBoxEnhance.TabStop = false; this.groupBoxEnhance.Text = "Enhance 参数"; @@ -1802,7 +1802,7 @@ private void InitializeComponent() this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.BackColor = System.Drawing.SystemColors.Control; - this.ClientSize = new System.Drawing.Size(1466, 1518); + this.ClientSize = new System.Drawing.Size(1466, 1374); this.Controls.Add(this.groupBoxLog); this.Controls.Add(this.groupBoxComonSettings); this.Controls.Add(this.groupBoxAdvanceSettings); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index d7dcef7..fc9e540 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.0.1.7")] -[assembly: AssemblyFileVersion("2.0.1.7")] +[assembly: AssemblyVersion("2.3.0")] +[assembly: AssemblyFileVersion("2.3.0")] diff --git a/about.Designer.cs b/about.Designer.cs index 35b0307..c695c63 100644 --- a/about.Designer.cs +++ b/about.Designer.cs @@ -374,7 +374,7 @@ private void InitializeComponent() this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "关于 SubsCheck Win GUI"; + this.Text = "关于 "; this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.groupBox2.ResumeLayout(false); From 0215d79d5fa1ea3ff34a7a130cf8a54655eb625c Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 29 Sep 2025 23:44:30 +0800 Subject: [PATCH 27/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0AutoUpdater?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96GUI=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=EF=BC=8C=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 88 ++++---- CHANGELOG.md | 33 +++ CheckUpdates.cs | 53 ++++- MainGui.Designer.cs | 266 ++++++++++++------------ MainGui.cs | 344 ++++++++++++++++++++----------- MainGui.resx | 3 - Program.cs | 13 ++ Properties/AssemblyInfo.cs | 6 +- Properties/Resources.Designer.cs | 12 +- Properties/Resources.resx | 3 + cliff-release.toml | 100 +++++++++ cliff.toml | 92 +++++++++ packages.config | 2 + subs-check.win.gui.csproj | 26 +++ update.xml | 8 + 15 files changed, 741 insertions(+), 308 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 cliff-release.toml create mode 100644 cliff.toml create mode 100644 update.xml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3376c73..e0e9177 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -30,6 +30,9 @@ jobs: run: | mkdir -p release cp -r bin/Release/*.exe bin/Release/*.dll release/ + # 由于使用了 AutoUpdater, 故需要将 runtimes 和 zh 目录也打包 + cp -r bin/Release/runtimes release/ + cp -r bin/Release/zh release/ shell: bash - name: Upload artifact @@ -48,6 +51,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: master - name: Download artifact uses: actions/download-artifact@v4 @@ -58,61 +62,67 @@ jobs: - name: Prepare tags (delete local tags then fetch remote tags cleanly) id: tags run: | - # current tag 从触发环境取 CURRENT_TAG="${GITHUB_REF#refs/tags/}" echo "current_tag=$CURRENT_TAG" >> $GITHUB_OUTPUT - - # 找到上一个 tag(按创建时间倒序,排除当前) PREV_TAG=$(git tag --sort=-creatordate | grep -v "^${CURRENT_TAG}$" | head -n1 || true) echo "prev_tag=$PREV_TAG" >> $GITHUB_OUTPUT shell: bash - - name: Generate changelog (no file, put into step output) - id: changelog + - name: Create ZIP archive run: | - CURRENT="${{ steps.tags.outputs.current_tag }}" - PREV="${{ steps.tags.outputs.prev_tag }}" - - if [ -z "$CURRENT" ]; then - echo "No current tag detected from GITHUB_REF; aborting changelog generation." >&2 - printf '%s\n' "body<> $GITHUB_OUTPUT - printf '%s\n' "## Changelog" >> $GITHUB_OUTPUT - printf '%s\n' "- Unable to determine current tag from environment." >> $GITHUB_OUTPUT - printf '%s\n' "EOF" >> $GITHUB_OUTPUT - exit 0 - fi + cd release + zip -r subs-check-win.zip . + shell: bash - # 尝试获取 tag 的日期(短格式),失败则忽略 - TAG_DATE=$(git log -1 --format=%ad --date=short "$CURRENT" 2>/dev/null || true) + # 用 git-cliff 生成并更新 CHANGELOG.md(范围:PREV_TAG..CURRENT_TAG) + - name: Generate changelog with git-cliff + uses: orhun/git-cliff-action@v4 + id: git-cliff + with: + config: cliff.toml + args: ${{ steps.tags.outputs.prev_tag && format('{0}..{1}', steps.tags.outputs.prev_tag, steps.tags.outputs.current_tag) || steps.tags.outputs.current_tag }} -o CHANGELOG.md - if [ -z "$PREV" ]; then - # 首次发布或没有上一个 tag:取最近 20 条提交(短哈希 + 标题 + 作者) - LOG=$(git log --pretty=format:'- %h %s (%an)' --no-merges -n 20) - else - LOG=$(git log --pretty=format:'- %h %s (%an)' --no-merges "$PREV".."$CURRENT") - fi + # 用 git-cliff 生成 Release body(范围:PREV_TAG..CURRENT_TAG) + - name: Generate changelog with git-cliff (release body) + uses: orhun/git-cliff-action@v4 + id: git-cliff-release + with: + config: cliff-release.toml + args: ${{ steps.tags.outputs.prev_tag && format('{0}..{1}', steps.tags.outputs.prev_tag, steps.tags.outputs.current_tag) || steps.tags.outputs.current_tag }} - if [ -z "$LOG" ]; then - LOG="- No notable changes found (commits may be merge/empty or follow a different convention)." - fi + - name: Generate update.xml + run: | + CURRENT_TAG="${{ steps.tags.outputs.current_tag }}" + + cat > update.xml < + + ${CURRENT_TAG} + https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/${CURRENT_TAG}/subs-check-win.zip + https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md + false + subs-check.win.gui.exe + + EOF + + - name: Commit changelog and update.xml + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - HEADER="## Changelog" - printf '%s\n' "body<> $GITHUB_OUTPUT - printf '%s\n' "$HEADER" >> $GITHUB_OUTPUT - printf '%s\n' "$LOG" >> $GITHUB_OUTPUT - printf '%s\n' "EOF" >> $GITHUB_OUTPUT - shell: bash + git add CHANGELOG.md update.xml + if git diff --cached --quiet; then + echo "No changes in CHANGELOG.md or update.xml" + exit 0 + fi - - name: Create ZIP archive - run: | - cd release - zip -r subs-check-win.zip . - shell: bash # Zip the contents of the release directory + git commit -m "chore(release): update CHANGELOG.md and update.xml for ${{ steps.tags.outputs.current_tag }}" + git push - name: Create Release uses: softprops/action-gh-release@v2 with: - body: ${{ steps.changelog.outputs.body }} + body: ${{ steps.git-cliff-release.outputs.content }} files: release/subs-check-win.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fc9d12a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,33 @@ +## [2.3.0.0] - 2025-09-29 + +### 🚀 Features + +- 添加检测流水线并发设置 +- 添加32\64位内核切换 +- 添加高并发内核/原版切换 +- 支持流水线分阶段自适应并发检测 +- 支持流水线分段高并发模式,增强位置标签,大幅提高性能 +- 添加AutoUpdater,优化GUI自动更新,修复部分进度显示 + +### 🐛 Bug Fixes + +- 修复saveMethod group的初始化位置 +- 修复版本架构切换逻辑,避免下载进程冲突 +- 修复R2和webdav的默认载入位置 +- 修复cron输入框显示 +- 修复listen-port参数写入错误 + +### ⚡ Performance + +- 优化控件提示,提升使用体验 +- 优化保留之前成功节点的逻辑 +- 优化开始检测\结束检测的按钮事件逻辑,修复bug +- 优化启动检测按钮和日志标签显示 + +### 🎨 Styling + +- 语义化控件名称 + +### ⚙️ Miscellaneous Tasks + +- *(UI)* 调整界面尺寸,以适配旧设备 \ No newline at end of file diff --git a/CheckUpdates.cs b/CheckUpdates.cs index 84ab988..66efcbb 100644 --- a/CheckUpdates.cs +++ b/CheckUpdates.cs @@ -1,11 +1,18 @@ -using Newtonsoft.Json.Linq; -using System; +using System; using System.Collections.Generic; using System.Data; using System.Linq; +using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Windows.Forms; + +using AutoUpdaterDotNET; + +using Newtonsoft.Json.Linq; + +using subs_check.win.gui.Properties; + using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace subs_check.win.gui @@ -26,6 +33,36 @@ public partial class CheckUpdates : Form public CheckUpdates() { InitializeComponent(); + //注册自动更新订阅事件 + AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; + } + + //自定义检查更新事件 + private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) + { + if (args.Error == null) + { + if (args.IsUpdateAvailable) + { + // 如果你想显示标准更新窗口,请取消下面这行的注释 + AutoUpdater.ShowUpdateForm(args); + } + } + else + { + if (args.Error is WebException) + { + MessageBox.Show( + @"无法连接到更新服务器。请检查您的网络连接并稍后重试。", + @"更新检查失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show(args.Error.Message, + args.Error.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } } protected override void OnLoad(EventArgs e) @@ -68,8 +105,17 @@ private async void timer1_Tick(object sender, EventArgs e) } else { - button1.Text = "缺少更新程序"; + button1.Text = "AutoUpdate"; button1.Enabled = false; + // 使用AutoUpdater进行更新检查 + //AutoUpdater.Mandatory = true; + //AutoUpdater.UpdateMode = Mode.Forced; + AutoUpdater.SetOwner(CheckUpdates.ActiveForm); + AutoUpdater.Icon = Resources.download; + AutoUpdater.ShowRemindLaterButton = false; + AutoUpdater.ReportErrors = true; + AutoUpdater.HttpUserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; + AutoUpdater.Start("https://ghproxy.net/raw.githubusercontent.com/sinspired/subsCheck-Win-GUI/master/update.xml"); } } else @@ -201,6 +247,7 @@ private async void timer1_Tick(object sender, EventArgs e) label6.Text = latestVersion; if (当前subsCheck版本号 != latestVersion) { + button2.ForeColor = System.Drawing.Color.Green; button2.Text = "立即更新"; button2.Enabled = true; } diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index c0af55e..0b82a24 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -33,19 +33,19 @@ private void InitializeComponent() this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.timerinitial = new System.Windows.Forms.Timer(this.components); this.groupBoxComonSettings = new System.Windows.Forms.GroupBox(); + this.numericUpDownMinSpeed = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownTimeout = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownInterval = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownConcurrent = new System.Windows.Forms.NumericUpDown(); + this.comboBoxSaveMethod = new System.Windows.Forms.ComboBox(); + this.checkBoxSwitchArch64 = new System.Windows.Forms.CheckBox(); this.textBoxCron = new System.Windows.Forms.TextBox(); this.labelConcurrent = new System.Windows.Forms.Label(); - this.numericUpDownConcurrent = new System.Windows.Forms.NumericUpDown(); this.labelInterval = new System.Windows.Forms.Label(); - this.numericUpDownInterval = new System.Windows.Forms.NumericUpDown(); this.labelTimeout = new System.Windows.Forms.Label(); - this.numericUpDownTimeout = new System.Windows.Forms.NumericUpDown(); this.labelMinSpped = new System.Windows.Forms.Label(); - this.numericUpDownMinSpeed = new System.Windows.Forms.NumericUpDown(); this.labelSaveMethod = new System.Windows.Forms.Label(); - this.comboBoxSaveMethod = new System.Windows.Forms.ComboBox(); this.checkBoxHighConcurrent = new System.Windows.Forms.CheckBox(); - this.checkBoxSwitchArch64 = new System.Windows.Forms.CheckBox(); this.comboBoxSubscriptionType = new System.Windows.Forms.ComboBox(); this.buttonCopySubscriptionUrl = new System.Windows.Forms.Button(); this.buttonTriggerCheck = new System.Windows.Forms.Button(); @@ -123,10 +123,10 @@ private void InitializeComponent() this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); this.groupBoxComonSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWebUIPort)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDLTimehot)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubStorePort)).BeginInit(); @@ -193,31 +193,77 @@ private void InitializeComponent() this.groupBoxComonSettings.TabStop = false; this.groupBoxComonSettings.Text = "参数设置"; // - // textBoxCron + // numericUpDownMinSpeed // - this.textBoxCron.AcceptsReturn = true; - this.textBoxCron.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.textBoxCron.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList; - this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxCron.Location = new System.Drawing.Point(85, 496); - this.textBoxCron.Margin = new System.Windows.Forms.Padding(5); - this.textBoxCron.Name = "textBoxCron"; - this.textBoxCron.Size = new System.Drawing.Size(214, 31); - this.textBoxCron.TabIndex = 21; - this.textBoxCron.Text = "0 */2 * * *"; - this.textBoxCron.Visible = false; - this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); - this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); + this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 180); + this.numericUpDownMinSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownMinSpeed.Maximum = new decimal(new int[] { + 20480, + 0, + 0, + 0}); + this.numericUpDownMinSpeed.Minimum = new decimal(new int[] { + 128, + 0, + 0, + 0}); + this.numericUpDownMinSpeed.Name = "numericUpDownMinSpeed"; + this.numericUpDownMinSpeed.Size = new System.Drawing.Size(106, 31); + this.numericUpDownMinSpeed.TabIndex = 13; + this.numericUpDownMinSpeed.Value = new decimal(new int[] { + 1024, + 0, + 0, + 0}); + this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDownMinSpeed_ValueChanged); // - // labelConcurrent + // numericUpDownTimeout // - this.labelConcurrent.AutoSize = true; - this.labelConcurrent.Location = new System.Drawing.Point(13, 38); - this.labelConcurrent.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.labelConcurrent.Name = "labelConcurrent"; - this.labelConcurrent.Size = new System.Drawing.Size(136, 21); - this.labelConcurrent.TabIndex = 2; - this.labelConcurrent.Text = "并发线程数:"; + this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 131); + this.numericUpDownTimeout.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownTimeout.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownTimeout.Minimum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownTimeout.Name = "numericUpDownTimeout"; + this.numericUpDownTimeout.Size = new System.Drawing.Size(106, 31); + this.numericUpDownTimeout.TabIndex = 12; + this.numericUpDownTimeout.Value = new decimal(new int[] { + 5000, + 0, + 0, + 0}); + this.numericUpDownTimeout.ValueChanged += new System.EventHandler(this.numericUpDownTimeout_ValueChanged); + // + // numericUpDownInterval + // + this.numericUpDownInterval.Location = new System.Drawing.Point(192, 82); + this.numericUpDownInterval.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownInterval.Maximum = new decimal(new int[] { + 1440, + 0, + 0, + 0}); + this.numericUpDownInterval.Minimum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.numericUpDownInterval.Name = "numericUpDownInterval"; + this.numericUpDownInterval.Size = new System.Drawing.Size(106, 31); + this.numericUpDownInterval.TabIndex = 11; + this.numericUpDownInterval.Value = new decimal(new int[] { + 120, + 0, + 0, + 0}); + this.numericUpDownInterval.DoubleClick += new System.EventHandler(this.切换cron表达式); // // numericUpDownConcurrent // @@ -243,6 +289,59 @@ private void InitializeComponent() 0}); this.numericUpDownConcurrent.ValueChanged += new System.EventHandler(this.numericUpDownConcurrent_ValueChanged); // + // comboBoxSaveMethod + // + this.comboBoxSaveMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSaveMethod.FormattingEnabled = true; + this.comboBoxSaveMethod.Items.AddRange(new object[] { + "本地", + "gist", + "r2", + "webdav"}); + this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 230); + this.comboBoxSaveMethod.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; + this.comboBoxSaveMethod.Size = new System.Drawing.Size(106, 29); + this.comboBoxSaveMethod.TabIndex = 16; + this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBoxSaveMethod_TextChanged); + // + // checkBoxSwitchArch64 + // + this.checkBoxSwitchArch64.AutoSize = true; + this.checkBoxSwitchArch64.Location = new System.Drawing.Point(167, 539); + this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; + this.checkBoxSwitchArch64.Size = new System.Drawing.Size(111, 25); + this.checkBoxSwitchArch64.TabIndex = 38; + this.checkBoxSwitchArch64.Text = "x64内核"; + this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; + this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.checkBoxSwitchArch64_CheckedChanged); + // + // textBoxCron + // + this.textBoxCron.AcceptsReturn = true; + this.textBoxCron.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; + this.textBoxCron.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList; + this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxCron.Location = new System.Drawing.Point(85, 496); + this.textBoxCron.Margin = new System.Windows.Forms.Padding(5); + this.textBoxCron.Name = "textBoxCron"; + this.textBoxCron.Size = new System.Drawing.Size(214, 31); + this.textBoxCron.TabIndex = 21; + this.textBoxCron.Text = "0 */2 * * *"; + this.textBoxCron.Visible = false; + this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); + this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); + // + // labelConcurrent + // + this.labelConcurrent.AutoSize = true; + this.labelConcurrent.Location = new System.Drawing.Point(13, 38); + this.labelConcurrent.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelConcurrent.Name = "labelConcurrent"; + this.labelConcurrent.Size = new System.Drawing.Size(136, 21); + this.labelConcurrent.TabIndex = 2; + this.labelConcurrent.Text = "并发线程数:"; + // // labelInterval // this.labelInterval.AutoSize = true; @@ -254,30 +353,6 @@ private void InitializeComponent() this.labelInterval.Text = "检查间隔(分钟):"; this.labelInterval.DoubleClick += new System.EventHandler(this.切换cron表达式); // - // numericUpDownInterval - // - this.numericUpDownInterval.Location = new System.Drawing.Point(192, 82); - this.numericUpDownInterval.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDownInterval.Maximum = new decimal(new int[] { - 1440, - 0, - 0, - 0}); - this.numericUpDownInterval.Minimum = new decimal(new int[] { - 30, - 0, - 0, - 0}); - this.numericUpDownInterval.Name = "numericUpDownInterval"; - this.numericUpDownInterval.Size = new System.Drawing.Size(106, 31); - this.numericUpDownInterval.TabIndex = 11; - this.numericUpDownInterval.Value = new decimal(new int[] { - 120, - 0, - 0, - 0}); - this.numericUpDownInterval.DoubleClick += new System.EventHandler(this.切换cron表达式); - // // labelTimeout // this.labelTimeout.AutoSize = true; @@ -288,30 +363,6 @@ private void InitializeComponent() this.labelTimeout.TabIndex = 4; this.labelTimeout.Text = "超时时间(毫秒):"; // - // numericUpDownTimeout - // - this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 131); - this.numericUpDownTimeout.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDownTimeout.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownTimeout.Minimum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownTimeout.Name = "numericUpDownTimeout"; - this.numericUpDownTimeout.Size = new System.Drawing.Size(106, 31); - this.numericUpDownTimeout.TabIndex = 12; - this.numericUpDownTimeout.Value = new decimal(new int[] { - 5000, - 0, - 0, - 0}); - this.numericUpDownTimeout.ValueChanged += new System.EventHandler(this.numericUpDownTimeout_ValueChanged); - // // labelMinSpped // this.labelMinSpped.AutoSize = true; @@ -322,30 +373,6 @@ private void InitializeComponent() this.labelMinSpped.TabIndex = 5; this.labelMinSpped.Text = "测速下限(KB/s):"; // - // numericUpDownMinSpeed - // - this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 180); - this.numericUpDownMinSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDownMinSpeed.Maximum = new decimal(new int[] { - 20480, - 0, - 0, - 0}); - this.numericUpDownMinSpeed.Minimum = new decimal(new int[] { - 128, - 0, - 0, - 0}); - this.numericUpDownMinSpeed.Name = "numericUpDownMinSpeed"; - this.numericUpDownMinSpeed.Size = new System.Drawing.Size(106, 31); - this.numericUpDownMinSpeed.TabIndex = 13; - this.numericUpDownMinSpeed.Value = new decimal(new int[] { - 1024, - 0, - 0, - 0}); - this.numericUpDownMinSpeed.ValueChanged += new System.EventHandler(this.numericUpDownMinSpeed_ValueChanged); - // // labelSaveMethod // this.labelSaveMethod.AutoSize = true; @@ -356,22 +383,6 @@ private void InitializeComponent() this.labelSaveMethod.TabIndex = 8; this.labelSaveMethod.Text = "保存方法:"; // - // comboBoxSaveMethod - // - this.comboBoxSaveMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSaveMethod.FormattingEnabled = true; - this.comboBoxSaveMethod.Items.AddRange(new object[] { - "本地", - "gist", - "r2", - "webdav"}); - this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 230); - this.comboBoxSaveMethod.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; - this.comboBoxSaveMethod.Size = new System.Drawing.Size(106, 29); - this.comboBoxSaveMethod.TabIndex = 16; - this.comboBoxSaveMethod.TextChanged += new System.EventHandler(this.comboBoxSaveMethod_TextChanged); - // // checkBoxHighConcurrent // this.checkBoxHighConcurrent.AutoSize = true; @@ -383,17 +394,6 @@ private void InitializeComponent() this.checkBoxHighConcurrent.UseVisualStyleBackColor = true; this.checkBoxHighConcurrent.CheckedChanged += new System.EventHandler(this.checkBoxHighConcurrent_CheckedChanged); // - // checkBoxSwitchArch64 - // - this.checkBoxSwitchArch64.AutoSize = true; - this.checkBoxSwitchArch64.Location = new System.Drawing.Point(167, 539); - this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; - this.checkBoxSwitchArch64.Size = new System.Drawing.Size(111, 25); - this.checkBoxSwitchArch64.TabIndex = 38; - this.checkBoxSwitchArch64.Text = "x64内核"; - this.checkBoxSwitchArch64.UseVisualStyleBackColor = true; - this.checkBoxSwitchArch64.CheckedChanged += new System.EventHandler(this.checkBoxSwitchArch64_CheckedChanged); - // // comboBoxSubscriptionType // this.comboBoxSubscriptionType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -1819,10 +1819,10 @@ private void InitializeComponent() this.Text = "SubsCheck Win GUI"; this.groupBoxComonSettings.ResumeLayout(false); this.groupBoxComonSettings.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConcurrent)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWebUIPort)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDLTimehot)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubStorePort)).EndInit(); diff --git a/MainGui.cs b/MainGui.cs index 35a9909..de73bab 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -1,6 +1,4 @@ -using Newtonsoft.Json.Linq; - -using System; +using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; @@ -8,12 +6,18 @@ using System.IO; using System.IO.Compression; using System.Linq; +using System.Net; using System.Net.Http; using System.Net.NetworkInformation; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using AutoUpdaterDotNET; + +using Newtonsoft.Json.Linq; + namespace subs_check.win.gui { public partial class MainGui : Form @@ -45,11 +49,11 @@ public partial class MainGui : Form private Point _enhanceOriginalLocation; private bool _originalLocationSaved = false; - - public MainGui() { InitializeComponent(); + this.Shown += MainGui_Shown; + originalNotifyIcon = notifyIcon1.Icon; toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。\n\n如启用高并发而未单独设置分段并发数,将使用该值计算自适应并发数.\n启用高并发后,此值可安全设置,下载速度会被限制在一个较小的值,同时加快检测速度"); @@ -115,6 +119,56 @@ public MainGui() SetupNotifyIconContextMenu(); } + private void MainGui_Shown(object sender, EventArgs e) + { + AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; + AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent; + + AutoUpdater.Icon = Properties.Resources.download; + AutoUpdater.ShowRemindLaterButton = false; + AutoUpdater.ReportErrors = true; + AutoUpdater.HttpUserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; + + // 注意:这里不需要 SetOwner(MainGui.ActiveForm),因为当前窗体就是 Owner + AutoUpdater.Start("https://gh.39.al/raw.githubusercontent.com/sinspired/subsCheck-Win-GUI/master/update.xml"); + } + + // 更新程序退出事件处理器 + private async void AutoUpdater_ApplicationExitEvent() + { + StopSubsCheckProcess(); + await KillNodeProcessAsync(); + Application.Exit(); + } + + //自定义检查更新事件 + private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) + { + if (args.Error == null) + { + if (args.IsUpdateAvailable) + { + // 如果你想显示标准更新窗口,请取消下面这行的注释 + AutoUpdater.ShowUpdateForm(args); + } + } + else + { + if (args.Error is WebException) + { + MessageBox.Show( + @"无法连接到更新服务器。请检查您的网络连接并稍后重试。", + @"更新检查失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show(args.Error.Message, + args.Error.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + //临时禁用/恢复控件重绘 [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); @@ -258,7 +312,7 @@ private async void timerinitial_Tick(object sender, EventArgs e)//初始化 if (CheckCommandLineParameter("-auto")) { - Log("检测到开机启动,准备执行任务..."); + Log("检测到开机启动,准备执行任务...", GetRichTextBoxAllLog()); buttonStartCheck_Click(this, EventArgs.Empty); this.Hide(); notifyIcon1.Visible = true; @@ -788,12 +842,12 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 { subUrls.Add(succedProxiesUrl); } - Log("已加载上次测试结果。"); + Log("已加载上次测试结果。", GetRichTextBoxAllLog()); } else { checkBoxKeepSucced.Checked = true; - Log("将于第二次自动运行时加载上次测试结果。"); + Log("将于第二次自动运行时加载上次测试结果。", GetRichTextBoxAllLog()); } if (!string.IsNullOrWhiteSpace(textBoxSubsUrls.Text)) @@ -860,12 +914,12 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 // 检查文件是否存在 if (!File.Exists(downloadFilePath)) { - Log($"{displayName} 覆写配置文件 未找到,将使用在线版本。"); + Log($"{displayName} 覆写配置文件 未找到,将使用在线版本。", GetRichTextBoxAllLog()); config["mihomo-overwrite-url"] = githubProxyURL + downloadUrl; } else { - Log($"{displayName} 覆写配置文件 加载成功。"); + Log($"{displayName} 覆写配置文件 加载成功。", GetRichTextBoxAllLog()); config["mihomo-overwrite-url"] = $"http://127.0.0.1:{numericUpDownWebUIPort.Value}/{fileName}"; } } @@ -931,7 +985,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 if (Config.ContainsKey(kvp.Key)) { conflictKeys.Add(kvp.Key); - Log($"发现重复键 '{kvp.Key}',使用GUI配置"); + Log($"发现重复键 '{kvp.Key}',使用GUI配置", GetRichTextBoxAllLog()); } else { @@ -944,7 +998,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 yamlContent = serializer.Serialize(Config); - Log($"已将补充参数配置 more.yaml 内容追加到配置文件"); + Log($"已将补充参数配置 more.yaml 内容追加到配置文件", GetRichTextBoxAllLog()); } // 写入YAML文件 File.WriteAllText(configFilePath, yamlContent); @@ -1084,7 +1138,7 @@ private async void buttonStartCheck_Click(object sender, EventArgs e) else { run = 0; - Log("任务停止"); + Log("任务停止", GetRichTextBoxAllLog()); progressBarAll.Value = 0; progressBarAll.Visible = false; labelLogNodeInfo.Text = "实时日志"; @@ -1137,7 +1191,7 @@ public async Task DownloadSubsCheckEXE() downloading = 1; try { - Log("正在检查网络连接..."); + Log("正在检查网络连接...", GetRichTextBoxAllLog()); // 动态决定使用哪个仓库(checkBoxHighConcurrent 为 true 时使用 sinspired,否则使用 beck-8) string repoOwner = checkBoxHighConcurrent.Checked ? "sinspired" : "beck-8"; @@ -1151,7 +1205,7 @@ public async Task DownloadSubsCheckEXE() // 首先检查是否有网络连接 if (!IsNetworkAvailable()) { - Log("网络连接不可用,无法下载核心文件。", true); + Log("网络连接不可用,无法下载核心文件。", GetRichTextBoxAllLog(), true); MessageBox.Show($"缺少 subs-check.exe 核心文件。\n\n您可以前往 {releasesPageUrl} 自行下载!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; @@ -1181,7 +1235,7 @@ public async Task DownloadSubsCheckEXE() { string latestVersion = result.Item1; JArray assets = result.Item2; - Log($"subs-check.exe 最新版本为: {latestVersion} "); + Log($"subs-check.exe 最新版本为: {latestVersion} ", GetRichTextBoxAllLog()); // 先尝试精确匹配期望文件名;找不到则回退为任意包含 "Windows" 且包含 arch token 的条目; // 若仍找不到,再回退为任意包含 "Windows" 的资源。 @@ -1225,7 +1279,7 @@ public async Task DownloadSubsCheckEXE() if (downloadUrl == null) { - Log("无法找到适用于 Windows 的下载链接。", true); + Log("无法找到适用于 Windows 的下载链接。", GetRichTextBoxAllLog(), true); MessageBox.Show($"未能找到适用的 subs-check.exe 下载链接。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; @@ -1255,7 +1309,7 @@ public async Task DownloadSubsCheckEXE() string executablePath = Path.GetDirectoryName(Application.ExecutablePath); // 创建下载请求 - 优化的多级尝试下载逻辑 - Log("开始下载文件..."); + Log("开始下载文件...", GetRichTextBoxAllLog()); bool downloadSuccess = false; string zipFilePath = Path.Combine(executablePath, desiredAssetName); string failureReason = ""; @@ -1266,12 +1320,12 @@ public async Task DownloadSubsCheckEXE() // 第一次尝试:使用代理下载链接 + 当前HttpClient(不使用系统代理) try { - Log($"[尝试1/4] 使用代理下载链接:{代理下载链接}"); + Log($"[尝试1/4] 使用代理下载链接:{代理下载链接}", GetRichTextBoxAllLog()); downloadSuccess = await DownloadFileAsync(client, 代理下载链接, zipFilePath); } catch (Exception ex) { - Log($"[尝试1/4] 失败: {ex.Message}", true); + Log($"[尝试1/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); failureReason = ex.Message; } @@ -1280,12 +1334,12 @@ public async Task DownloadSubsCheckEXE() { try { - Log($"[尝试2/4] 使用原生下载链接:{原生下载链接}"); + Log($"[尝试2/4] 使用原生下载链接:{原生下载链接}", GetRichTextBoxAllLog()); downloadSuccess = await DownloadFileAsync(client, 原生下载链接, zipFilePath); } catch (Exception ex) { - Log($"[尝试2/4] 失败: {ex.Message}", true); + Log($"[尝试2/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); failureReason = ex.Message; } } @@ -1295,7 +1349,7 @@ public async Task DownloadSubsCheckEXE() { try { - Log("[尝试3/4] 使用系统代理 + 代理下载链接"); + Log("[尝试3/4] 使用系统代理 + 代理下载链接", GetRichTextBoxAllLog()); using (HttpClient proxyClient = new HttpClient()) { proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); @@ -1306,7 +1360,7 @@ public async Task DownloadSubsCheckEXE() } catch (Exception ex) { - Log($"[尝试3/4] 失败: {ex.Message}", true); + Log($"[尝试3/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); failureReason = ex.Message; } @@ -1315,7 +1369,7 @@ public async Task DownloadSubsCheckEXE() { try { - Log("[尝试4/4] 使用系统代理 + 原生下载链接"); + Log("[尝试4/4] 使用系统代理 + 原生下载链接", GetRichTextBoxAllLog()); using (HttpClient proxyClient = new HttpClient()) { proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); @@ -1326,7 +1380,7 @@ public async Task DownloadSubsCheckEXE() } catch (Exception ex) { - Log($"[尝试4/4] 失败: {ex.Message}", true); + Log($"[尝试4/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); failureReason = ex.Message; } } @@ -1334,7 +1388,7 @@ public async Task DownloadSubsCheckEXE() if (!downloadSuccess) { - Log($"所有下载尝试均失败,最后错误: {failureReason}", true); + Log($"所有下载尝试均失败,最后错误: {failureReason}", GetRichTextBoxAllLog(), true); MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); progressBarAll.Value = 0; @@ -1343,7 +1397,7 @@ public async Task DownloadSubsCheckEXE() } // 下载成功 -> 解压并查找 subs-check.exe - Log("下载完成,正在解压文件..."); + Log("下载完成,正在解压文件...", GetRichTextBoxAllLog()); // 解压文件 using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)) { @@ -1364,7 +1418,7 @@ public async Task DownloadSubsCheckEXE() 当前subsCheck版本号 = $"{latestVersion}"; - Log($"{currentKernel}({currentArch}): subs-check.exe {当前subsCheck版本号} 已就绪!"); + Log($"{currentKernel}({currentArch}): subs-check.exe {当前subsCheck版本号} 已就绪!", GetRichTextBoxAllLog()); await SaveConfig(false); @@ -1373,13 +1427,13 @@ public async Task DownloadSubsCheckEXE() } else { - Log("无法在压缩包中找到 subs-check.exe 文件。", true); + Log("无法在压缩包中找到 subs-check.exe 文件。", GetRichTextBoxAllLog(), true); } } } catch (Exception ex) { - Log($"下载过程中出错: {ex.Message}", true); + Log($"下载过程中出错: {ex.Message}", GetRichTextBoxAllLog(), true); MessageBox.Show($"下载 subs-check.exe 时出错: {ex.Message}\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -1387,7 +1441,7 @@ public async Task DownloadSubsCheckEXE() } catch (Exception ex) { - Log($"初始化下载过程出错: {ex.Message}", true); + Log($"初始化下载过程出错: {ex.Message}", GetRichTextBoxAllLog(), true); MessageBox.Show($"下载准备过程出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally @@ -1422,7 +1476,7 @@ public async Task DownloadSubsCheckEXE() client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); client.Timeout = TimeSpan.FromSeconds(30); // 增加超时时间以适应下载需求 - if (是否输出log) Log("正在获取最新版本 subs-check.exe 内核下载地址..."); + if (是否输出log) Log("正在获取最新版本 subs-check.exe 内核下载地址...", GetRichTextBoxAllLog()); string url = 版本号URL; string 备用url = 版本号URL.Replace("api.github.com", "api.github.cmliussss.net"); @@ -1440,23 +1494,23 @@ public async Task DownloadSubsCheckEXE() { responseBody = await response.Content.ReadAsStringAsync(); json = JObject.Parse(responseBody); - if (是否输出log) Log("成功从主API获取版本信息"); + if (是否输出log) Log("成功从主API获取版本信息", GetRichTextBoxAllLog()); } // 如果主URL请求不成功但没有抛出异常 else { - if (是否输出log) Log($"主API请求失败 HTTP {(int)response.StatusCode},尝试备用API..."); + if (是否输出log) Log($"主API请求失败 HTTP {(int)response.StatusCode},尝试备用API...", GetRichTextBoxAllLog()); response = await client.GetAsync(备用url); if (response.IsSuccessStatusCode) { responseBody = await response.Content.ReadAsStringAsync(); json = JObject.Parse(responseBody); - if (是否输出log) Log("成功从备用API获取版本信息"); + if (是否输出log) Log("成功从备用API获取版本信息", GetRichTextBoxAllLog()); } else { - if (是否输出log) Log($"备用API也请求失败: HTTP {(int)response.StatusCode}", true); + if (是否输出log) Log($"备用API也请求失败: HTTP {(int)response.StatusCode}", GetRichTextBoxAllLog(), true); return (latestVersion, assets); // 两个URL都失败,提前退出 } } @@ -1464,7 +1518,7 @@ public async Task DownloadSubsCheckEXE() // 捕获网络请求异常(如连接超时、无法解析域名等) catch (HttpRequestException ex) { - if (是否输出log) Log($"主API请求出错: {ex.Message},尝试备用API..."); + if (是否输出log) Log($"主API请求出错: {ex.Message},尝试备用API...", GetRichTextBoxAllLog()); try { response = await client.GetAsync(备用url); @@ -1472,24 +1526,24 @@ public async Task DownloadSubsCheckEXE() { responseBody = await response.Content.ReadAsStringAsync(); json = JObject.Parse(responseBody); - if (是否输出log) Log("成功从备用API获取版本信息"); + if (是否输出log) Log("成功从备用API获取版本信息", GetRichTextBoxAllLog()); } else { - if (是否输出log) Log($"备用API也请求失败: HTTP {(int)response.StatusCode}", true); + if (是否输出log) Log($"备用API也请求失败: HTTP {(int)response.StatusCode}", GetRichTextBoxAllLog(), true); return (latestVersion, assets); // 备用URL也失败,提前退出 } } catch (Exception backupEx) { - if (是否输出log) Log($"备用API请求也出错: {backupEx.Message}", true); + if (是否输出log) Log($"备用API请求也出错: {backupEx.Message}", GetRichTextBoxAllLog(), true); return (latestVersion, assets); // 连备用URL也异常,提前退出 } } // 捕获JSON解析异常 catch (Newtonsoft.Json.JsonException ex) { - if (是否输出log) Log($"解析JSON数据出错: {ex.Message}", true); + if (是否输出log) Log($"解析JSON数据出错: {ex.Message}", GetRichTextBoxAllLog(), true); try { response = await client.GetAsync(备用url); @@ -1497,19 +1551,19 @@ public async Task DownloadSubsCheckEXE() { responseBody = await response.Content.ReadAsStringAsync(); json = JObject.Parse(responseBody); - if (是否输出log) Log("成功从备用API获取版本信息"); + if (是否输出log) Log("成功从备用API获取版本信息", GetRichTextBoxAllLog()); } } catch (Exception backupEx) { - if (是否输出log) Log($"备用API请求也出错: {backupEx.Message}", true); + if (是否输出log) Log($"备用API请求也出错: {backupEx.Message}", GetRichTextBoxAllLog(), true); return (latestVersion, assets); // 连备用URL也有问题,提前退出 } } // 捕获其他所有异常 catch (Exception ex) { - if (是否输出log) Log($"获取版本信息时出现未预期的错误: {ex.Message}", true); + if (是否输出log) Log($"获取版本信息时出现未预期的错误: {ex.Message}", GetRichTextBoxAllLog(), true); try { response = await client.GetAsync(备用url); @@ -1517,12 +1571,12 @@ public async Task DownloadSubsCheckEXE() { responseBody = await response.Content.ReadAsStringAsync(); json = JObject.Parse(responseBody); - if (是否输出log) Log("成功从备用URL获取版本信息"); + if (是否输出log) Log("成功从备用URL获取版本信息", GetRichTextBoxAllLog()); } } catch (Exception backupEx) { - if (是否输出log) Log($"备用API请求也出错: {backupEx.Message}", true); + if (是否输出log) Log($"备用API请求也出错: {backupEx.Message}", GetRichTextBoxAllLog(), true); return (latestVersion, assets); // 连备用URL也有问题,提前退出 } } @@ -1562,7 +1616,7 @@ private async void StartSubsCheckProcess() Process[] processes = Process.GetProcessesByName("subs-check"); if (processes.Length > 0) { - Log("发现正在运行的subs-check.exe进程,正在强制结束..."); + Log("发现正在运行的subs-check.exe进程,正在强制结束...", GetRichTextBoxAllLog()); foreach (Process process in processes) { // 确保不是当前应用程序的进程 @@ -1572,11 +1626,11 @@ private async void StartSubsCheckProcess() { process.Kill(); process.WaitForExit(); - Log($"成功结束subs-check.exe进程(ID: {process.Id})"); + Log($"成功结束subs-check.exe进程(ID: {process.Id})", GetRichTextBoxAllLog()); } catch (Exception ex) { - Log($"结束subs-check.exe进程时出错(ID: {process.Id}): {ex.Message}", true); + Log($"结束subs-check.exe进程时出错(ID: {process.Id}): {ex.Message}", GetRichTextBoxAllLog(), true); } } } @@ -1584,13 +1638,13 @@ private async void StartSubsCheckProcess() } catch (Exception ex) { - Log($"检查运行中的subs-check.exe进程时出错: {ex.Message}", true); + Log($"检查运行中的subs-check.exe进程时出错: {ex.Message}", GetRichTextBoxAllLog(), true); } // 检查文件是否存在 if (!File.Exists(subsCheckPath)) { - Log("没有找到 subs-check.exe 文件。", true); + Log("没有找到 subs-check.exe 文件。", GetRichTextBoxAllLog(), true); await DownloadSubsCheckEXE(); // 使用异步等待 } @@ -1625,12 +1679,12 @@ private async void StartSubsCheckProcess() subsCheckProcess.EnableRaisingEvents = true; subsCheckProcess.Exited += SubsCheckProcess_Exited; - Log($"subs-check.exe {当前subsCheck版本号} 已启动..."); + Log($"subs-check.exe {当前subsCheck版本号} 已启动...", GetRichTextBoxAllLog()); timerRefresh.Enabled = true; } catch (Exception ex) { - Log($"启动 subs-check.exe 时出错: {ex.Message}", true); + Log($"启动 subs-check.exe 时出错: {ex.Message}", GetRichTextBoxAllLog(), true); buttonStartCheck.Text = "▶️ 启动"; buttonStartCheck.ForeColor = Color.Black; } @@ -1647,14 +1701,14 @@ private void StopSubsCheckProcess() // 尝试正常关闭进程 subsCheckProcess.Kill(); subsCheckProcess.WaitForExit(); - Log("subs-check.exe 已停止"); + Log("subs-check.exe 已停止", GetRichTextBoxAllLog()); notifyIcon1.Icon = originalNotifyIcon; buttonTriggerCheck.Enabled = false; buttonTriggerCheck.Text = "🔀未启动"; } catch (Exception ex) { - Log($"停止 subs-check.exe 时出错: {ex.Message}", true); + Log($"停止 subs-check.exe 时出错: {ex.Message}", GetRichTextBoxAllLog(), true); } finally { @@ -1768,7 +1822,7 @@ private void SubsCheckProcess_OutputDataReceived(object sender, DataReceivedEven // 确保定时器正在运行(使用 BeginInvoke 在 UI 线程安全地检查/启动) BeginInvoke(new Action(() => { - Tuple, Timer> st = this.Tag as Tuple, System.Windows.Forms.Timer>; + Tuple, System.Windows.Forms.Timer> st = this.Tag as Tuple, System.Windows.Forms.Timer>; if (st != null && !st.Item2.Enabled) { st.Item2.Start(); @@ -1852,7 +1906,7 @@ private void SubsCheckProcess_Exited(object sender, EventArgs e) // 进程退出时,在 UI 线程上更新控件 BeginInvoke(new Action(() => { - Log("subs-check.exe 已退出"); + Log("subs-check.exe 已退出", GetRichTextBoxAllLog()); buttonStartCheck.Text = "▶️ 启动"; buttonStartCheck.ForeColor = Color.Black; @@ -2227,7 +2281,12 @@ private void textBox7_Leave(object sender, EventArgs e) } } - private void Log(string message, bool isError = false) + private RichTextBox GetRichTextBoxAllLog() + { + return richTextBoxAllLog; + } + + private void Log(string message, RichTextBox richTextBoxAllLog, bool isError = false) { string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string logType = isError ? "ERR" : "INF"; @@ -2304,13 +2363,13 @@ private async Task DetectGitHubProxyAsync(List proxyItems) bool proxyFound = false; string detectedProxyURL = ""; - Log("检测可用 GitHub 代理..."); + Log("检测可用 GitHub 代理...", GetRichTextBoxAllLog()); // 遍历随机排序后的代理列表 foreach (string proxyItem in proxyItems) { string checkUrl = $"https://{proxyItem}/https://raw.githubusercontent.com/cmliu/SubsCheck-Win-GUI/master/packages.config"; - Log($"正在测试 GitHub 代理: {proxyItem}"); + Log($"正在测试 GitHub 代理: {proxyItem}", GetRichTextBoxAllLog()); richTextBoxAllLog.Refresh(); try @@ -2327,7 +2386,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { // 找到可用代理 detectedProxyURL = $"https://{proxyItem}/"; - Log($"找到可用 GitHub 代理: {proxyItem}"); + Log($"找到可用 GitHub 代理: {proxyItem}", GetRichTextBoxAllLog()); proxyFound = true; break; } @@ -2336,7 +2395,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) catch (Exception ex) { // 记录错误但继续尝试下一个 - Log($"代理 {proxyItem} 测试失败: {ex.Message}", true); + Log($"代理 {proxyItem} 测试失败: {ex.Message}", GetRichTextBoxAllLog(), true); richTextBoxAllLog.Refresh(); } } @@ -2344,7 +2403,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) // 如果没有找到可用的代理 if (!proxyFound) { - Log("未找到可用的 GitHub 代理,请在高级设置中手动设置。", true); + Log("未找到可用的 GitHub 代理,请在高级设置中手动设置。", GetRichTextBoxAllLog(), true); MessageBox.Show("未找到可用的 GitHub 代理。\n\n请打开高级设置手动填入一个可用的Github Proxy,或检查您的网络连接。", "代理检测失败", MessageBoxButtons.OK, @@ -2362,7 +2421,7 @@ private async void buttonUpdateKernel_Click(object sender, EventArgs e) buttonStartCheck.Enabled = false; // 清空日志 richTextBoxAllLog.Clear(); - Log("开始检查和下载最新版本的 subs-check.exe..."); + Log("开始检查和下载最新版本的 subs-check.exe...", GetRichTextBoxAllLog()); // 获取当前应用程序目录 string executablePath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); @@ -2371,7 +2430,7 @@ private async void buttonUpdateKernel_Click(object sender, EventArgs e) // 检查文件是否存在 if (File.Exists(subsCheckPath)) { - Log($"发现 subs-check.exe,正在删除..."); + Log($"发现 subs-check.exe,正在删除...", GetRichTextBoxAllLog()); try { @@ -2379,29 +2438,29 @@ private async void buttonUpdateKernel_Click(object sender, EventArgs e) Process[] processes = Process.GetProcessesByName("subs-check"); if (processes.Length > 0) { - Log("发现正在运行的 subs-check.exe 进程,正在强制结束..."); + Log("发现正在运行的 subs-check.exe 进程,正在强制结束...", GetRichTextBoxAllLog()); foreach (Process process in processes) { try { process.Kill(); process.WaitForExit(); - Log($"成功结束 subs-check.exe 进程(ID: {process.Id})"); + Log($"成功结束 subs-check.exe 进程(ID: {process.Id})", GetRichTextBoxAllLog()); } catch (Exception ex) { - Log($"结束进程时出错(ID: {process.Id}): {ex.Message}", true); + Log($"结束进程时出错(ID: {process.Id}): {ex.Message}", GetRichTextBoxAllLog(), true); } } } // 删除文件 File.Delete(subsCheckPath); - Log("成功删除旧版本 subs-check.exe"); + Log("成功删除旧版本 subs-check.exe", GetRichTextBoxAllLog()); } catch (Exception ex) { - Log($"删除 subs-check.exe 时出错: {ex.Message}", true); + Log($"删除 subs-check.exe 时出错: {ex.Message}", GetRichTextBoxAllLog(), true); MessageBox.Show($"无法删除现有的 subs-check.exe 文件: {ex.Message}\n\n请手动删除后重试,或者检查文件是否被其他程序占用。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); buttonUpdateKernel.Enabled = true; return; @@ -2409,25 +2468,25 @@ private async void buttonUpdateKernel_Click(object sender, EventArgs e) } else { - Log("未找到现有的 subs-check.exe 文件,将直接下载最新版本"); + Log("未找到现有的 subs-check.exe 文件,将直接下载最新版本", GetRichTextBoxAllLog()); } // 检测可用的 GitHub 代理 githubProxyURL = await GetGithubProxyUrlAsync(); if (githubProxyURL == "") { - Log("未设置 GitHub 代理,将尝试直接下载", true); + Log("未设置 GitHub 代理,将尝试直接下载", GetRichTextBoxAllLog(), true); } // 下载最新版本的 subs-check.exe await DownloadSubsCheckEXE(); // 完成 - Log("内核更新完成!"); + Log("内核更新完成!", GetRichTextBoxAllLog()); } catch (Exception ex) { - Log($"操作过程中出错: {ex.Message}", true); + Log($"操作过程中出错: {ex.Message}", GetRichTextBoxAllLog(), true); MessageBox.Show($"处理过程中出现错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally @@ -2469,7 +2528,7 @@ private async Task KillNodeProcessAsync() { try { - Log("检查 node.exe 进程状态..."); + Log("检查 node.exe 进程状态...", GetRichTextBoxAllLog()); // 获取当前应用程序的执行目录 string executablePath = Path.GetDirectoryName(Application.ExecutablePath); @@ -2480,11 +2539,11 @@ private async Task KillNodeProcessAsync() if (nodeProcesses.Length == 0) { - Log("未发现运行中的 node.exe 进程"); + Log("未发现运行中的 node.exe 进程", GetRichTextBoxAllLog()); return; } - Log($"发现 {nodeProcesses.Length} 个 node.exe 进程,开始检查并终止匹配路径的进程..."); + Log($"发现 {nodeProcesses.Length} 个 node.exe 进程,开始检查并终止匹配路径的进程...", GetRichTextBoxAllLog()); int terminatedCount = 0; @@ -2510,7 +2569,7 @@ private async Task KillNodeProcessAsync() processPath.Equals(nodeExePath, StringComparison.OrdinalIgnoreCase)) { // 找到匹配的进程,终止它 - Log($"发现匹配路径的 node.exe 进程(ID: {process.Id}),正在强制结束..."); + Log($"发现匹配路径的 node.exe 进程(ID: {process.Id}),正在强制结束...", GetRichTextBoxAllLog()); await Task.Run(() => { @@ -2518,29 +2577,29 @@ await Task.Run(() => process.WaitForExit(); }); - Log($"成功结束 node.exe 进程(ID: {process.Id})"); + Log($"成功结束 node.exe 进程(ID: {process.Id})", GetRichTextBoxAllLog()); terminatedCount++; } } catch (Exception ex) { // 访问进程信息时可能会因为权限问题抛出异常 - Log($"访问或终止进程(ID: {process.Id})时出错: {ex.Message}", true); + Log($"访问或终止进程(ID: {process.Id})时出错: {ex.Message}", GetRichTextBoxAllLog(), true); } } if (terminatedCount > 0) { - Log($"总共终止了 {terminatedCount} 个匹配路径的 node.exe 进程"); + Log($"总共终止了 {terminatedCount} 个匹配路径的 node.exe 进程", GetRichTextBoxAllLog()); } else { - Log("未发现需要终止的 node.exe 进程"); + Log("未发现需要终止的 node.exe 进程", GetRichTextBoxAllLog()); } } catch (Exception ex) { - Log($"检查或终止 node.exe 进程时出错: {ex.Message}", true); + Log($"检查或终止 node.exe 进程时出错: {ex.Message}", GetRichTextBoxAllLog(), true); } } @@ -2578,7 +2637,7 @@ private async void textBoxSubsUrls_DoubleClick(object sender, EventArgs e) // 将处理后的内容更新到Form1的textBox1 textBoxSubsUrls.Text = string.Join(Environment.NewLine, lines); await SaveConfig(false); - Log("已保存订阅地址列表。"); + Log("已保存订阅地址列表。", GetRichTextBoxAllLog()); } } @@ -2599,7 +2658,7 @@ private async void timerRestartSchedule_Tick(object sender, EventArgs e) if (buttonStartCheck.Text == "⏹️ 停止") { buttonStartCheck.ForeColor = Color.Red; - Log("subs-check.exe 运行时满24小时,自动重启清理内存占用。"); + Log("subs-check.exe 运行时满24小时,自动重启清理内存占用。", GetRichTextBoxAllLog()); // 停止 subs-check.exe 程序 StopSubsCheckProcess(); // 结束 Sub-Store @@ -2716,13 +2775,14 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) // 检查文件是否存在 if (!File.Exists(downloadFilePath)) { - Log($"{displayName} 覆写配置文件 未找到,正在下载..."); + Log($"{displayName} 覆写配置文件 未找到,正在下载...", GetRichTextBoxAllLog()); // 重置进度条 progressBarAll.Value = 0; progressBarAll.Visible = true; // 添加GitHub代理前缀如果有 + githubProxyURL = await GetGithubProxyUrlAsync(); string fullDownloadUrl = githubProxyURL + downloadUrl; try @@ -2774,19 +2834,20 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) // 确保进度条显示100% progressBarAll.Value = 100; } - - Log($"{displayName} 覆写配置文件 下载成功"); + progressBarAll.Visible = false; + Log($"{displayName} 覆写配置文件 下载成功", GetRichTextBoxAllLog()); } else { - Log($"{displayName} 覆写配置文件 下载失败: HTTP {(int)response.StatusCode} {response.ReasonPhrase}", true); + progressBarAll.Visible = false; + Log($"{displayName} 覆写配置文件 下载失败: HTTP {(int)response.StatusCode} {response.ReasonPhrase}", GetRichTextBoxAllLog(), true); } } } } catch (Exception ex) { - Log($"{displayName} 覆写配置文件 下载失败: {ex.Message}", true); + Log($"{displayName} 覆写配置文件 下载失败: {ex.Message}", GetRichTextBoxAllLog(), true); // 出错时重置进度条 progressBarAll.Value = 0; progressBarAll.Visible = false; @@ -2794,7 +2855,7 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) } else { - if (汇报Log) Log($"{displayName} 覆写配置文件 已就绪。"); + if (汇报Log) Log($"{displayName} 覆写配置文件 已就绪。", GetRichTextBoxAllLog()); } } @@ -2802,7 +2863,7 @@ private void numericUpDownConcurrent_ValueChanged(object sender, EventArgs e) { if (checkBoxHighConcurrent.Checked) { - Log("已启用流水线高并发模式✨\n- 此值将作为计算测活-测速-流媒体检测各阶段并发数的基准.\n- 内核已启用衰减算法,可放心设置"); + Log("已启用流水线高并发模式✨\n- 此值将作为计算测活-测速-流媒体检测各阶段并发数的基准.\n- 内核已启用衰减算法,可放心设置", GetRichTextBoxAllLog()); } else { @@ -2819,7 +2880,7 @@ private void numericUpDownConcurrent_ValueChanged(object sender, EventArgs e) "• 宽带峰值/25Mbps:可能会影响同网络下载任务\n" + "• 宽带峰值/10Mbps:可能会影响同网络下其他设备的上网体验\n"; - Log(warningMessage); + Log(warningMessage, GetRichTextBoxAllLog()); } } } @@ -2841,11 +2902,11 @@ private void buttonWebUi_Click(object sender, EventArgs e) // 使用系统默认浏览器打开URL System.Diagnostics.Process.Start(url); - Log($"正在浏览器中打开 Subs-Check 配置管理: {url}"); + Log($"正在浏览器中打开 Subs-Check 配置管理: {url}", GetRichTextBoxAllLog()); } catch (Exception ex) { - Log($"打开浏览器失败: {ex.Message}", true); + Log($"打开浏览器失败: {ex.Message}", GetRichTextBoxAllLog(), true); MessageBox.Show($"打开浏览器时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -2940,7 +3001,7 @@ private async Task GetApiStatusAsync() resultArray[5] = "N/A"; // 可选:记录错误到日志 - Log($"获取API状态失败: {ex.Message}", true); + Log($"获取API状态失败: {ex.Message}", GetRichTextBoxAllLog(), true); } return resultArray; @@ -3001,7 +3062,7 @@ private async void timerRefresh_Tick(object sender, EventArgs e) progressBarAll.Value = 100; - + string idleNotify = "SubsCheck: 已就绪\n" + nextCheckTime; if (_lastNotifyText != idleNotify) { @@ -3097,20 +3158,20 @@ private async Task SendApiRequestAsync(string endpoint, string operationNa // 检查响应状态 if (response.IsSuccessStatusCode) { - Log($"成功{operationName}"); + Log($"成功{operationName}", GetRichTextBoxAllLog()); return true; } else { string errorContent = await response.Content.ReadAsStringAsync(); - Log($"{operationName}失败: HTTP {(int)response.StatusCode} {response.ReasonPhrase}\n{errorContent}", true); + Log($"{operationName}失败: HTTP {(int)response.StatusCode} {response.ReasonPhrase}\n{errorContent}", GetRichTextBoxAllLog(), true); return false; } } } catch (Exception ex) { - Log($"{operationName}时发生错误: {ex.Message}", true); + Log($"{operationName}时发生错误: {ex.Message}", GetRichTextBoxAllLog(), true); return false; } } @@ -3123,7 +3184,7 @@ private void textBoxCron_Leave(object sender, EventArgs e) string cronDescription = GetCronExpressionDescription(textBoxCron.Text); // 可以用工具提示或者消息框显示,这里使用消息框 //MessageBox.Show(cronDescription, "Cron表达式说明", MessageBoxButtons.OK, MessageBoxIcon.Information); - Log($"Cron表达式说明 {cronDescription}"); + Log($"Cron表达式说明 {cronDescription}", GetRichTextBoxAllLog()); } else { @@ -3351,7 +3412,7 @@ private void 切换cron表达式(object sender, EventArgs e) textBoxCron.Visible = false; labelInterval.Visible = true; numericUpDownInterval.Visible = true; - Log("下次检查时间间隔 使用分钟倒计时"); + Log("下次检查时间间隔 使用分钟倒计时", GetRichTextBoxAllLog()); } else { @@ -3361,7 +3422,7 @@ private void 切换cron表达式(object sender, EventArgs e) textBoxCron.Visible = true; labelInterval.Visible = false; numericUpDownInterval.Visible = false; - Log("下次检查时间间隔 使用cron表达式"); + Log("下次检查时间间隔 使用cron表达式", GetRichTextBoxAllLog()); } } @@ -3397,7 +3458,7 @@ private string GetComputerNameMD5() } catch (Exception ex) { - Log($"计算计算机名MD5时出错: {ex.Message}", true); + Log($"计算计算机名MD5时出错: {ex.Message}", GetRichTextBoxAllLog(), true); return "CMLiussss"; } } @@ -3434,12 +3495,14 @@ async Task DownloadFileAsync(HttpClient httpClient, string url, string fil { int progressPercentage = (int)((totalBytesRead * 100) / totalBytes); progressPercentage = Math.Min(100, Math.Max(0, progressPercentage)); + progressBarAll.Visible = true; progressBarAll.Value = progressPercentage; } } } } - + progressBarAll.Value = 0; + progressBarAll.Visible = false; return true; // 下载成功 } catch @@ -3494,12 +3557,12 @@ private void buttonMoreSettings_Click(object sender, EventArgs e) if (result == DialogResult.OK) { // 用户点击了"确定"或某种完成操作的按钮 - Log("补充参数配置已成功保存到 more.yaml 文件!设置已应用"); + Log("补充参数配置已成功保存到 more.yaml 文件!设置已应用", GetRichTextBoxAllLog()); } } catch (Exception ex) { - Log($"打开MoreYAML窗口时出错: {ex.Message}", true); + Log($"打开MoreYAML窗口时出错: {ex.Message}", GetRichTextBoxAllLog(), true); MessageBox.Show($"打开MoreYAML窗口时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -3524,13 +3587,13 @@ private async void checkBoxStartup_CheckedChanged(object sender, EventArgs e) // 检查启动文件夹中是否已存在该快捷方式 if (File.Exists(shortcutPath)) { - Log("开机启动项已存在,无需重复创建"); + Log("开机启动项已存在,无需重复创建", GetRichTextBoxAllLog()); } else { // 创建快捷方式 CreateShortcut(appPath, shortcutPath, "-auto"); - Log("已成功创建开机启动项,下次电脑启动时将自动运行程序"); + Log("已成功创建开机启动项,下次电脑启动时将自动运行程序", GetRichTextBoxAllLog()); } } else @@ -3539,13 +3602,13 @@ private async void checkBoxStartup_CheckedChanged(object sender, EventArgs e) if (File.Exists(shortcutPath)) { File.Delete(shortcutPath); - Log("已移除开机启动项,下次开机将不会自动启动"); + Log("已移除开机启动项,下次开机将不会自动启动", GetRichTextBoxAllLog()); } } } catch (Exception ex) { - Log($"设置开机启动项时出错: {ex.Message}", true); + Log($"设置开机启动项时出错: {ex.Message}", GetRichTextBoxAllLog(), true); MessageBox.Show($"设置开机启动项失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); // 恢复CheckBox状态,避免UI状态与实际状态不一致 @@ -3628,7 +3691,7 @@ private void richTextBoxAllLog_DoubleClick(object sender, EventArgs e) // 清空richTextBox1内容 richTextBoxAllLog.Clear(); // 记录一条清空日志的操作信息 - Log("日志已清空"); + Log("日志已清空", GetRichTextBoxAllLog()); } } } @@ -3647,7 +3710,7 @@ private void numericUpDownMinSpeed_ValueChanged(object sender, EventArgs e) "• 视频观看:1024-2048 KB/s\n" + "• 大文件下载:根据实际需求设置\n"; - Log(warningMessage); + Log(warningMessage, GetRichTextBoxAllLog()); } } @@ -3665,7 +3728,7 @@ private void numericUpDownTimeout_ValueChanged(object sender, EventArgs e) "• 普通网络环境:5000± ms\n" + "• 极好网络环境:3000± ms\n"; - Log(warningMessage); + Log(warningMessage, GetRichTextBoxAllLog()); } } @@ -3732,6 +3795,7 @@ private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArgs e) { bool EnableHighConcurrent = checkBoxHighConcurrent.Checked; + // 先进行控件切换 SwitchHighConcurrentLayout(EnableHighConcurrent); @@ -3740,10 +3804,39 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg string want = EnableHighConcurrent ? "高并发内核" : "原版内核"; if (currentKernel != want) { + if (EnableHighConcurrent && !checkBoxSwitchArch64.Checked) + { + DialogResult result = MessageBox.Show( + $"建议使用现代的 x64 架构,以实现更高性能\n\n" + + "· 点击【确定】将使用 x64 内核\n\n" + + "· 点击【取消】将使用 i386 内核\n\n", + "内核架构选择", + MessageBoxButtons.OKCancel, + MessageBoxIcon.Information); + + if (result == DialogResult.OK) + { + //临时禁用事件 + checkBoxSwitchArch64.CheckedChanged -= checkBoxSwitchArch64_CheckedChanged; + checkBoxSwitchArch64.Checked = true; + // 恢复事件 + checkBoxSwitchArch64.CheckedChanged += checkBoxSwitchArch64_CheckedChanged; + } + else + { + //临时禁用事件 + checkBoxSwitchArch64.CheckedChanged -= checkBoxSwitchArch64_CheckedChanged; + checkBoxSwitchArch64.Checked = false; + // 恢复事件 + checkBoxSwitchArch64.CheckedChanged += checkBoxSwitchArch64_CheckedChanged; + } + } + checkBoxSwitchArch64.Enabled = false; checkBoxHighConcurrent.Enabled = false; buttonCheckUpdate.Enabled = false; - Log(EnableHighConcurrent ? "切换为 高并发 内核,可单独设置测活-测速-媒体检测各阶段并发数,大幅提高性能" : "切换为 原版 内核"); + + Log(EnableHighConcurrent ? "切换为 高并发 内核,可单独设置测活-测速-媒体检测各阶段并发数,大幅提高性能" : "切换为 原版 内核", GetRichTextBoxAllLog()); await DownloadSubsCheckEXE();// 若要后台并行改为 _ = DownloadSubsCheckEXE(); currentKernel = want; if (!EnableHighConcurrent) @@ -3754,7 +3847,7 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg checkBoxHighConcurrent.Enabled = true; buttonCheckUpdate.Enabled = true; } - Log(EnableHighConcurrent ? "已切换高并发内核,测活-测速-媒体检测 流水线式并发运行。" : "使用原版内核。"); + Log(EnableHighConcurrent ? "已切换高并发内核,测活-测速-媒体检测 流水线式并发运行。" : "使用原版内核。", GetRichTextBoxAllLog()); } // x64 按钮切换事件 @@ -3768,14 +3861,14 @@ private async void checkBoxSwitchArch64_CheckedChanged(object sender, EventArgs checkBoxHighConcurrent.Enabled = false; buttonCheckUpdate.Enabled = false; githubProxyURL = await GetGithubProxyUrlAsync(); - Log(useX64 ? "切换为 x64 内核,内存占用更高,但CPU占用可能较低" : "切换为 i386 内核,内存占用更低,但CPU占用可能更高"); + Log(useX64 ? "切换为 x64 内核,内存占用更高,但CPU占用可能较低" : "切换为 i386 内核,内存占用更低,但CPU占用可能更高", GetRichTextBoxAllLog()); await DownloadSubsCheckEXE(); currentArch = want; checkBoxSwitchArch64.Enabled = true; checkBoxHighConcurrent.Enabled = true; buttonCheckUpdate.Enabled = true; } - Log(useX64 ? "使用64位内核,如内存占用较高,可在[高级设置]切换" : "使用32位内核,如CPU占用较高,可在[高级设置]切换"); + Log(useX64 ? "使用64位内核,如内存占用较高,可在[高级设置]切换" : "使用32位内核,如CPU占用较高,可在[高级设置]切换", GetRichTextBoxAllLog()); } // 计算一个推荐并发参数 @@ -3891,7 +3984,7 @@ private void checkBoxPipeAuto_CheckedChanged(object sender, EventArgs e) SetNumericUpDownValueSafe(numericUpDownPipeAlive, 0); SetNumericUpDownValueSafe(numericUpDownPipeSpeed, 0); SetNumericUpDownValueSafe(numericUpDownPipeMedia, 0); - Log("并发检测模式: 自适应分段流水线(内核自带衰减算法)"); + Log("并发检测模式: 自适应分段流水线(内核自带衰减算法)", GetRichTextBoxAllLog()); } else { @@ -3905,7 +3998,7 @@ private void checkBoxPipeAuto_CheckedChanged(object sender, EventArgs e) SetNumericUpDownValueSafe(numericUpDownPipeAlive, alive); SetNumericUpDownValueSafe(numericUpDownPipeSpeed, speed); SetNumericUpDownValueSafe(numericUpDownPipeMedia, media); - Log($"默认并发参数: 测活: {alive}, 测速: {speed}, 流媒体: {media} [根据并发数 {numericUpDownConcurrent.Value} 计算]"); + Log($"默认并发参数: 测活: {alive}, 测速: {speed}, 流媒体: {media} [根据并发数 {numericUpDownConcurrent.Value} 计算]", GetRichTextBoxAllLog()); } } finally @@ -3919,19 +4012,19 @@ private void numericUpDownPipeAlive_ValueChanged(object sender, EventArgs e) { if (_inProgrammaticChange) return; switchPipeAutoConcurrent(); - Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}"); + Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}", GetRichTextBoxAllLog()); } private void numericUpDownPipeSpeed_ValueChanged(object sender, EventArgs e) { if (_inProgrammaticChange) return; switchPipeAutoConcurrent(); - Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}"); + Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}", GetRichTextBoxAllLog()); } private void numericUpDownPipeMedia_ValueChanged(object sender, EventArgs e) { if (_inProgrammaticChange) return; switchPipeAutoConcurrent(); - Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}"); + Log($"已设置流水线并发检测参数: Alive: {numericUpDownPipeAlive.Value}, Speed: {numericUpDownPipeSpeed.Value}, Media: {numericUpDownPipeMedia.Value}", GetRichTextBoxAllLog()); } private void NumericUpDownTotalBandwidthLimit_ValueChanged(object sender, EventArgs e) @@ -3939,7 +4032,7 @@ private void NumericUpDownTotalBandwidthLimit_ValueChanged(object sender, EventA float calcBandWidth = (float)numericUpDownTotalBandwidthLimit.Value * 8; if (calcBandWidth > 0) { - Log($"当前设置下载速度限制带宽 {calcBandWidth} 兆。"); + Log($"当前设置下载速度限制带宽 {calcBandWidth} 兆。", GetRichTextBoxAllLog()); toolTip1.SetToolTip(numericUpDownTotalBandwidthLimit, $"总下载速度限制(MB/s):\n建议设置为 <=带宽/8, \n比如你是 200 兆的宽带, 支持的最大下载速度 200/8 = 25 MB/s, 可以设置为 20。\n\n当前设置下载速度对应带宽 {calcBandWidth}"); } } @@ -3956,6 +4049,5 @@ public static Color HexToRgbColor(String hexColour) } return colour; } - } } \ No newline at end of file diff --git a/MainGui.resx b/MainGui.resx index c3120ae..de7e7b4 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 - - 196, 21 - 533, 19 diff --git a/Program.cs b/Program.cs index 281f15a..9afb0a8 100644 --- a/Program.cs +++ b/Program.cs @@ -1,7 +1,10 @@ using System; +using System.Reflection; using System.Threading; using System.Windows.Forms; +using subs_check.win.gui.Properties; + namespace subs_check.win.gui { static class Program @@ -27,6 +30,16 @@ static void Main() return; } + ////启动时检查更新 + ////AutoUpdater.Mandatory = true; + ////AutoUpdater.UpdateMode = Mode.Forced; + //AutoUpdater.SetOwner(MainGui.ActiveForm); + //AutoUpdater.Icon = Resources.download; + //AutoUpdater.ShowRemindLaterButton = false; + //AutoUpdater.ReportErrors = true; + //AutoUpdater.HttpUserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; + //AutoUpdater.Start("https://gh.39.al/raw.githubusercontent.com/sinspired/subsCheck-Win-GUI/master/update.xml"); + try { Application.EnableVisualStyles(); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index fc9e540..1b3c96f 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -6,7 +6,7 @@ // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("SubsCheck Win GUI")] -[assembly: AssemblyDescription("")] +[assembly: AssemblyDescription("SubsCheck 为 Windows 用户设计的 GUI 程序界面。修复字体模糊,兼容新旧dpi设备,新增高并发、64位内核,新增历次检测可用节点,添加新内核特性。")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("TG:CMLiussss")] [assembly: AssemblyProduct("SubsCheck Win GUI")] @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.3.0")] -[assembly: AssemblyFileVersion("2.3.0")] +[assembly: AssemblyVersion("2.3.0.0")] +[assembly: AssemblyFileVersion("2.3.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index f6989a7..a8b8733 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace subs_check.win.gui.Properties { // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -60,6 +60,16 @@ internal Resources() { } } + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap download { + get { + object obj = ResourceManager.GetObject("download", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// 查找 System.Byte[] 类型的本地化资源。 /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 071264b..2864a5c 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\going.ico;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/cliff-release.toml b/cliff-release.toml new file mode 100644 index 0000000..ae097bb --- /dev/null +++ b/cliff-release.toml @@ -0,0 +1,100 @@ +# git-cliff ~ default configuration file +# https://git-cliff.org/docs/configuration +# +# Lines starting with "#" are comments. +# Configuration options are organized into tables and keys. +# See documentation for more information on available options. + +[changelog] +# template for the changelog header +header = """ +# 📝 Changelog\n +""" +# template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ + +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim | upper_first }} + {% for commit in commits %} + - [`{{ commit.id | truncate(length=7, end="") }}`](/commit/{{ commit.id }}) {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ + {% if commit.breaking %}[**breaking**] {% endif %}\ + {{ commit.message | upper_first }}\ + {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}\ + {% endfor %}\n + {% for commit in commits %} + {%- if commit.body and commit.body is matching("^(\\d+\\.|-|\\*)") -%} + {% for line in commit.body | split(pat="\n") %} + {% if line is matching("^(\\d+\\.|-|\\*)") %} + >{{ line }} + {% endif %} + {% endfor %} + {%- endif -%} + {% endfor %} +{% endfor %}\n + +{%- if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} + ## New Contributors +{%- endif -%} + +{% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + * @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} in \ + [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ + {%- endif %} +{%- endfor %}\n +""" +# template for the changelog footer +footer = """ + +""" +# remove the leading and trailing s +trim = true +# postprocessors +postprocessors = [ + { pattern = '', replace = "https://github.com/sinspired/SubsCheck-Win-GUI" }, # replace repository URL +] +# render body even when there are no releases to process +# render_always = true +# output file path +# output = "test.md" + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = true +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + # Replace issue numbers + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))" }, + # Check spelling of the commit with https://github.com/crate-ci/typos + # If the spelling is incorrect, it will be automatically fixed. + #{ pattern = '.*', replace_command = 'typos --write-changes -' }, +] +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "🚀 Features" }, + { message = "^fix", group = "🐛 Bug Fixes" }, + { message = "^doc|^docs", group = "📚 Documentation" }, + { message = "^perf", group = "⚡ Performance" }, + { message = "^refactor", group = "🚜 Refactor" }, + { message = "^style", group = "🎨 Styling" }, + { message = "^test", group = "🧪 Testing" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore\\(pull\\)", skip = true }, + { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, + { body = ".*security", group = "🛡️ Security" }, + { message = "^revert", group = "◀️ Revert" }, + { message = ".*", group = "💼 Other" }, +] +# filter out the commits that are not matched by commit parsers +filter_commits = false +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "oldest" diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..b278c49 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,92 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + + +[changelog] +# A Tera template to be rendered for each release in the changelog. +# See https://keats.github.io/tera/docs/#introduction +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim | upper_first }} + {% for commit in commits %} + - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ + {% if commit.breaking %}[**breaking**] {% endif %}\ + {{ commit.message | upper_first }}\ + {% endfor %} +{% endfor %} +""" +# Remove leading and trailing whitespaces from the changelog's body. +trim = true +# Render body even when there are no releases to process. +render_always = true +# An array of regex based postprocessors to modify the changelog. +postprocessors = [ + # Replace the placeholder with a URL. + #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, +] +# render body even when there are no releases to process +# render_always = true +# output file path +# output = "test.md" + +[git] +# Parse commits according to the conventional commits specification. +# See https://www.conventionalcommits.org +conventional_commits = true +# Exclude commits that do not match the conventional commits specification. +filter_unconventional = true +# Require all commits to be conventional. +# Takes precedence over filter_unconventional. +require_conventional = false +# Split commits on newlines, treating each line as an individual commit. +split_commits = false +# An array of regex based parsers to modify commit messages prior to further processing. +commit_preprocessors = [ + # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit message using https://github.com/crate-ci/typos. + # If the spelling is incorrect, it will be fixed automatically. + #{ pattern = '.*', replace_command = 'typos --write-changes -' }, +] +# Prevent commits that are breaking from being excluded by commit parsers. +protect_breaking_commits = false +# An array of regex based parsers for extracting data from the commit message. +# Assigns commits to groups. +# Optionally sets the commit's scope and can decide to exclude commits from further processing. +commit_parsers = [ + { message = "^feat", group = "🚀 Features" }, + { message = "^fix", group = "🐛 Bug Fixes" }, + { message = "^doc", group = "📚 Documentation" }, + { message = "^perf", group = "⚡ Performance" }, + { message = "^refactor", group = "🚜 Refactor" }, + { message = "^style", group = "🎨 Styling" }, + { message = "^test", group = "🧪 Testing" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore\\(pull\\)", skip = true }, + { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, + { body = ".*security", group = "🛡️ Security" }, + { message = "^revert", group = "◀️ Revert" }, + { message = ".*", group = "💼 Other" }, +] +# Exclude commits that are not matched by any commit parser. +filter_commits = false +# An array of link parsers for extracting external references, and turning them into URLs, using regex. +link_parsers = [] +# Include only the tags that belong to the current branch. +use_branch_tags = false +# Order releases topologically instead of chronologically. +topo_order = false +# Order releases topologically instead of chronologically. +topo_order_commits = true +# Order of commits in each group/release within the changelog. +# Allowed values: newest, oldest +sort_commits = "oldest" +# Process submodules commits +recurse_submodules = false diff --git a/packages.config b/packages.config index 3c95071..185f49e 100644 --- a/packages.config +++ b/packages.config @@ -1,5 +1,7 @@  + + \ No newline at end of file diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index 7396834..dd7ca80 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -13,6 +13,8 @@ true true + + AnyCPU @@ -44,13 +46,28 @@ app.manifest + + packages\Autoupdater.NET.Official.1.9.2\lib\net462\AutoUpdater.NET.dll + + + packages\Microsoft.Web.WebView2.1.0.2592.51\lib\net462\Microsoft.Web.WebView2.Core.dll + + + packages\Microsoft.Web.WebView2.1.0.2592.51\lib\net462\Microsoft.Web.WebView2.WinForms.dll + + + packages\Microsoft.Web.WebView2.1.0.2592.51\lib\net462\Microsoft.Web.WebView2.Wpf.dll + packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + @@ -60,6 +77,7 @@ + packages\YamlDotNet.16.3.0\lib\net47\YamlDotNet.dll @@ -105,6 +123,7 @@ EditURLs.cs + Designer MainGui.cs @@ -142,4 +161,11 @@ + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + \ No newline at end of file diff --git a/update.xml b/update.xml new file mode 100644 index 0000000..81d463e --- /dev/null +++ b/update.xml @@ -0,0 +1,8 @@ + + + 2.3.0.0 + https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.3.0.0/subs-check-win.zip + https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md + false + subs-check.win.gui.exe + From 98cb2f7bc59ec63df21357e97048830d9cb5c5dd Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 30 Sep 2025 02:22:11 +0800 Subject: [PATCH 28/92] chore: upgrade .NET Framework from 4.7.2 to 4.8 --- App.config | 2 +- CHANGELOG.md | 30 +------------- Properties/Settings.Designer.cs | 2 +- app.manifest | 70 ++++++++++++++++----------------- subs-check.win.gui.csproj | 30 +++++++++++++- 5 files changed, 67 insertions(+), 67 deletions(-) diff --git a/App.config b/App.config index ecdcf8a..4bfa005 100644 --- a/App.config +++ b/App.config @@ -1,6 +1,6 @@ - + diff --git a/CHANGELOG.md b/CHANGELOG.md index fc9d12a..2599e15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,33 +1,5 @@ ## [2.3.0.0] - 2025-09-29 -### 🚀 Features - -- 添加检测流水线并发设置 -- 添加32\64位内核切换 -- 添加高并发内核/原版切换 -- 支持流水线分阶段自适应并发检测 -- 支持流水线分段高并发模式,增强位置标签,大幅提高性能 -- 添加AutoUpdater,优化GUI自动更新,修复部分进度显示 - -### 🐛 Bug Fixes - -- 修复saveMethod group的初始化位置 -- 修复版本架构切换逻辑,避免下载进程冲突 -- 修复R2和webdav的默认载入位置 -- 修复cron输入框显示 -- 修复listen-port参数写入错误 - -### ⚡ Performance - -- 优化控件提示,提升使用体验 -- 优化保留之前成功节点的逻辑 -- 优化开始检测\结束检测的按钮事件逻辑,修复bug -- 优化启动检测按钮和日志标签显示 - -### 🎨 Styling - -- 语义化控件名称 - ### ⚙️ Miscellaneous Tasks -- *(UI)* 调整界面尺寸,以适配旧设备 \ No newline at end of file +- Upgrade .NET Framework from 4.7.2 to 4.8 diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index a96d2cb..7c0da05 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace subs_check.win.gui.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.13.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/app.manifest b/app.manifest index 80e0428..5e5656b 100644 --- a/app.manifest +++ b/app.manifest @@ -1,10 +1,10 @@  - - - - - - - - - + + + + - - - - - + + - - + + - - + + - - + + - - + + - - + + - - - - - true - true - - - - + + + true + true + + + + + + - diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index dd7ca80..96ef344 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -8,13 +8,28 @@ WinExe subs_check.win.gui subs-check.win.gui - v4.7.2 + v4.8 512 true true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true AnyCPU @@ -42,6 +57,7 @@ subs_check.win.gui.Program + app.manifest @@ -160,6 +176,18 @@ + + + False + Microsoft .NET Framework 4.7.2 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + From 3bdb9a53e537b282d6c2a6aea5391467b81b7d04 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 30 Sep 2025 03:05:43 +0800 Subject: [PATCH 29/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=9B=B4=E6=96=B0=E7=AA=97=E4=BD=93=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E5=AF=BC=E8=87=B4=E9=87=8D=E5=A4=8D=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=AE=9E=E4=BE=8B=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CheckUpdates.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CheckUpdates.cs b/CheckUpdates.cs index 66efcbb..4cdc385 100644 --- a/CheckUpdates.cs +++ b/CheckUpdates.cs @@ -90,9 +90,11 @@ private async void timer1_Tick(object sender, EventArgs e) label5.Text = 当前subsCheck版本号; - MainGui mainForm = new MainGui(); - - githubProxyURL = await mainForm.GetGithubProxyUrlAsync(); + var mainForm = Application.OpenForms["MainGui"] as MainGui; + if (mainForm != null) + { + githubProxyURL = await mainForm.GetGithubProxyUrlAsync(); + } if (最新GUI版本号 != 当前GUI版本号) { From c9d3361e288d2d2e1ddb6e00ad4d81cb567b6a1d Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 30 Sep 2025 03:53:36 +0800 Subject: [PATCH 30/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90update.xml=E4=BD=BF=E7=94=A8=E4=BA=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 3 ++- MainGui.cs | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e0e9177..899e5f8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -93,11 +93,12 @@ jobs: - name: Generate update.xml run: | CURRENT_TAG="${{ steps.tags.outputs.current_tag }}" + VERSION="${CURRENT_TAG#v}" # 去掉开头的 v cat > update.xml < - ${CURRENT_TAG} + ${VERSION} https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/${CURRENT_TAG}/subs-check-win.zip https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md false diff --git a/MainGui.cs b/MainGui.cs index de73bab..4ab1717 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -124,6 +124,8 @@ private void MainGui_Shown(object sender, EventArgs e) AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent; + // AutoUpdater.Mandatory = true; + // AutoUpdater.UpdateMode = Mode.Forced; AutoUpdater.Icon = Properties.Resources.download; AutoUpdater.ShowRemindLaterButton = false; AutoUpdater.ReportErrors = true; From d9b444b18a14c2e800d51105e401516494cfae51 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 30 Sep 2025 04:31:24 +0800 Subject: [PATCH 31/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91=E5=92=8CUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 5 +- CHANGELOG.md | 38 ++++++++++- CheckUpdates.Designer.cs | 115 +++++++++++++++++++--------------- CheckUpdates.cs | 111 ++++++++++++++++++-------------- Properties/Settings.settings | 7 --- cliff.toml | 12 ++-- 6 files changed, 176 insertions(+), 112 deletions(-) delete mode 100644 Properties/Settings.settings diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 899e5f8..768712e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,9 +28,10 @@ jobs: - name: Package artifact run: | + shopt -s extglob mkdir -p release - cp -r bin/Release/*.exe bin/Release/*.dll release/ - # 由于使用了 AutoUpdater, 故需要将 runtimes 和 zh 目录也打包 + cp -r bin/Release/*.exe release/ + cp -r bin/Release/!(*.Wpf).dll release/ cp -r bin/Release/runtimes release/ cp -r bin/Release/zh release/ shell: bash diff --git a/CHANGELOG.md b/CHANGELOG.md index 2599e15..e48efd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,39 @@ -## [2.3.0.0] - 2025-09-29 +# 📝 Changelog -### ⚙️ Miscellaneous Tasks +[2.3.0.0] - 2025-09-30 +🚀 Features + +- 添加检测流水线并发设置 +- 添加32\64位内核切换 +- 添加高并发内核/原版切换 +- 支持流水线分阶段自适应并发检测 +- 支持流水线分段高并发模式,增强位置标签,大幅提高性能 +- 添加AutoUpdater,优化GUI自动更新,修复部分进度显示 + +🐛 Bug Fixes + +- 修复saveMethod group的初始化位置 +- 修复版本架构切换逻辑,避免下载进程冲突 +- 修复R2和webdav的默认载入位置 +- 修复cron输入框显示 +- 修复listen-port参数写入错误 +- 修复检查更新窗体错误引用导致重复创建实例的错误 +- 修复生成update.xml使用了错误的version + +⚡ Performance + +- 优化控件提示,提升使用体验 +- 优化保留之前成功节点的逻辑 +- 优化开始检测\结束检测的按钮事件逻辑,修复bug +- 优化启动检测按钮和日志标签显示 +- 优化检查更新逻辑和UI + +🎨 Styling + +- 语义化控件名称 + +⚙️ Miscellaneous Tasks + +- *(UI)* 调整界面尺寸,以适配旧设备 - Upgrade .NET Framework from 4.7.2 to 4.8 diff --git a/CheckUpdates.Designer.cs b/CheckUpdates.Designer.cs index 97dcaa1..fc1a6b5 100644 --- a/CheckUpdates.Designer.cs +++ b/CheckUpdates.Designer.cs @@ -32,13 +32,13 @@ private void InitializeComponent() this.groupBox1 = new System.Windows.Forms.GroupBox(); this.label4 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); - this.button1 = new System.Windows.Forms.Button(); + this.buttonUpdateGUI = new System.Windows.Forms.Button(); this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.label5 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); - this.button2 = new System.Windows.Forms.Button(); + this.buttonUpdateCore = new System.Windows.Forms.Button(); this.label7 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label(); this.timer1 = new System.Windows.Forms.Timer(this.components); @@ -51,60 +51,67 @@ private void InitializeComponent() // this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.button1); + this.groupBox1.Controls.Add(this.buttonUpdateGUI); this.groupBox1.Controls.Add(this.label2); this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Location = new System.Drawing.Point(22, 21); + this.groupBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(144, 89); + this.groupBox1.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox1.Size = new System.Drawing.Size(264, 156); this.groupBox1.TabIndex = 0; this.groupBox1.TabStop = false; - this.groupBox1.Text = "SubsCheck Win GUI"; + this.groupBox1.Text = "GUI 程序"; // // label4 // this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(77, 37); + this.label4.Location = new System.Drawing.Point(141, 65); + this.label4.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(53, 12); + this.label4.Size = new System.Drawing.Size(98, 21); this.label4.TabIndex = 4; this.label4.Text = "v0.0.0.0"; // // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(77, 17); + this.label3.Location = new System.Drawing.Point(141, 30); + this.label3.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(53, 12); + this.label3.Size = new System.Drawing.Size(98, 21); this.label3.TabIndex = 3; this.label3.Text = "v0.0.0.0"; // - // button1 + // buttonUpdateGUI // - this.button1.Enabled = false; - this.button1.Location = new System.Drawing.Point(8, 57); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(122, 23); - this.button1.TabIndex = 2; - this.button1.Text = "正在获取版本"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); + this.buttonUpdateGUI.Enabled = false; + this.buttonUpdateGUI.Location = new System.Drawing.Point(15, 100); + this.buttonUpdateGUI.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonUpdateGUI.Name = "buttonUpdateGUI"; + this.buttonUpdateGUI.Size = new System.Drawing.Size(224, 40); + this.buttonUpdateGUI.TabIndex = 2; + this.buttonUpdateGUI.Text = "正在获取版本"; + this.buttonUpdateGUI.UseVisualStyleBackColor = true; + this.buttonUpdateGUI.Click += new System.EventHandler(this.button1_Click); // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(10, 37); + this.label2.Location = new System.Drawing.Point(18, 65); + this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(65, 12); + this.label2.Size = new System.Drawing.Size(115, 21); this.label2.TabIndex = 1; this.label2.Text = "当前版本:"; // // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(10, 17); + this.label1.Location = new System.Drawing.Point(18, 30); + this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(65, 12); + this.label1.Size = new System.Drawing.Size(115, 21); this.label1.TabIndex = 0; this.label1.Text = "最新版本:"; // @@ -112,12 +119,14 @@ private void InitializeComponent() // this.groupBox2.Controls.Add(this.label5); this.groupBox2.Controls.Add(this.label6); - this.groupBox2.Controls.Add(this.button2); + this.groupBox2.Controls.Add(this.buttonUpdateCore); this.groupBox2.Controls.Add(this.label7); this.groupBox2.Controls.Add(this.label8); - this.groupBox2.Location = new System.Drawing.Point(162, 12); + this.groupBox2.Location = new System.Drawing.Point(297, 21); + this.groupBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(144, 89); + this.groupBox2.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox2.Size = new System.Drawing.Size(264, 156); this.groupBox2.TabIndex = 5; this.groupBox2.TabStop = false; this.groupBox2.Text = "Subs-Check 内核"; @@ -125,73 +134,81 @@ private void InitializeComponent() // label5 // this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(77, 37); + this.label5.Location = new System.Drawing.Point(141, 65); + this.label5.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(53, 12); + this.label5.Size = new System.Drawing.Size(98, 21); this.label5.TabIndex = 4; this.label5.Text = "v0.0.0.0"; // // label6 // this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(77, 17); + this.label6.Location = new System.Drawing.Point(141, 30); + this.label6.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(53, 12); + this.label6.Size = new System.Drawing.Size(94, 21); this.label6.TabIndex = 3; this.label6.Text = "正在获取"; // - // button2 + // buttonUpdateCore // - this.button2.Enabled = false; - this.button2.Location = new System.Drawing.Point(8, 57); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(122, 23); - this.button2.TabIndex = 2; - this.button2.Text = "正在获取版本"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); + this.buttonUpdateCore.Enabled = false; + this.buttonUpdateCore.Location = new System.Drawing.Point(15, 100); + this.buttonUpdateCore.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonUpdateCore.Name = "buttonUpdateCore"; + this.buttonUpdateCore.Size = new System.Drawing.Size(224, 40); + this.buttonUpdateCore.TabIndex = 2; + this.buttonUpdateCore.Text = "正在获取版本"; + this.buttonUpdateCore.UseVisualStyleBackColor = true; + this.buttonUpdateCore.Click += new System.EventHandler(this.button2_Click); // // label7 // this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(10, 37); + this.label7.Location = new System.Drawing.Point(18, 65); + this.label7.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(65, 12); + this.label7.Size = new System.Drawing.Size(115, 21); this.label7.TabIndex = 1; this.label7.Text = "当前版本:"; // // label8 // this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(10, 17); + this.label8.Location = new System.Drawing.Point(18, 30); + this.label8.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(65, 12); + this.label8.Size = new System.Drawing.Size(115, 21); this.label8.TabIndex = 0; this.label8.Text = "最新版本:"; // // timer1 // + this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // // comboBox1 // this.comboBox1.FormattingEnabled = true; - this.comboBox1.Location = new System.Drawing.Point(12, 107); + this.comboBox1.Location = new System.Drawing.Point(22, 187); + this.comboBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(294, 20); + this.comboBox1.Size = new System.Drawing.Size(536, 29); this.comboBox1.TabIndex = 23; this.comboBox1.Visible = false; // // CheckUpdates // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(319, 138); + this.ClientSize = new System.Drawing.Size(585, 242); this.Controls.Add(this.comboBox1); this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "CheckUpdates"; @@ -212,13 +229,13 @@ private void InitializeComponent() private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label3; - private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button buttonUpdateGUI; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label6; - private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button buttonUpdateCore; private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label8; private System.Windows.Forms.Timer timer1; diff --git a/CheckUpdates.cs b/CheckUpdates.cs index 4cdc385..541493f 100644 --- a/CheckUpdates.cs +++ b/CheckUpdates.cs @@ -34,36 +34,36 @@ public CheckUpdates() { InitializeComponent(); //注册自动更新订阅事件 - AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; + //AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; } - //自定义检查更新事件 - private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) - { - if (args.Error == null) - { - if (args.IsUpdateAvailable) - { - // 如果你想显示标准更新窗口,请取消下面这行的注释 - AutoUpdater.ShowUpdateForm(args); - } - } - else - { - if (args.Error is WebException) - { - MessageBox.Show( - @"无法连接到更新服务器。请检查您的网络连接并稍后重试。", - @"更新检查失败", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - else - { - MessageBox.Show(args.Error.Message, - args.Error.GetType().ToString(), MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } + ////自定义检查更新事件 + //private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) + //{ + // if (args.Error == null) + // { + // if (args.IsUpdateAvailable) + // { + // // 如果你想显示标准更新窗口,请取消下面这行的注释 + // AutoUpdater.ShowUpdateForm(args); + // } + // } + // else + // { + // if (args.Error is WebException) + // { + // MessageBox.Show( + // @"无法连接到更新服务器。请检查您的网络连接并稍后重试。", + // @"更新检查失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + // } + // else + // { + // MessageBox.Show(args.Error.Message, + // args.Error.GetType().ToString(), MessageBoxButtons.OK, + // MessageBoxIcon.Error); + // } + // } + //} protected override void OnLoad(EventArgs e) { @@ -90,6 +90,15 @@ private async void timer1_Tick(object sender, EventArgs e) label5.Text = 当前subsCheck版本号; + if (EnableHighConcurrent) + { + groupBox2.Text = "Subs-Check 性能内核"; + } + else + { + groupBox2.Text = "Subs-Check 原版内核"; + } + var mainForm = Application.OpenForms["MainGui"] as MainGui; if (mainForm != null) { @@ -102,28 +111,21 @@ private async void timer1_Tick(object sender, EventArgs e) string upgradeExePath = System.IO.Path.Combine(Application.StartupPath, "Upgrade.exe"); if (System.IO.File.Exists(upgradeExePath)) { - button1.Text = "立即更新"; - button1.Enabled = true; + buttonUpdateGUI.Text = "立即更新"; + buttonUpdateGUI.Enabled = true; } else { - button1.Text = "AutoUpdate"; - button1.Enabled = false; - // 使用AutoUpdater进行更新检查 - //AutoUpdater.Mandatory = true; - //AutoUpdater.UpdateMode = Mode.Forced; - AutoUpdater.SetOwner(CheckUpdates.ActiveForm); - AutoUpdater.Icon = Resources.download; - AutoUpdater.ShowRemindLaterButton = false; - AutoUpdater.ReportErrors = true; - AutoUpdater.HttpUserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; - AutoUpdater.Start("https://ghproxy.net/raw.githubusercontent.com/sinspired/subsCheck-Win-GUI/master/update.xml"); + buttonUpdateGUI.Text = "立即更新 GUI"; + buttonUpdateGUI.Enabled = true; + buttonUpdateGUI.ForeColor = System.Drawing.Color.Green; + } } else { - button1.Text = "已是最新版本"; - button1.Enabled = false; + buttonUpdateGUI.Text = "已是最新版本"; + buttonUpdateGUI.Enabled = false; } // 根据并发参数选择仓库 @@ -249,14 +251,14 @@ private async void timer1_Tick(object sender, EventArgs e) label6.Text = latestVersion; if (当前subsCheck版本号 != latestVersion) { - button2.ForeColor = System.Drawing.Color.Green; - button2.Text = "立即更新"; - button2.Enabled = true; + buttonUpdateCore.ForeColor = System.Drawing.Color.Green; + buttonUpdateCore.Text = "立即更新"; + buttonUpdateCore.Enabled = true; } else { - button2.Text = "已是最新版本"; - button2.Enabled = false; + buttonUpdateCore.Text = "已是最新版本"; + buttonUpdateCore.Enabled = false; } } @@ -317,6 +319,19 @@ private void button2_Click(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e) { + if (buttonUpdateGUI.Text == "立即更新 GUI") + { + // 使用AutoUpdater进行更新检查 + //AutoUpdater.Mandatory = true; + //AutoUpdater.UpdateMode = Mode.Forced; + AutoUpdater.SetOwner(CheckUpdates.ActiveForm); + AutoUpdater.Icon = Resources.download; + AutoUpdater.ShowRemindLaterButton = false; + AutoUpdater.ReportErrors = true; + AutoUpdater.HttpUserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; + AutoUpdater.Start("https://ghproxy.net/raw.githubusercontent.com/sinspired/subsCheck-Win-GUI/master/update.xml"); + return; + } //下载链接 string downloadURL = $"{githubProxyURL}https://github.com/cmliu/SubsCheck-Win-GUI/releases/download/{最新GUI版本号}/SubsCheck_Win_GUI.zip"; //目标文件 diff --git a/Properties/Settings.settings b/Properties/Settings.settings deleted file mode 100644 index 3964565..0000000 --- a/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/cliff.toml b/cliff.toml index b278c49..5596a83 100644 --- a/cliff.toml +++ b/cliff.toml @@ -3,16 +3,20 @@ [changelog] +# template for the changelog header +header = """ +# 📝 Changelog\n +""" # A Tera template to be rendered for each release in the changelog. # See https://keats.github.io/tera/docs/#introduction body = """ {% if version %}\ - ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} + [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ - ## [unreleased] + [unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} - ### {{ group | striptags | trim | upper_first }} + {{ group | striptags | trim | upper_first }} {% for commit in commits %} - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ {% if commit.breaking %}[**breaking**] {% endif %}\ @@ -80,7 +84,7 @@ filter_commits = false # An array of link parsers for extracting external references, and turning them into URLs, using regex. link_parsers = [] # Include only the tags that belong to the current branch. -use_branch_tags = false +use_branch_tags = true # Order releases topologically instead of chronologically. topo_order = false # Order releases topologically instead of chronologically. From 307852a24d0dda3e3fd10592c12cffee6a7ddbe9 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 30 Sep 2025 15:11:18 +0800 Subject: [PATCH 32/92] =?UTF-8?q?chore(build):=20=E4=BC=98=E5=8C=96msbuild?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=EF=BC=8C=E6=B7=BB=E5=8A=A0PostBuildCleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 21 +++++++++++---------- subs-check.win.gui.csproj | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 768712e..068815c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -26,21 +26,22 @@ jobs: - name: Build project run: msbuild subs-check.win.gui.csproj /p:Configuration=Release - - name: Package artifact - run: | - shopt -s extglob - mkdir -p release - cp -r bin/Release/*.exe release/ - cp -r bin/Release/!(*.Wpf).dll release/ - cp -r bin/Release/runtimes release/ - cp -r bin/Release/zh release/ - shell: bash + # 由于 subs-check.win.gui.csproj 的 PostBuildCleanup 目标会删除不必要的文件,因此这里直接打包 bin/Release 目录下的内容即可 + # - name: Package artifact + # run: | + # shopt -s extglob + # mkdir -p release + # cp -r bin/Release/*.exe release/ + # cp -r bin/Release/!(*.Wpf).dll release/ + # cp -r bin/Release/runtimes release/ + # cp -r bin/Release/zh release/ + # shell: bash - name: Upload artifact uses: actions/upload-artifact@v4 with: name: subs-check-win - path: release/ + path: bin/release/ if-no-files-found: error # 如果没有文件,报错 release: diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index 96ef344..90ca50b 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -61,6 +61,28 @@ app.manifest + + + + + + + + + + + + + + + + + + + packages\Autoupdater.NET.Official.1.9.2\lib\net462\AutoUpdater.NET.dll From 8962956ec00e0e8be098fd301525b4f4b4b67da3 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 30 Sep 2025 17:15:46 +0800 Subject: [PATCH 33/92] =?UTF-8?q?chore(doc):=20=E4=BF=AE=E6=94=B9readme?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0GUI=E7=95=8C=E9=9D=A2=E6=88=AA?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++++++++++-------- gui.png | Bin 40833 -> 306318 bytes 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2b72784..46e5e4e 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,16 @@ # 🚀 SubsCheck-Win-GUI + 首先声明,这款软件并非我原创开发。Subs-Check是由 [bestruirui](https://github.com/bestruirui/BestSub) 原创、由 [beck-8](https://github.com/beck-8/subs-check) 进行二次开发,而我所编写的 GUI 仅是在这两位开发者的原始版本基础上进行的 **二次开发**。 +> ✨ 修复界面模糊,支持高DPI缩放,增加自适应高并发内核切换,增加`i386/64`位内核切换,优化自动更新,增加了新的参数设置项。 +> 内核新增功能详见:[sinspired](https://github.com/sinspired/subs-check) 。 + - **视频教程:[永久免费0门槛!小白也有无限高速代理节点!](https://youtu.be/sS9Tuf1PCyc)** - **数字签名:[关于项目报毒说明](https://www.youtube.com/watch?v=4906t5zygAE&t=123s)** - **Telegram交流群:[@CMLiussss](https://t.me/CMLiussss)** # ⚠️ 免责声明 + 本项目仅供学习、研究与安全测试使用,请勿用于任何非法活动。使用前请确保您已了解并遵守所在地的法律法规。 ### 📋 使用条款 @@ -26,6 +31,7 @@ ![GUI](./gui.png) ## 🖥️ 系统要求 + - **操作系统**: Windows 10/11 (32位/64位) - **.NET 框架**: .NET Framework 4.7.2 或更高版本 @@ -40,23 +46,27 @@ - **webdav**:将结果保存到 webdav 服务器 [配置方法](https://github.com/beck-8/subs-check/blob/master/doc/webdav.md) ## 📦 关于 Github Proxy + - **Github Proxy**:本项目使用了 `Github Proxy` 来加速 GUI 必要内容的加载。 + > [!Tip] -> 你也可以通过 https://github.com/cmliu/CF-Workers-GitHub 项目来搭建自己专属的 **Github Proxy**。 +> 你也可以通过 项目来搭建自己专属的 **Github Proxy**。 ## 📁 GUI 文件结构 + ```shell subs-check.win.gui.exe # GUI本体 subs-check.exe # subs-check x86_32位 内核本体  subs-check_Windows_i386.zip # subs-check x86_32位 内核压缩包  -Upgrade.exe # 升级程序 -Upgrade.ini # 升级配置文件 +# Upgrade.exe # 升级程序(已使用AutoUpdater替换) +# Upgrade.ini # 升级配置文件(已使用AutoUpdater替换) config ├─ config.yaml # subs-check 配置文件  └─ more.yaml # 补充YAML参数配置文件  output ├─ ACL4SSR_Online_Full.yaml # ACL4SSR_Online_Full.yaml 覆写配置文件 - ├─ all.yaml # yaml格式 测试结果 + ├─ all.yaml # yaml格式 上次成功测试结果 + ├─ history.yaml # yaml格式 历次成功测试结果 ├─ base64.txt # base64格式 测试结果 ├─ bdg.yaml # 布丁狗的订阅转换.yaml 覆写配置文件 ├─ mihomo.yaml # clash订阅文件 带分流规则 @@ -66,17 +76,24 @@ output ├─ sub-store.json # sub-store json文件 └─ sub-store.log # sub-store 日志 Newtonsoft.Json.dll # 验证版本信息组件 -Newtonsoft.Json.xml # 验证版本信息组件 YamlDotNet.dll # yaml读写组件 -YamlDotNet.xml # yaml读写组件 +# AutoUpdater 依赖和语言支持 +AutoUpdater.NET.dll +Microsoft.Web.WebView2.Core.dll +Microsoft.Web.WebView2.WinForms.dll +runtimes\ +zh\ # 中文语言包 ``` ## ⭐ Star 星星走起 + [![Stargazers over time](https://starchart.cc/cmliu/SubsCheck-Win-GUI.svg?variant=adaptive)](https://starchart.cc/cmliu/SubsCheck-Win-GUI) ## 💻 已适配客户端 - - [v2rayN](https://github.com/2dust/v2rayN) - - [mihomo-party](https://github.com/mihomo-party-org/mihomo-party),[FlClash](https://github.com/chen08209/FlClash),[clash-verge-rev](https://github.com/clash-verge-rev/clash-verge-rev),[Clash Nyanpasu](https://github.com/keiko233/clash-nyanpasu) + +- [v2rayN](https://github.com/2dust/v2rayN) +- [mihomo-party](https://github.com/mihomo-party-org/mihomo-party),[FlClash](https://github.com/chen08209/FlClash),[clash-verge-rev](https://github.com/clash-verge-rev/clash-verge-rev),[Clash Nyanpasu](https://github.com/keiko233/clash-nyanpasu) # 🙏 致谢 + [beck-8](https://github.com/beck-8/subs-check)、[bestruirui](https://github.com/bestruirui/BestSub)、[Sub-Store](https://github.com/sub-store-org/Sub-Store)、GPT diff --git a/gui.png b/gui.png index adea5b1ce34122f728c8199fec406e5e1265ecab..42c015b970f9521e2ae8225747b03e6b93864581 100644 GIT binary patch literal 306318 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 QwQiE9R$_m+NO>f!5Lg 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%0DaAyXdd{-tEWW=(=5?LN4x1M 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

=Rp7T!_ti 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 Cil8|F literal 40833 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 BUIhRE From 193bbc073a710e35c55b0f9c146124c0a36ed1ad Mon Sep 17 00:00:00 2001 From: sinspired Date: Sat, 4 Oct 2025 14:30:09 +0800 Subject: [PATCH 34/92] =?UTF-8?q?fix(build):=20=E4=BF=AE=E5=A4=8D32=20?= =?UTF-8?q?=E4=BD=8D=E8=BF=9B=E7=A8=8B=E6=97=A0=E6=B3=95=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=2064=20=E4=BD=8D=E8=BF=9B=E7=A8=8B=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 54 ++++++++++++++++++++++---------------- Properties/AssemblyInfo.cs | 4 +-- subs-check.win.gui.csproj | 15 ++++------- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 4ab1717..8bf15d0 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -13,7 +13,7 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; - +using System.Management; using AutoUpdaterDotNET; using Newtonsoft.Json.Linq; @@ -53,7 +53,7 @@ public MainGui() { InitializeComponent(); this.Shown += MainGui_Shown; - + originalNotifyIcon = notifyIcon1.Icon; toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。\n\n如启用高并发而未单独设置分段并发数,将使用该值计算自适应并发数.\n启用高并发后,此值可安全设置,下载速度会被限制在一个较小的值,同时加快检测速度"); @@ -2523,9 +2523,7 @@ private void numericUpDownWebUIPort_ValueChanged(object sender, EventArgs e) } } - ///

- /// 异步检测并强制终止所有程序目录下的output\node.exe进程 - /// + private async Task KillNodeProcessAsync() { try @@ -2536,7 +2534,7 @@ private async Task KillNodeProcessAsync() string executablePath = Path.GetDirectoryName(Application.ExecutablePath); string nodeExePath = Path.Combine(executablePath, "output", "node.exe"); - // 获取所有node.exe进程 + // 获取所有 node.exe 进程 Process[] nodeProcesses = Process.GetProcessesByName("node"); if (nodeProcesses.Length == 0) @@ -2553,24 +2551,13 @@ private async Task KillNodeProcessAsync() { try { - // 使用Task.Run将可能耗时的操作放在后台线程执行 - string processPath = await Task.Run(() => - { - try - { - return process.MainModule?.FileName; - } - catch (Exception) - { - return null; - } - }); + // 使用 WMI 获取进程路径,避免 32/64 位访问冲突 + string processPath = await Task.Run(() => GetProcessPathByWmi(process.Id)); - // 检查是否匹配我们要查找的node.exe路径 + // 检查是否匹配我们要查找的 node.exe 路径 if (!string.IsNullOrEmpty(processPath) && processPath.Equals(nodeExePath, StringComparison.OrdinalIgnoreCase)) { - // 找到匹配的进程,终止它 Log($"发现匹配路径的 node.exe 进程(ID: {process.Id}),正在强制结束...", GetRichTextBoxAllLog()); await Task.Run(() => @@ -2585,7 +2572,6 @@ await Task.Run(() => } catch (Exception ex) { - // 访问进程信息时可能会因为权限问题抛出异常 Log($"访问或终止进程(ID: {process.Id})时出错: {ex.Message}", GetRichTextBoxAllLog(), true); } } @@ -2605,6 +2591,30 @@ await Task.Run(() => } } + /// + /// 使用 WMI 获取指定进程的可执行文件路径 + /// 这样可以避免 32 位进程访问 64 位进程 MainModule 时的异常 + /// + private string GetProcessPathByWmi(int processId) + { + try + { + using (var searcher = new ManagementObjectSearcher( + $"SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = {processId}")) + { + foreach (ManagementObject obj in searcher.Get()) + { + return obj["ExecutablePath"]?.ToString(); + } + } + } + catch + { + // 忽略异常,返回 null + } + return null; + } + private async void textBoxSubsUrls_DoubleClick(object sender, EventArgs e) { if (textBoxSubsUrls.Enabled) @@ -3797,7 +3807,7 @@ private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArgs e) { bool EnableHighConcurrent = checkBoxHighConcurrent.Checked; - + // 先进行控件切换 SwitchHighConcurrentLayout(EnableHighConcurrent); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 1b3c96f..951597a 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.3.0.0")] -[assembly: AssemblyFileVersion("2.3.0.0")] +[assembly: AssemblyVersion("2.3.0.1")] +[assembly: AssemblyFileVersion("2.3.0.1")] diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index 90ca50b..0b4b887 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -15,6 +15,7 @@ + false publish\ true Disk @@ -27,7 +28,6 @@ true 0 1.0.0.%2a - false false true @@ -40,6 +40,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -61,28 +62,21 @@ app.manifest - - + - - + - - packages\Autoupdater.NET.Official.1.9.2\lib\net462\AutoUpdater.NET.dll @@ -104,6 +98,7 @@ + From 5d78dff661b3be3804883273052274ec052615e8 Mon Sep 17 00:00:00 2001 From: sinspired Date: Sat, 4 Oct 2025 15:29:24 +0800 Subject: [PATCH 35/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8E=9F?= =?UTF-8?q?=E7=89=88=E5=86=85=E6=A0=B8=E4=BF=9D=E7=95=99=E4=B8=8A=E6=AC=A1?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E8=8A=82=E7=82=B9=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 8bf15d0..74ae8cf 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -836,7 +836,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 var seen = new HashSet(StringComparer.OrdinalIgnoreCase); string allyamlFilePath = System.IO.Path.Combine(executablePath, "output", "all.yaml"); - if (System.IO.File.Exists(allyamlFilePath) && checkBoxEnableWebUI.Checked) + if (System.IO.File.Exists(allyamlFilePath) && checkBoxKeepSucced.Checked && !checkBoxHighConcurrent.Checked) { string succedProxiesUrl = $"http://127.0.0.1:{Convert.ToInt32(numericUpDownWebUIPort.Value)}/all.yaml#KeepSucced"; string succedProxiesUrlKey = succedProxiesUrl.Split('#')[0]; @@ -848,8 +848,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 } else { - checkBoxKeepSucced.Checked = true; - Log("将于第二次自动运行时加载上次测试结果。", GetRichTextBoxAllLog()); + Log("不加载上次测试结果。", GetRichTextBoxAllLog()); } if (!string.IsNullOrWhiteSpace(textBoxSubsUrls.Text)) From 58cb40f905bee725af3a564af1071738fd828037 Mon Sep 17 00:00:00 2001 From: sinspired Date: Sun, 5 Oct 2025 17:00:10 +0800 Subject: [PATCH 36/92] =?UTF-8?q?chore(ui):=20=E4=BF=AE=E6=94=B9=E5=90=AF?= =?UTF-8?q?=E7=94=A8WebUI=20API=E5=AF=86=E9=92=A5=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 0b82a24..83f0e31 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -682,13 +682,13 @@ private void InitializeComponent() // // groupBoxAdvanceSettings // + this.groupBoxAdvanceSettings.Controls.Add(this.textBoxWebUiAPIKey); this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxKeepSucced); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownTotalBandwidthLimit); this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxTotalBandwidthLimit); this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadMb); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownDownloadMb); this.groupBoxAdvanceSettings.Controls.Add(this.buttonMoreSettings); - this.groupBoxAdvanceSettings.Controls.Add(this.textBoxWebUiAPIKey); this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableWebUI); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSuccessLimit); this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableSuccessLimit); @@ -819,9 +819,9 @@ private void InitializeComponent() this.checkBoxEnableWebUI.Location = new System.Drawing.Point(16, 173); this.checkBoxEnableWebUI.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBoxEnableWebUI.Name = "checkBoxEnableWebUI"; - this.checkBoxEnableWebUI.Size = new System.Drawing.Size(240, 25); + this.checkBoxEnableWebUI.Size = new System.Drawing.Size(239, 25); this.checkBoxEnableWebUI.TabIndex = 28; - this.checkBoxEnableWebUI.Text = "启用WebUI API密钥:"; + this.checkBoxEnableWebUI.Text = "自定义 WebUI 密钥:"; this.checkBoxEnableWebUI.UseVisualStyleBackColor = true; this.checkBoxEnableWebUI.CheckedChanged += new System.EventHandler(this.checkBoxEnableWebUI_CheckedChanged); // From 2c5f8836ef7b9be6421d29e9b2828eba1cdba266 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 6 Oct 2025 12:51:39 +0800 Subject: [PATCH 37/92] =?UTF-8?q?feat:=20=E8=87=AA=E5=8A=A8=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E8=AE=BE=E7=BD=AE=E7=B3=BB=E7=BB=9F=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E4=B8=8E=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增系统代理自动检测与设置功能,支持手动配置代理地址,并在日志中记录检测结果。调整界面布局,新增多个控件(如 `comboBoxSysProxy`、`comboBoxSpeedtestUrl` 等)以支持更丰富的功能。优化控件事件处理逻辑,提升用户体验。 重构代理相关逻辑至 `Proxy` 类,便于维护与扩展。修复控件初始化顺序问题,优化代理检测并发逻辑,提升性能。更新资源文件与项目文件,新增 `toolTip1` 提示信息支持。 --- MainGui.Designer.cs | 553 ++++++++++++++++++++----------------- MainGui.cs | 184 +++++++++++- MainGui.resx | 3 + Properties/AssemblyInfo.cs | 4 +- Proxy.cs | 158 +++++++++++ subs-check.win.gui.csproj | 1 + 6 files changed, 644 insertions(+), 259 deletions(-) create mode 100644 Proxy.cs diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 83f0e31..95329ea 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -65,28 +65,30 @@ private void InitializeComponent() this.groupBoxLog = new System.Windows.Forms.GroupBox(); this.linkLabelAbout = new System.Windows.Forms.LinkLabel(); this.buttonUpdateKernel = new System.Windows.Forms.Button(); - this.richTextBoxAllLog = new System.Windows.Forms.RichTextBox(); this.labelLogNodeInfo = new System.Windows.Forms.Label(); + this.richTextBoxAllLog = new System.Windows.Forms.RichTextBox(); this.groupBoxAdvanceSettings = new System.Windows.Forms.GroupBox(); - this.checkBoxKeepSucced = new System.Windows.Forms.CheckBox(); this.numericUpDownTotalBandwidthLimit = new System.Windows.Forms.NumericUpDown(); - this.checkBoxTotalBandwidthLimit = new System.Windows.Forms.CheckBox(); - this.labelDownloadMb = new System.Windows.Forms.Label(); + this.numericUpDownSuccessLimit = new System.Windows.Forms.NumericUpDown(); this.numericUpDownDownloadMb = new System.Windows.Forms.NumericUpDown(); - this.buttonMoreSettings = new System.Windows.Forms.Button(); + this.comboBoxSysProxy = new System.Windows.Forms.ComboBox(); + this.comboBoxSpeedtestUrl = new System.Windows.Forms.ComboBox(); + this.comboBoxGithubProxyUrl = new System.Windows.Forms.ComboBox(); + this.comboBoxOverwriteUrls = new System.Windows.Forms.ComboBox(); + this.labelOverwriteUrls = new System.Windows.Forms.Label(); + this.labelDownloadMb = new System.Windows.Forms.Label(); this.textBoxWebUiAPIKey = new System.Windows.Forms.TextBox(); this.checkBoxEnableWebUI = new System.Windows.Forms.CheckBox(); - this.numericUpDownSuccessLimit = new System.Windows.Forms.NumericUpDown(); - this.checkBoxEnableSuccessLimit = new System.Windows.Forms.CheckBox(); - this.buttonCheckUpdate = new System.Windows.Forms.Button(); this.checkBoxEnableRenameNode = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); this.checkBoxEnableMediaCheck = new System.Windows.Forms.CheckBox(); - this.comboBoxOverwriteUrls = new System.Windows.Forms.ComboBox(); - this.labelOverwriteUrls = new System.Windows.Forms.Label(); - this.comboBoxGithubProxyUrl = new System.Windows.Forms.ComboBox(); + this.checkBoxKeepSucced = new System.Windows.Forms.CheckBox(); + this.checkBoxTotalBandwidthLimit = new System.Windows.Forms.CheckBox(); + this.buttonCheckUpdate = new System.Windows.Forms.Button(); + this.buttonMoreSettings = new System.Windows.Forms.Button(); this.labelGithubProxyUrl = new System.Windows.Forms.Label(); - this.comboBoxSpeedtestUrl = new System.Windows.Forms.ComboBox(); this.labelSpeedtestUrl = new System.Windows.Forms.Label(); + this.checkBoxEnableSuccessLimit = new System.Windows.Forms.CheckBox(); this.progressBarAll = new System.Windows.Forms.ProgressBar(); this.timerCopySubscriptionUrl = new System.Windows.Forms.Timer(this.components); this.groupBoxGist = new System.Windows.Forms.GroupBox(); @@ -133,8 +135,8 @@ private void InitializeComponent() this.groupBoxLog.SuspendLayout(); this.groupBoxAdvanceSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalBandwidthLimit)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDownloadMb)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSuccessLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDownloadMb)).BeginInit(); this.groupBoxGist.SuspendLayout(); this.groupBoxR2.SuspendLayout(); this.groupBoxWebdav.SuspendLayout(); @@ -518,7 +520,7 @@ private void InitializeComponent() // // numericUpDownWebUIPort // - this.numericUpDownWebUIPort.Location = new System.Drawing.Point(515, 33); + this.numericUpDownWebUIPort.Location = new System.Drawing.Point(632, 127); this.numericUpDownWebUIPort.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownWebUIPort.Maximum = new decimal(new int[] { 65535, @@ -531,7 +533,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDownWebUIPort.Name = "numericUpDownWebUIPort"; - this.numericUpDownWebUIPort.Size = new System.Drawing.Size(106, 31); + this.numericUpDownWebUIPort.Size = new System.Drawing.Size(87, 31); this.numericUpDownWebUIPort.TabIndex = 15; this.numericUpDownWebUIPort.Value = new decimal(new int[] { 8199, @@ -542,7 +544,7 @@ private void InitializeComponent() // // numericUpDownDLTimehot // - this.numericUpDownDLTimehot.Location = new System.Drawing.Point(515, 78); + this.numericUpDownDLTimehot.Location = new System.Drawing.Point(632, 79); this.numericUpDownDLTimehot.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownDLTimehot.Maximum = new decimal(new int[] { 10, @@ -555,7 +557,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDownDLTimehot.Name = "numericUpDownDLTimehot"; - this.numericUpDownDLTimehot.Size = new System.Drawing.Size(106, 31); + this.numericUpDownDLTimehot.Size = new System.Drawing.Size(87, 31); this.numericUpDownDLTimehot.TabIndex = 14; this.numericUpDownDLTimehot.Value = new decimal(new int[] { 10, @@ -566,17 +568,17 @@ private void InitializeComponent() // labelWebUIPort // this.labelWebUIPort.AutoSize = true; - this.labelWebUIPort.Location = new System.Drawing.Point(350, 37); + this.labelWebUIPort.Location = new System.Drawing.Point(465, 132); this.labelWebUIPort.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelWebUIPort.Name = "labelWebUIPort"; - this.labelWebUIPort.Size = new System.Drawing.Size(159, 21); + this.labelWebUIPort.Size = new System.Drawing.Size(170, 21); this.labelWebUIPort.TabIndex = 7; - this.labelWebUIPort.Text = "HTTP服务端口:"; + this.labelWebUIPort.Text = "HTTP 服务端口:"; // // labelDownloadTimeout // this.labelDownloadTimeout.AutoSize = true; - this.labelDownloadTimeout.Location = new System.Drawing.Point(350, 83); + this.labelDownloadTimeout.Location = new System.Drawing.Point(465, 84); this.labelDownloadTimeout.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelDownloadTimeout.Name = "labelDownloadTimeout"; this.labelDownloadTimeout.Size = new System.Drawing.Size(158, 21); @@ -585,7 +587,7 @@ private void InitializeComponent() // // numericUpDownSubStorePort // - this.numericUpDownSubStorePort.Location = new System.Drawing.Point(808, 33); + this.numericUpDownSubStorePort.Location = new System.Drawing.Point(632, 175); this.numericUpDownSubStorePort.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownSubStorePort.Maximum = new decimal(new int[] { 65535, @@ -598,7 +600,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDownSubStorePort.Name = "numericUpDownSubStorePort"; - this.numericUpDownSubStorePort.Size = new System.Drawing.Size(106, 31); + this.numericUpDownSubStorePort.Size = new System.Drawing.Size(87, 31); this.numericUpDownSubStorePort.TabIndex = 21; this.numericUpDownSubStorePort.Value = new decimal(new int[] { 8299, @@ -610,7 +612,7 @@ private void InitializeComponent() // labelSubstorePort // this.labelSubstorePort.AutoSize = true; - this.labelSubstorePort.Location = new System.Drawing.Point(632, 37); + this.labelSubstorePort.Location = new System.Drawing.Point(465, 180); this.labelSubstorePort.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelSubstorePort.Name = "labelSubstorePort"; this.labelSubstorePort.Size = new System.Drawing.Size(172, 21); @@ -622,8 +624,8 @@ private void InitializeComponent() this.groupBoxLog.CausesValidation = false; this.groupBoxLog.Controls.Add(this.linkLabelAbout); this.groupBoxLog.Controls.Add(this.buttonUpdateKernel); - this.groupBoxLog.Controls.Add(this.richTextBoxAllLog); this.groupBoxLog.Controls.Add(this.labelLogNodeInfo); + this.groupBoxLog.Controls.Add(this.richTextBoxAllLog); this.groupBoxLog.Location = new System.Drawing.Point(354, 14); this.groupBoxLog.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxLog.Name = "groupBoxLog"; @@ -656,6 +658,15 @@ private void InitializeComponent() this.buttonUpdateKernel.Visible = false; this.buttonUpdateKernel.Click += new System.EventHandler(this.buttonUpdateKernel_Click); // + // labelLogNodeInfo + // + this.labelLogNodeInfo.AutoSize = true; + this.labelLogNodeInfo.Location = new System.Drawing.Point(0, 0); + this.labelLogNodeInfo.Name = "labelLogNodeInfo"; + this.labelLogNodeInfo.Size = new System.Drawing.Size(94, 21); + this.labelLogNodeInfo.TabIndex = 22; + this.labelLogNodeInfo.Text = "实时日志"; + // // richTextBoxAllLog // this.richTextBoxAllLog.BackColor = System.Drawing.Color.WhiteSmoke; @@ -671,42 +682,35 @@ private void InitializeComponent() this.richTextBoxAllLog.Text = ""; this.richTextBoxAllLog.DoubleClick += new System.EventHandler(this.richTextBoxAllLog_DoubleClick); // - // labelLogNodeInfo - // - this.labelLogNodeInfo.AutoSize = true; - this.labelLogNodeInfo.Location = new System.Drawing.Point(0, 0); - this.labelLogNodeInfo.Name = "labelLogNodeInfo"; - this.labelLogNodeInfo.Size = new System.Drawing.Size(94, 21); - this.labelLogNodeInfo.TabIndex = 22; - this.labelLogNodeInfo.Text = "实时日志"; - // // groupBoxAdvanceSettings // - this.groupBoxAdvanceSettings.Controls.Add(this.textBoxWebUiAPIKey); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxKeepSucced); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownTotalBandwidthLimit); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxTotalBandwidthLimit); - this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadMb); - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownDownloadMb); - this.groupBoxAdvanceSettings.Controls.Add(this.buttonMoreSettings); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableWebUI); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSuccessLimit); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableSuccessLimit); - this.groupBoxAdvanceSettings.Controls.Add(this.buttonCheckUpdate); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableRenameNode); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSubStorePort); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownWebUIPort); - this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableMediaCheck); + this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownDownloadMb); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownDLTimehot); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxSysProxy); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxSpeedtestUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxGithubProxyUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.labelSubstorePort); this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxOverwriteUrls); this.groupBoxAdvanceSettings.Controls.Add(this.labelOverwriteUrls); - this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxGithubProxyUrl); - this.groupBoxAdvanceSettings.Controls.Add(this.labelGithubProxyUrl); this.groupBoxAdvanceSettings.Controls.Add(this.labelWebUIPort); - this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxSpeedtestUrl); - this.groupBoxAdvanceSettings.Controls.Add(this.labelSpeedtestUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadMb); + this.groupBoxAdvanceSettings.Controls.Add(this.textBoxWebUiAPIKey); this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadTimeout); - this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSubStorePort); - this.groupBoxAdvanceSettings.Controls.Add(this.labelSubstorePort); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableWebUI); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableRenameNode); + this.groupBoxAdvanceSettings.Controls.Add(this.label1); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableMediaCheck); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxKeepSucced); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxTotalBandwidthLimit); + this.groupBoxAdvanceSettings.Controls.Add(this.buttonCheckUpdate); + this.groupBoxAdvanceSettings.Controls.Add(this.buttonMoreSettings); + this.groupBoxAdvanceSettings.Controls.Add(this.labelGithubProxyUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.labelSpeedtestUrl); + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxEnableSuccessLimit); this.groupBoxAdvanceSettings.Location = new System.Drawing.Point(26, 792); this.groupBoxAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBoxAdvanceSettings.Name = "groupBoxAdvanceSettings"; @@ -717,20 +721,10 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.Text = "高级设置"; this.groupBoxAdvanceSettings.Visible = false; // - // checkBoxKeepSucced - // - this.checkBoxKeepSucced.AutoSize = true; - this.checkBoxKeepSucced.Location = new System.Drawing.Point(633, 173); - this.checkBoxKeepSucced.Name = "checkBoxKeepSucced"; - this.checkBoxKeepSucced.Size = new System.Drawing.Size(204, 25); - this.checkBoxKeepSucced.TabIndex = 38; - this.checkBoxKeepSucced.Text = "保留测试成功节点"; - this.checkBoxKeepSucced.UseVisualStyleBackColor = true; - // // numericUpDownTotalBandwidthLimit // this.numericUpDownTotalBandwidthLimit.Enabled = false; - this.numericUpDownTotalBandwidthLimit.Location = new System.Drawing.Point(224, 124); + this.numericUpDownTotalBandwidthLimit.Location = new System.Drawing.Point(365, 79); this.numericUpDownTotalBandwidthLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownTotalBandwidthLimit.Maximum = new decimal(new int[] { 1000, @@ -738,7 +732,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDownTotalBandwidthLimit.Name = "numericUpDownTotalBandwidthLimit"; - this.numericUpDownTotalBandwidthLimit.Size = new System.Drawing.Size(106, 31); + this.numericUpDownTotalBandwidthLimit.Size = new System.Drawing.Size(87, 31); this.numericUpDownTotalBandwidthLimit.TabIndex = 37; this.numericUpDownTotalBandwidthLimit.Value = new decimal(new int[] { 12, @@ -747,88 +741,10 @@ private void InitializeComponent() 0}); this.numericUpDownTotalBandwidthLimit.ValueChanged += new System.EventHandler(this.NumericUpDownTotalBandwidthLimit_ValueChanged); // - // checkBoxTotalBandwidthLimit - // - this.checkBoxTotalBandwidthLimit.AutoSize = true; - this.checkBoxTotalBandwidthLimit.Location = new System.Drawing.Point(17, 127); - this.checkBoxTotalBandwidthLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBoxTotalBandwidthLimit.Name = "checkBoxTotalBandwidthLimit"; - this.checkBoxTotalBandwidthLimit.Size = new System.Drawing.Size(207, 25); - this.checkBoxTotalBandwidthLimit.TabIndex = 36; - this.checkBoxTotalBandwidthLimit.Text = "带宽限制(MB/s):"; - this.checkBoxTotalBandwidthLimit.UseVisualStyleBackColor = true; - this.checkBoxTotalBandwidthLimit.CheckedChanged += new System.EventHandler(this.checkBoxTotalBandwidthLimit_CheckedChanged); - // - // labelDownloadMb - // - this.labelDownloadMb.AutoSize = true; - this.labelDownloadMb.Location = new System.Drawing.Point(350, 129); - this.labelDownloadMb.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.labelDownloadMb.Name = "labelDownloadMb"; - this.labelDownloadMb.Size = new System.Drawing.Size(159, 21); - this.labelDownloadMb.TabIndex = 31; - this.labelDownloadMb.Text = "测速大小(MB):"; - // - // numericUpDownDownloadMb - // - this.numericUpDownDownloadMb.Location = new System.Drawing.Point(515, 124); - this.numericUpDownDownloadMb.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.numericUpDownDownloadMb.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownDownloadMb.Name = "numericUpDownDownloadMb"; - this.numericUpDownDownloadMb.Size = new System.Drawing.Size(106, 31); - this.numericUpDownDownloadMb.TabIndex = 30; - this.numericUpDownDownloadMb.Value = new decimal(new int[] { - 20, - 0, - 0, - 0}); - // - // buttonMoreSettings - // - this.buttonMoreSettings.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.buttonMoreSettings.Location = new System.Drawing.Point(1126, 165); - this.buttonMoreSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.buttonMoreSettings.Name = "buttonMoreSettings"; - this.buttonMoreSettings.Size = new System.Drawing.Size(138, 40); - this.buttonMoreSettings.TabIndex = 29; - this.buttonMoreSettings.Text = "补充参数"; - this.buttonMoreSettings.UseVisualStyleBackColor = true; - this.buttonMoreSettings.Click += new System.EventHandler(this.buttonMoreSettings_Click); - // - // textBoxWebUiAPIKey - // - this.textBoxWebUiAPIKey.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxWebUiAPIKey.Enabled = false; - this.textBoxWebUiAPIKey.Location = new System.Drawing.Point(258, 170); - this.textBoxWebUiAPIKey.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.textBoxWebUiAPIKey.Name = "textBoxWebUiAPIKey"; - this.textBoxWebUiAPIKey.PasswordChar = '*'; - this.textBoxWebUiAPIKey.Size = new System.Drawing.Size(363, 31); - this.textBoxWebUiAPIKey.TabIndex = 6; - this.textBoxWebUiAPIKey.Text = "admin"; - this.textBoxWebUiAPIKey.Enter += new System.EventHandler(this.textBoxWebUiAPIKey_Enter); - this.textBoxWebUiAPIKey.Leave += new System.EventHandler(this.textBoxWebUiAPIKey_Leave); - // - // checkBoxEnableWebUI - // - this.checkBoxEnableWebUI.AutoSize = true; - this.checkBoxEnableWebUI.Location = new System.Drawing.Point(16, 173); - this.checkBoxEnableWebUI.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBoxEnableWebUI.Name = "checkBoxEnableWebUI"; - this.checkBoxEnableWebUI.Size = new System.Drawing.Size(239, 25); - this.checkBoxEnableWebUI.TabIndex = 28; - this.checkBoxEnableWebUI.Text = "自定义 WebUI 密钥:"; - this.checkBoxEnableWebUI.UseVisualStyleBackColor = true; - this.checkBoxEnableWebUI.CheckedChanged += new System.EventHandler(this.checkBoxEnableWebUI_CheckedChanged); - // // numericUpDownSuccessLimit // this.numericUpDownSuccessLimit.Enabled = false; - this.numericUpDownSuccessLimit.Location = new System.Drawing.Point(224, 78); + this.numericUpDownSuccessLimit.Location = new System.Drawing.Point(365, 31); this.numericUpDownSuccessLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownSuccessLimit.Maximum = new decimal(new int[] { 65535, @@ -841,7 +757,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDownSuccessLimit.Name = "numericUpDownSuccessLimit"; - this.numericUpDownSuccessLimit.Size = new System.Drawing.Size(106, 31); + this.numericUpDownSuccessLimit.Size = new System.Drawing.Size(87, 31); this.numericUpDownSuccessLimit.TabIndex = 22; this.numericUpDownSuccessLimit.Value = new decimal(new int[] { 100, @@ -849,97 +765,70 @@ private void InitializeComponent() 0, 0}); // - // checkBoxEnableSuccessLimit - // - this.checkBoxEnableSuccessLimit.AutoSize = true; - this.checkBoxEnableSuccessLimit.Location = new System.Drawing.Point(17, 81); - this.checkBoxEnableSuccessLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBoxEnableSuccessLimit.Name = "checkBoxEnableSuccessLimit"; - this.checkBoxEnableSuccessLimit.Size = new System.Drawing.Size(183, 25); - this.checkBoxEnableSuccessLimit.TabIndex = 27; - this.checkBoxEnableSuccessLimit.Text = "节点保存数目:"; - this.checkBoxEnableSuccessLimit.UseVisualStyleBackColor = true; - this.checkBoxEnableSuccessLimit.CheckedChanged += new System.EventHandler(this.checkBoxEnableSuccessLimit_CheckedChanged); - // - // buttonCheckUpdate - // - this.buttonCheckUpdate.BackColor = System.Drawing.SystemColors.Control; - this.buttonCheckUpdate.FlatAppearance.BorderSize = 0; - this.buttonCheckUpdate.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.buttonCheckUpdate.ForeColor = System.Drawing.SystemColors.ControlText; - this.buttonCheckUpdate.Location = new System.Drawing.Point(1276, 165); - this.buttonCheckUpdate.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.buttonCheckUpdate.Name = "buttonCheckUpdate"; - this.buttonCheckUpdate.Size = new System.Drawing.Size(138, 40); - this.buttonCheckUpdate.TabIndex = 26; - this.buttonCheckUpdate.Text = "检查更新"; - this.buttonCheckUpdate.UseVisualStyleBackColor = true; - this.buttonCheckUpdate.Click += new System.EventHandler(this.buttonCheckUpdate_Click); - // - // checkBoxEnableRenameNode - // - this.checkBoxEnableRenameNode.AutoSize = true; - this.checkBoxEnableRenameNode.Checked = true; - this.checkBoxEnableRenameNode.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxEnableRenameNode.Location = new System.Drawing.Point(17, 35); - this.checkBoxEnableRenameNode.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBoxEnableRenameNode.Name = "checkBoxEnableRenameNode"; - this.checkBoxEnableRenameNode.Size = new System.Drawing.Size(162, 25); - this.checkBoxEnableRenameNode.TabIndex = 22; - this.checkBoxEnableRenameNode.Text = "节点地址查询"; - this.checkBoxEnableRenameNode.UseVisualStyleBackColor = true; - this.checkBoxEnableRenameNode.CheckedChanged += new System.EventHandler(this.checkBoxEnableRenameNode_CheckedChanged); - // - // checkBoxEnableMediaCheck - // - this.checkBoxEnableMediaCheck.AutoSize = true; - this.checkBoxEnableMediaCheck.Location = new System.Drawing.Point(198, 35); - this.checkBoxEnableMediaCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.checkBoxEnableMediaCheck.Name = "checkBoxEnableMediaCheck"; - this.checkBoxEnableMediaCheck.Size = new System.Drawing.Size(141, 25); - this.checkBoxEnableMediaCheck.TabIndex = 25; - this.checkBoxEnableMediaCheck.Text = "流媒体检测"; - this.checkBoxEnableMediaCheck.UseVisualStyleBackColor = true; - this.checkBoxEnableMediaCheck.CheckedChanged += new System.EventHandler(this.checkBoxEnableMediaCheck_CheckedChanged); + // numericUpDownDownloadMb // - // comboBoxOverwriteUrls + this.numericUpDownDownloadMb.Location = new System.Drawing.Point(632, 31); + this.numericUpDownDownloadMb.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.numericUpDownDownloadMb.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownDownloadMb.Name = "numericUpDownDownloadMb"; + this.numericUpDownDownloadMb.Size = new System.Drawing.Size(87, 31); + this.numericUpDownDownloadMb.TabIndex = 30; + this.numericUpDownDownloadMb.Value = new decimal(new int[] { + 20, + 0, + 0, + 0}); // - this.comboBoxOverwriteUrls.FormattingEnabled = true; - this.comboBoxOverwriteUrls.Items.AddRange(new object[] { - "[内置]布丁狗的订阅转换", - "[内置]ACL4SSR_Online_Full", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/布丁狗的订阅转" + - "换.yaml", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + - "_Online_Full.yaml", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + - "_Online_Full_WithIcon.yaml", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/添加直连规则." + - "yaml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/布丁狗的订阅转换.y" + - "aml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + - "line_Full.yaml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + - "line_Full_WithIcon.yaml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/添加直连规则.yam" + - "l"}); - this.comboBoxOverwriteUrls.Location = new System.Drawing.Point(895, 125); - this.comboBoxOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBoxOverwriteUrls.Name = "comboBoxOverwriteUrls"; - this.comboBoxOverwriteUrls.Size = new System.Drawing.Size(517, 29); - this.comboBoxOverwriteUrls.TabIndex = 24; - this.comboBoxOverwriteUrls.SelectedIndexChanged += new System.EventHandler(this.comboBoxOverwriteUrls_SelectedIndexChanged); + // comboBoxSysProxy + // + this.comboBoxSysProxy.AutoCompleteCustomSource.AddRange(new string[] { + "127.0.0.1:7890", + "127.0.0.1:10808", + "127.0.0.1:10809", + "127.0.0.1:7891", + "127.0.0.1:1080", + "127.0.0.1:8080", + "127.0.0.1:443"}); + this.comboBoxSysProxy.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.comboBoxSysProxy.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList; + this.comboBoxSysProxy.FormattingEnabled = true; + this.comboBoxSysProxy.ImeMode = System.Windows.Forms.ImeMode.Close; + this.comboBoxSysProxy.Items.AddRange(new object[] { + "自动检测", + "127.0.0.1:7890", + "127.0.0.1:10808", + "127.0.0.1:10809", + "127.0.0.1:7891", + "127.0.0.1:1080", + "127.0.0.1:8080", + "127.0.0.1:443"}); + this.comboBoxSysProxy.Location = new System.Drawing.Point(848, 32); + this.comboBoxSysProxy.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSysProxy.Name = "comboBoxSysProxy"; + this.comboBoxSysProxy.Size = new System.Drawing.Size(210, 29); + this.comboBoxSysProxy.TabIndex = 39; // - // labelOverwriteUrls + // comboBoxSpeedtestUrl // - this.labelOverwriteUrls.AutoSize = true; - this.labelOverwriteUrls.Location = new System.Drawing.Point(633, 129); - this.labelOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.labelOverwriteUrls.Name = "labelOverwriteUrls"; - this.labelOverwriteUrls.Size = new System.Drawing.Size(265, 21); - this.labelOverwriteUrls.TabIndex = 23; - this.labelOverwriteUrls.Text = "Clash订阅 覆写配置文件:"; + this.comboBoxSpeedtestUrl.FormattingEnabled = true; + this.comboBoxSpeedtestUrl.Items.AddRange(new object[] { + "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + + "Waifu2x-Extension-GUI-v2.21.12-Portable.7z", + "https://github.com/2dust/v2rayN/releases/download/7.10.4/v2rayN-windows-64-deskto" + + "p.zip", + "https://github.com/VSCodium/vscodium/releases/download/1.98.0.25067/codium-1.98.0" + + ".25067-el9.aarch64.rpm"}); + this.comboBoxSpeedtestUrl.Location = new System.Drawing.Point(848, 80); + this.comboBoxSpeedtestUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxSpeedtestUrl.Name = "comboBoxSpeedtestUrl"; + this.comboBoxSpeedtestUrl.Size = new System.Drawing.Size(570, 29); + this.comboBoxSpeedtestUrl.TabIndex = 19; + this.comboBoxSpeedtestUrl.Text = "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + + "Waifu2x-Extension-GUI-v2.21.12-Portable.7z"; // // comboBoxGithubProxyUrl // @@ -1371,51 +1260,205 @@ private void InitializeComponent() "tube.20140301.xyz", "vps.pansen626.com", "wfgithub.xiaonuomi.ie.eu.org"}); - this.comboBoxGithubProxyUrl.Location = new System.Drawing.Point(1104, 33); + this.comboBoxGithubProxyUrl.Location = new System.Drawing.Point(1231, 32); this.comboBoxGithubProxyUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBoxGithubProxyUrl.Name = "comboBoxGithubProxyUrl"; - this.comboBoxGithubProxyUrl.Size = new System.Drawing.Size(308, 29); + this.comboBoxGithubProxyUrl.Size = new System.Drawing.Size(187, 29); this.comboBoxGithubProxyUrl.TabIndex = 21; this.comboBoxGithubProxyUrl.Leave += new System.EventHandler(this.comboBoxGithubProxyUrl_Leave); // + // comboBoxOverwriteUrls + // + this.comboBoxOverwriteUrls.FormattingEnabled = true; + this.comboBoxOverwriteUrls.Items.AddRange(new object[] { + "[内置]布丁狗的订阅转换", + "[内置]ACL4SSR_Online_Full", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/布丁狗的订阅转" + + "换.yaml", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + + "_Online_Full.yaml", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + + "_Online_Full_WithIcon.yaml", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/添加直连规则." + + "yaml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/布丁狗的订阅转换.y" + + "aml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + + "line_Full.yaml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + + "line_Full_WithIcon.yaml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/添加直连规则.yam" + + "l"}); + this.comboBoxOverwriteUrls.Location = new System.Drawing.Point(901, 128); + this.comboBoxOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxOverwriteUrls.Name = "comboBoxOverwriteUrls"; + this.comboBoxOverwriteUrls.Size = new System.Drawing.Size(517, 29); + this.comboBoxOverwriteUrls.TabIndex = 24; + this.comboBoxOverwriteUrls.SelectedIndexChanged += new System.EventHandler(this.comboBoxOverwriteUrls_SelectedIndexChanged); + // + // labelOverwriteUrls + // + this.labelOverwriteUrls.AutoSize = true; + this.labelOverwriteUrls.Location = new System.Drawing.Point(735, 132); + this.labelOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelOverwriteUrls.Name = "labelOverwriteUrls"; + this.labelOverwriteUrls.Size = new System.Drawing.Size(170, 21); + this.labelOverwriteUrls.TabIndex = 23; + this.labelOverwriteUrls.Text = "Clash覆写配置:"; + // + // labelDownloadMb + // + this.labelDownloadMb.AutoSize = true; + this.labelDownloadMb.Location = new System.Drawing.Point(465, 36); + this.labelDownloadMb.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelDownloadMb.Name = "labelDownloadMb"; + this.labelDownloadMb.Size = new System.Drawing.Size(159, 21); + this.labelDownloadMb.TabIndex = 31; + this.labelDownloadMb.Text = "测速大小(MB):"; + // + // textBoxWebUiAPIKey + // + this.textBoxWebUiAPIKey.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxWebUiAPIKey.Enabled = false; + this.textBoxWebUiAPIKey.Location = new System.Drawing.Point(255, 175); + this.textBoxWebUiAPIKey.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxWebUiAPIKey.Name = "textBoxWebUiAPIKey"; + this.textBoxWebUiAPIKey.PasswordChar = '*'; + this.textBoxWebUiAPIKey.Size = new System.Drawing.Size(197, 31); + this.textBoxWebUiAPIKey.TabIndex = 6; + this.textBoxWebUiAPIKey.Text = "admin"; + this.textBoxWebUiAPIKey.Enter += new System.EventHandler(this.textBoxWebUiAPIKey_Enter); + this.textBoxWebUiAPIKey.Leave += new System.EventHandler(this.textBoxWebUiAPIKey_Leave); + // + // checkBoxEnableWebUI + // + this.checkBoxEnableWebUI.AutoSize = true; + this.checkBoxEnableWebUI.Location = new System.Drawing.Point(18, 178); + this.checkBoxEnableWebUI.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableWebUI.Name = "checkBoxEnableWebUI"; + this.checkBoxEnableWebUI.Size = new System.Drawing.Size(239, 25); + this.checkBoxEnableWebUI.TabIndex = 28; + this.checkBoxEnableWebUI.Text = "自定义 WebUI 密钥:"; + this.checkBoxEnableWebUI.UseVisualStyleBackColor = true; + this.checkBoxEnableWebUI.CheckedChanged += new System.EventHandler(this.checkBoxEnableWebUI_CheckedChanged); + // + // checkBoxEnableRenameNode + // + this.checkBoxEnableRenameNode.AutoSize = true; + this.checkBoxEnableRenameNode.Checked = true; + this.checkBoxEnableRenameNode.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxEnableRenameNode.Location = new System.Drawing.Point(18, 34); + this.checkBoxEnableRenameNode.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableRenameNode.Name = "checkBoxEnableRenameNode"; + this.checkBoxEnableRenameNode.Size = new System.Drawing.Size(162, 25); + this.checkBoxEnableRenameNode.TabIndex = 22; + this.checkBoxEnableRenameNode.Text = "节点地址查询"; + this.checkBoxEnableRenameNode.UseVisualStyleBackColor = true; + this.checkBoxEnableRenameNode.CheckedChanged += new System.EventHandler(this.checkBoxEnableRenameNode_CheckedChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(735, 36); + this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(115, 21); + this.label1.TabIndex = 40; + this.label1.Text = "系统代理:"; + // + // checkBoxEnableMediaCheck + // + this.checkBoxEnableMediaCheck.AutoSize = true; + this.checkBoxEnableMediaCheck.Location = new System.Drawing.Point(18, 82); + this.checkBoxEnableMediaCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableMediaCheck.Name = "checkBoxEnableMediaCheck"; + this.checkBoxEnableMediaCheck.Size = new System.Drawing.Size(141, 25); + this.checkBoxEnableMediaCheck.TabIndex = 25; + this.checkBoxEnableMediaCheck.Text = "流媒体检测"; + this.checkBoxEnableMediaCheck.UseVisualStyleBackColor = true; + this.checkBoxEnableMediaCheck.CheckedChanged += new System.EventHandler(this.checkBoxEnableMediaCheck_CheckedChanged); + // + // checkBoxKeepSucced + // + this.checkBoxKeepSucced.AutoSize = true; + this.checkBoxKeepSucced.Location = new System.Drawing.Point(18, 130); + this.checkBoxKeepSucced.Name = "checkBoxKeepSucced"; + this.checkBoxKeepSucced.Size = new System.Drawing.Size(162, 25); + this.checkBoxKeepSucced.TabIndex = 38; + this.checkBoxKeepSucced.Text = "保留成功节点"; + this.checkBoxKeepSucced.UseVisualStyleBackColor = true; + // + // checkBoxTotalBandwidthLimit + // + this.checkBoxTotalBandwidthLimit.AutoSize = true; + this.checkBoxTotalBandwidthLimit.Location = new System.Drawing.Point(192, 82); + this.checkBoxTotalBandwidthLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxTotalBandwidthLimit.Name = "checkBoxTotalBandwidthLimit"; + this.checkBoxTotalBandwidthLimit.Size = new System.Drawing.Size(185, 25); + this.checkBoxTotalBandwidthLimit.TabIndex = 36; + this.checkBoxTotalBandwidthLimit.Text = "带宽限制MB/s:"; + this.checkBoxTotalBandwidthLimit.UseVisualStyleBackColor = true; + this.checkBoxTotalBandwidthLimit.CheckedChanged += new System.EventHandler(this.checkBoxTotalBandwidthLimit_CheckedChanged); + // + // buttonCheckUpdate + // + this.buttonCheckUpdate.BackColor = System.Drawing.SystemColors.Control; + this.buttonCheckUpdate.FlatAppearance.BorderSize = 0; + this.buttonCheckUpdate.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.buttonCheckUpdate.ForeColor = System.Drawing.SystemColors.ControlText; + this.buttonCheckUpdate.Location = new System.Drawing.Point(1280, 170); + this.buttonCheckUpdate.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonCheckUpdate.Name = "buttonCheckUpdate"; + this.buttonCheckUpdate.Size = new System.Drawing.Size(138, 40); + this.buttonCheckUpdate.TabIndex = 26; + this.buttonCheckUpdate.Text = "检查更新"; + this.buttonCheckUpdate.UseVisualStyleBackColor = true; + this.buttonCheckUpdate.Click += new System.EventHandler(this.buttonCheckUpdate_Click); + // + // buttonMoreSettings + // + this.buttonMoreSettings.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.buttonMoreSettings.Location = new System.Drawing.Point(1130, 170); + this.buttonMoreSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.buttonMoreSettings.Name = "buttonMoreSettings"; + this.buttonMoreSettings.Size = new System.Drawing.Size(138, 40); + this.buttonMoreSettings.TabIndex = 29; + this.buttonMoreSettings.Text = "补充参数"; + this.buttonMoreSettings.UseVisualStyleBackColor = true; + this.buttonMoreSettings.Click += new System.EventHandler(this.buttonMoreSettings_Click); + // // labelGithubProxyUrl // this.labelGithubProxyUrl.AutoSize = true; - this.labelGithubProxyUrl.Location = new System.Drawing.Point(926, 37); + this.labelGithubProxyUrl.Location = new System.Drawing.Point(1070, 36); this.labelGithubProxyUrl.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelGithubProxyUrl.Name = "labelGithubProxyUrl"; this.labelGithubProxyUrl.Size = new System.Drawing.Size(163, 21); this.labelGithubProxyUrl.TabIndex = 20; this.labelGithubProxyUrl.Text = "Github Proxy:"; - // - // comboBoxSpeedtestUrl - // - this.comboBoxSpeedtestUrl.FormattingEnabled = true; - this.comboBoxSpeedtestUrl.Items.AddRange(new object[] { - "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + - "Waifu2x-Extension-GUI-v2.21.12-Portable.7z", - "https://github.com/2dust/v2rayN/releases/download/7.10.4/v2rayN-windows-64-deskto" + - "p.zip", - "https://github.com/VSCodium/vscodium/releases/download/1.98.0.25067/codium-1.98.0" + - ".25067-el9.aarch64.rpm"}); - this.comboBoxSpeedtestUrl.Location = new System.Drawing.Point(741, 79); - this.comboBoxSpeedtestUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBoxSpeedtestUrl.Name = "comboBoxSpeedtestUrl"; - this.comboBoxSpeedtestUrl.Size = new System.Drawing.Size(671, 29); - this.comboBoxSpeedtestUrl.TabIndex = 19; - this.comboBoxSpeedtestUrl.Text = "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + - "Waifu2x-Extension-GUI-v2.21.12-Portable.7z"; // // labelSpeedtestUrl // this.labelSpeedtestUrl.AutoSize = true; - this.labelSpeedtestUrl.Location = new System.Drawing.Point(631, 83); + this.labelSpeedtestUrl.Location = new System.Drawing.Point(735, 84); this.labelSpeedtestUrl.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelSpeedtestUrl.Name = "labelSpeedtestUrl"; this.labelSpeedtestUrl.Size = new System.Drawing.Size(115, 21); this.labelSpeedtestUrl.TabIndex = 18; this.labelSpeedtestUrl.Text = "测速地址:"; // + // checkBoxEnableSuccessLimit + // + this.checkBoxEnableSuccessLimit.AutoSize = true; + this.checkBoxEnableSuccessLimit.Location = new System.Drawing.Point(192, 34); + this.checkBoxEnableSuccessLimit.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.checkBoxEnableSuccessLimit.Name = "checkBoxEnableSuccessLimit"; + this.checkBoxEnableSuccessLimit.Size = new System.Drawing.Size(183, 25); + this.checkBoxEnableSuccessLimit.TabIndex = 27; + this.checkBoxEnableSuccessLimit.Text = "节点限制数量:"; + this.checkBoxEnableSuccessLimit.UseVisualStyleBackColor = true; + this.checkBoxEnableSuccessLimit.CheckedChanged += new System.EventHandler(this.checkBoxEnableSuccessLimit_CheckedChanged); + // // progressBarAll // this.progressBarAll.Location = new System.Drawing.Point(0, 0); @@ -1831,8 +1874,8 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.ResumeLayout(false); this.groupBoxAdvanceSettings.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalBandwidthLimit)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDownloadMb)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSuccessLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDownloadMb)).EndInit(); this.groupBoxGist.ResumeLayout(false); this.groupBoxGist.PerformLayout(); this.groupBoxR2.ResumeLayout(false); @@ -1916,7 +1959,6 @@ private void InitializeComponent() private System.Windows.Forms.Timer timerRestartSchedule; private System.Windows.Forms.Button buttonCheckUpdate; private System.Windows.Forms.NumericUpDown numericUpDownSuccessLimit; - private System.Windows.Forms.CheckBox checkBoxEnableSuccessLimit; private System.Windows.Forms.TextBox textBoxWebUiAPIKey; private System.Windows.Forms.CheckBox checkBoxEnableWebUI; private System.Windows.Forms.Button buttonWebUi; @@ -1944,6 +1986,9 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox checkBoxEhanceTag; private System.Windows.Forms.CheckBox checkBoxDropBadCFNodes; private System.Windows.Forms.CheckBox checkBoxKeepSucced; + private System.Windows.Forms.ComboBox comboBoxSysProxy; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox checkBoxEnableSuccessLimit; } } diff --git a/MainGui.cs b/MainGui.cs index 74ae8cf..45b970f 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -6,6 +6,7 @@ using System.IO; using System.IO.Compression; using System.Linq; +using System.Management; using System.Net; using System.Net.Http; using System.Net.NetworkInformation; @@ -13,11 +14,13 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; -using System.Management; + using AutoUpdaterDotNET; using Newtonsoft.Json.Linq; +using static subs_check.win.gui.Proxy; + namespace subs_check.win.gui { public partial class MainGui : Form @@ -30,6 +33,7 @@ public partial class MainGui : Form private ToolStripMenuItem startMenuItem; private ToolStripMenuItem stopMenuItem; string githubProxyURL = ""; + string sysProxyURL = ""; int run = 0; string 当前subsCheck版本号 = "未知版本"; string currentKernel = "原版内核"; @@ -56,6 +60,7 @@ public MainGui() originalNotifyIcon = notifyIcon1.Icon; + // 设置提示信息 toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。\n\n如启用高并发而未单独设置分段并发数,将使用该值计算自适应并发数.\n启用高并发后,此值可安全设置,下载速度会被限制在一个较小的值,同时加快检测速度"); toolTip1.SetToolTip(numericUpDownInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); toolTip1.SetToolTip(labelInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); @@ -96,6 +101,7 @@ public MainGui() toolTip1.SetToolTip(textBoxSubsUrls, "节点池订阅地址:支持 Link、Base64、Clash 格式的订阅链接。"); toolTip1.SetToolTip(checkBoxEnableRenameNode, "以节点IP查询位置重命名节点。\n质量差的节点可能造成IP查询失败,造成整体检查速度稍微变慢。"); toolTip1.SetToolTip(checkBoxEnableMediaCheck, "是否开启流媒体检测,其中IP欺诈依赖'节点地址查询',内核版本需要 v2.0.8 以上\n\n示例:美国1 | ⬇️ 5.6MB/s |0%|Netflix|Disney|Openai\n风控值:0% (使用ping0.cc标准)\n流媒体解锁:Netflix、Disney、Openai"); + toolTip1.SetToolTip(comboBoxSysProxy, "系统代理设置: 适用于拉取代理、消息推送、文件上传等等。"); toolTip1.SetToolTip(comboBoxGithubProxyUrl, "GitHub 代理:代理订阅 GitHub raw 节点池。"); toolTip1.SetToolTip(comboBoxSpeedtestUrl, "测速地址:注意 并发数*节点速度<最大网速 否则测速结果不准确\n尽量不要使用Speedtest,Cloudflare提供的下载链接,因为很多节点屏蔽测速网站。"); toolTip1.SetToolTip(textBox7, "将测速结果推送到Worker的地址。"); @@ -305,6 +311,46 @@ private async void timerinitial_Tick(object sender, EventArgs e)//初始化 comboBoxSubscriptionType.Text = "通用订阅"; ReadConfig(); + //自动检测系统代理 + string configProxy = comboBoxSysProxy.Text; + SysProxyResult sysProxy = await Proxy.GetSysProxyAsync(configProxy); + + if (sysProxy.IsAvailable) + { + if (comboBoxSysProxy.Text == sysProxy.Address) + { + Log("设置系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); + } + else + { + string input = sysProxy.Address.Trim(); + + // 检查是否存在 "://" 协议部分 + int protocolIndex = input.IndexOf("://"); + if (protocolIndex >= 0) + { + // 保留 "://" 之后的内容 + input = input.Substring(protocolIndex + 3); + } + + // 检查是否存在 "/" 路径部分 + int pathIndex = input.IndexOf('/'); + if (pathIndex >= 0) + { + // 只保留 "/" 之前的域名部分 + input = input.Substring(0, pathIndex); + } + + comboBoxSysProxy.Text = input; + Log("检测到系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); + await SaveConfig(false); + } + } + else + { + Log("未发现系统代理", GetRichTextBoxAllLog()); + } + if (checkBoxHighConcurrent.Checked) { groupBoxGist.Location = new Point(groupBoxGist.Location.X, groupBoxGist.Location.Y + groupBoxPipeConcurrent.Height); @@ -455,6 +501,46 @@ private async void ReadConfig()//读取配置文件 checkBoxHighConcurrent.Checked = needHighConcurrent; + // 根据是否启用高并发,调整界面布局 + string sysproxy; + if (!checkBoxHighConcurrent.Checked) + { + sysproxy = 读取config字符串(config, "proxy"); + } + else + { + sysproxy = 读取config字符串(config, "system-proxy"); + } + if (sysproxy != null) + { + string input = sysproxy.Trim(); + + // 检查是否存在 "://" 协议部分 + int protocolIndex = input.IndexOf("://"); + if (protocolIndex >= 0) + { + // 保留 "://" 之后的内容 + input = input.Substring(protocolIndex + 3); + } + + // 检查是否存在 "/" 路径部分 + int pathIndex = input.IndexOf('/'); + if (pathIndex >= 0) + { + // 只保留 "/" 之前的域名部分 + input = input.Substring(0, pathIndex); + } + + // 更新 comboBox3 的文本 + sysproxy = input; + comboBoxSysProxy.Text = sysproxy; + } + else + { + comboBoxSysProxy.Text = "自动检测"; + } + + string switchX64 = 读取config字符串(config, "switch-x64"); if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; else checkBoxSwitchArch64.Checked = false; @@ -522,6 +608,9 @@ private async void ReadConfig()//读取配置文件 } } + // 添加GitHub代理前缀如果有 + githubProxyURL = await GetGithubProxyUrlAsync(); + string mihomoOverwriteUrl = 读取config字符串(config, "mihomo-overwrite-url"); int mihomoOverwriteUrlIndex = mihomoOverwriteUrl.IndexOf(githubRawPrefix); if (mihomoOverwriteUrl != null) @@ -699,7 +788,12 @@ private async void ReadConfig()//读取配置文件 else { comboBoxGithubProxyUrl.Text = "自动选择"; + comboBoxSysProxy.Text = "自动检测"; + // 添加GitHub代理前缀如果有 + githubProxyURL = await GetGithubProxyUrlAsync(); + comboBoxOverwriteUrls.Text = "[内置]布丁狗的订阅转换"; + } } catch (Exception ex) @@ -830,6 +924,16 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["githubproxy"] = comboBoxGithubProxyUrl.Text; config["github-proxy"] = githubProxyURL; + if (comboBoxSysProxy.Text != "自动检测") sysProxyURL = $"http://{comboBoxSysProxy.Text}"; + if (checkBoxHighConcurrent.Checked) + { + config["system-proxy"] = sysProxyURL; + } + else + { + config["proxy"] = sysProxyURL; + } + // 保存订阅列表 List subUrls = new List(); // 使用 HashSet 来快速判重(不区分大小写),只比较主干部分(去掉 fragment) @@ -1133,6 +1237,47 @@ private async void buttonStartCheck_Click(object sender, EventArgs e) buttonStartCheck.ForeColor = Color.Red; buttonStartCheck.Text = "⏹️ 停止"; toolTip1.SetToolTip(buttonStartCheck, "停止内核检测进程!"); + + // 自动检测系统代理 + string configProxy = comboBoxSysProxy.Text; + SysProxyResult sysProxy = await Proxy.GetSysProxyAsync(configProxy); + + if (sysProxy.IsAvailable) + { + if (comboBoxSysProxy.Text == sysProxy.Address) + { + Log("设置系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); + } + else + { + string input = sysProxy.Address.Trim(); + + // 检查是否存在 "://" 协议部分 + int protocolIndex = input.IndexOf("://"); + if (protocolIndex >= 0) + { + // 保留 "://" 之后的内容 + input = input.Substring(protocolIndex + 3); + } + + // 检查是否存在 "/" 路径部分 + int pathIndex = input.IndexOf('/'); + if (pathIndex >= 0) + { + // 只保留 "/" 之前的域名部分 + input = input.Substring(0, pathIndex); + } + + comboBoxSysProxy.Text = input; + Log("检测到系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); + await SaveConfig(false); + } + } + else + { + Log("未发现系统代理", GetRichTextBoxAllLog()); + } + StartSubsCheckProcess(); } } @@ -2123,6 +2268,38 @@ private void comboBox2_Leave(object sender, EventArgs e) comboBoxSpeedtestUrl.Items.Add(input); comboBoxSpeedtestUrl.Text = input; } + + private void comboBoxSysProxy_Leave(object sender, EventArgs e) + { + // 检查是否有内容 + if (string.IsNullOrWhiteSpace(comboBoxSysProxy.Text)) + { + comboBoxSysProxy.Text = "自动检测"; + return; + } + + string input = comboBoxSysProxy.Text.Trim(); + + // 检查是否存在 "://" 协议部分 + int protocolIndex = input.IndexOf("://"); + if (protocolIndex >= 0) + { + // 保留 "://" 之后的内容 + input = input.Substring(protocolIndex + 3); + } + + // 检查是否存在 "/" 路径部分 + int pathIndex = input.IndexOf('/'); + if (pathIndex >= 0) + { + // 只保留 "/" 之前的域名部分 + input = input.Substring(0, pathIndex); + } + + // 更新 comboBox3 的文本 + comboBoxSysProxy.Text = input; + } + private void comboBoxGithubProxyUrl_Leave(object sender, EventArgs e) { // 检查是否有内容 @@ -2387,6 +2564,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { // 找到可用代理 detectedProxyURL = $"https://{proxyItem}/"; + richTextBoxAllLog.Clear(); Log($"找到可用 GitHub 代理: {proxyItem}", GetRichTextBoxAllLog()); proxyFound = true; break; @@ -2792,8 +2970,8 @@ private async Task ProcessComboBox5Selection(bool 汇报Log = false) progressBarAll.Value = 0; progressBarAll.Visible = true; - // 添加GitHub代理前缀如果有 - githubProxyURL = await GetGithubProxyUrlAsync(); + //// 添加GitHub代理前缀如果有 + //githubProxyURL = await GetGithubProxyUrlAsync(); string fullDownloadUrl = githubProxyURL + downloadUrl; try diff --git a/MainGui.resx b/MainGui.resx index de7e7b4..c3120ae 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,6 +3480,9 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 + + 196, 21 + 533, 19 diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 951597a..1c6c7d9 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.3.0.1")] -[assembly: AssemblyFileVersion("2.3.0.1")] +[assembly: AssemblyVersion("2.4.0.0")] +[assembly: AssemblyFileVersion("2.4.0.0")] diff --git a/Proxy.cs b/Proxy.cs new file mode 100644 index 0000000..521f1d7 --- /dev/null +++ b/Proxy.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace subs_check.win.gui +{ + internal class Proxy + { + // 常见代理端口 + private static readonly List CommonProxies = new List + { + "http://127.0.0.1:7890", + "http://127.0.0.1:7891", + "http://127.0.0.1:1080", + "http://127.0.0.1:8080", + "http://127.0.0.1:10808", + "http://127.0.0.1:10809" + }; + + public class SysProxyResult + { + public bool IsAvailable { get; set; } + public string Address { get; set; } + } + + /// + /// 检测系统代理是否可用,并设置环境变量 + /// + public static Task GetSysProxyAsync(string configProxy) + { + return FindAvailableSysProxyAsync(configProxy, CommonProxies) + .ContinueWith(t => + { + string proxy = t.Result; + if (!string.IsNullOrEmpty(proxy)) + { + Environment.SetEnvironmentVariable("HTTP_PROXY", proxy); + Environment.SetEnvironmentVariable("HTTPS_PROXY", proxy); + + Console.WriteLine("系统代理可用: " + proxy); + return new SysProxyResult + { + IsAvailable = true, + Address = proxy + }; + } + + Console.WriteLine("未找到可用代理,将不设置代理"); + return new SysProxyResult + { + IsAvailable = false, + Address = string.Empty + }; + }); + } + + + /// + /// 检测代理是否可用(要求 Google 204 和 GitHub Raw 都成功) + /// + private static async Task IsSysProxyAvailableAsync(string proxy) + { + try + { + var proxyUri = new Uri(proxy); + var handler = new HttpClientHandler + { + Proxy = new WebProxy(proxyUri), + UseProxy = true + }; + + using (var client = new HttpClient(handler)) + { + client.Timeout = TimeSpan.FromSeconds(3); + + var testUrls = new List> + { + Tuple.Create("https://www.google.com/generate_204", HttpStatusCode.NoContent), + Tuple.Create("https://raw.githubusercontent.com/github/gitignore/main/Go.gitignore", HttpStatusCode.OK) + }; + + var tasks = new List>(); + foreach (var t in testUrls) + { + tasks.Add(Task.Run(async () => + { + try + { + var resp = await client.GetAsync(t.Item1); + return resp.StatusCode == t.Item2; + } + catch + { + return false; + } + })); + } + + var results = await Task.WhenAll(tasks); + foreach (var ok in results) + { + if (!ok) return false; + } + return true; + } + } + catch + { + return false; + } + } + + /// + /// 优先检测配置文件中的代理,不可用则并发检测常见端口 + /// + private static async Task FindAvailableSysProxyAsync(string configProxy, List candidates) + { + // Step 1: 优先检测配置文件中的代理 + if (!string.IsNullOrEmpty(configProxy) && await IsSysProxyAvailableAsync(configProxy)) + { + return configProxy; + } + + // Step 2: 并发检测候选代理 + var cts = new CancellationTokenSource(); + var tasks = new List>(); + + foreach (var p in candidates) + { + tasks.Add(Task.Run(async () => + { + if (await IsSysProxyAvailableAsync(p)) + { + cts.Cancel(); // 找到一个就取消其他任务 + return p; + } + return null; + }, cts.Token)); + } + + var allTasks = Task.WhenAll(tasks); + var completed = await Task.WhenAny(allTasks, Task.Delay(5000)); + if (completed == allTasks) + { + foreach (var t in tasks) + { + if (!string.IsNullOrEmpty(t.Result)) + return t.Result; + } + } + + return string.Empty; + } + } +} diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index 0b4b887..983f812 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -148,6 +148,7 @@ + about.cs From 372de98ecba1a18a28d19cc725de60c4eb6426a3 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 6 Oct 2025 16:59:44 +0800 Subject: [PATCH 38/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=A6=86?= =?UTF-8?q?=E5=86=99=E9=85=8D=E7=BD=AE=E5=92=8C=E5=86=85=E6=A0=B8=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E9=80=BB=E8=BE=91=EF=BC=8C=E8=87=AA=E5=8A=A8=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=B3=BB=E7=BB=9F=E4=BB=A3=E7=90=86=E6=88=96github?= =?UTF-8?q?=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 578 +++++++++++++++++++++++++---------------------------- Proxy.cs | 2 +- 2 files changed, 269 insertions(+), 311 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 45b970f..8ff903e 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -43,6 +43,10 @@ public partial class MainGui : Form private string nextCheckTime = null;// 用于存储下次检查时间 string WebUIapiKey = "CMLiussss"; int downloading = 0; + private SysProxyResult SysProxySetting; + + private static DateTime _lastGetGithubProxyRunTime = DateTime.MinValue; + private static string _lastGithubProxyUrl = null; // ——用于避免无意义的重复 UI 重绘—— private string _lastLogLabelNodeInfoText = string.Empty; @@ -56,6 +60,7 @@ public partial class MainGui : Form public MainGui() { InitializeComponent(); + this.Shown += MainGui_Shown; originalNotifyIcon = notifyIcon1.Icon; @@ -125,19 +130,20 @@ public MainGui() SetupNotifyIconContextMenu(); } - private void MainGui_Shown(object sender, EventArgs e) + private async void MainGui_Shown(object sender, EventArgs e) { + // 先检查系统代理 + await AutoCheckSysProxy(); + + // 再初始化 AutoUpdater AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent; - // AutoUpdater.Mandatory = true; - // AutoUpdater.UpdateMode = Mode.Forced; AutoUpdater.Icon = Properties.Resources.download; AutoUpdater.ShowRemindLaterButton = false; AutoUpdater.ReportErrors = true; AutoUpdater.HttpUserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; - // 注意:这里不需要 SetOwner(MainGui.ActiveForm),因为当前窗体就是 Owner AutoUpdater.Start("https://gh.39.al/raw.githubusercontent.com/sinspired/subsCheck-Win-GUI/master/update.xml"); } @@ -177,6 +183,49 @@ private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) } } + public async Task AutoCheckSysProxy(bool lognow = true) + { + // 自动检测系统代理 + string configProxy = comboBoxSysProxy.Text; + + SysProxySetting = await Proxy.GetSysProxyAsync(configProxy); + + if (SysProxySetting != null && SysProxySetting.IsAvailable) + { + if (comboBoxSysProxy.Text == SysProxySetting.Address) + { + Log("设置系统代理: " + SysProxySetting.Address, GetRichTextBoxAllLog()); + } + else + { + string input = SysProxySetting.Address?.Trim() ?? string.Empty; + + // 检查是否存在 "://" 协议部分 + int protocolIndex = input.IndexOf("://"); + if (protocolIndex >= 0) + { + input = input.Substring(protocolIndex + 3); + } + + // 检查是否存在 "/" 路径部分 + int pathIndex = input.IndexOf('/'); + if (pathIndex >= 0) + { + input = input.Substring(0, pathIndex); + } + + comboBoxSysProxy.Text = input; + Log("检测到系统代理: " + SysProxySetting.Address, GetRichTextBoxAllLog()); + + //await SaveConfig(false); + } + } + else + { + Log("未发现系统代理", GetRichTextBoxAllLog()); + } + } + //临时禁用/恢复控件重绘 [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); @@ -309,47 +358,8 @@ private async void timerinitial_Tick(object sender, EventArgs e)//初始化 this.Text = 标题;// + " TG:CMLiussss BY:CM喂饭 干货满满"; comboBoxSaveMethod.Text = "本地"; comboBoxSubscriptionType.Text = "通用订阅"; - ReadConfig(); - - //自动检测系统代理 - string configProxy = comboBoxSysProxy.Text; - SysProxyResult sysProxy = await Proxy.GetSysProxyAsync(configProxy); - - if (sysProxy.IsAvailable) - { - if (comboBoxSysProxy.Text == sysProxy.Address) - { - Log("设置系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); - } - else - { - string input = sysProxy.Address.Trim(); - // 检查是否存在 "://" 协议部分 - int protocolIndex = input.IndexOf("://"); - if (protocolIndex >= 0) - { - // 保留 "://" 之后的内容 - input = input.Substring(protocolIndex + 3); - } - - // 检查是否存在 "/" 路径部分 - int pathIndex = input.IndexOf('/'); - if (pathIndex >= 0) - { - // 只保留 "/" 之前的域名部分 - input = input.Substring(0, pathIndex); - } - - comboBoxSysProxy.Text = input; - Log("检测到系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); - await SaveConfig(false); - } - } - else - { - Log("未发现系统代理", GetRichTextBoxAllLog()); - } + ReadConfig(); if (checkBoxHighConcurrent.Checked) { @@ -540,7 +550,6 @@ private async void ReadConfig()//读取配置文件 comboBoxSysProxy.Text = "自动检测"; } - string switchX64 = 读取config字符串(config, "switch-x64"); if (switchX64 != null && switchX64 == "true") checkBoxSwitchArch64.Checked = true; else checkBoxSwitchArch64.Checked = false; @@ -608,8 +617,9 @@ private async void ReadConfig()//读取配置文件 } } - // 添加GitHub代理前缀如果有 - githubProxyURL = await GetGithubProxyUrlAsync(); + //// 添加GitHub代理前缀如果有 + //githubProxyURL = await GetGithubProxyUrlAsync(); + //await AutoCheckSysProxy(); string mihomoOverwriteUrl = 读取config字符串(config, "mihomo-overwrite-url"); int mihomoOverwriteUrlIndex = mihomoOverwriteUrl.IndexOf(githubRawPrefix); @@ -620,12 +630,12 @@ private async void ReadConfig()//读取配置文件 if (mihomoOverwriteUrl.EndsWith("bdg.yaml", StringComparison.OrdinalIgnoreCase)) { comboBoxOverwriteUrls.Text = "[内置]布丁狗的订阅转换"; - await ProcessComboBox5Selection(); + await comboBoxOverwriteUrlsSelection(); } else if (mihomoOverwriteUrl.EndsWith("ACL4SSR_Online_Full.yaml", StringComparison.OrdinalIgnoreCase)) { comboBoxOverwriteUrls.Text = "[内置]ACL4SSR_Online_Full"; - await ProcessComboBox5Selection(); + await comboBoxOverwriteUrlsSelection(); } } else if (mihomoOverwriteUrlIndex > 0) comboBoxOverwriteUrls.Text = mihomoOverwriteUrl.Substring(mihomoOverwriteUrlIndex); @@ -789,8 +799,6 @@ private async void ReadConfig()//读取配置文件 { comboBoxGithubProxyUrl.Text = "自动选择"; comboBoxSysProxy.Text = "自动检测"; - // 添加GitHub代理前缀如果有 - githubProxyURL = await GetGithubProxyUrlAsync(); comboBoxOverwriteUrls.Text = "[内置]布丁狗的订阅转换"; @@ -1012,9 +1020,11 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 Directory.CreateDirectory(outputFolderPath); } + //await AutoCheckSysProxy(); + // 确定文件完整路径 downloadFilePath = Path.Combine(outputFolderPath, fileName); - if (!File.Exists(downloadFilePath)) await ProcessComboBox5Selection(); + if (!File.Exists(downloadFilePath)) await comboBoxOverwriteUrlsSelection(); // 检查文件是否存在 if (!File.Exists(downloadFilePath)) @@ -1027,6 +1037,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 Log($"{displayName} 覆写配置文件 加载成功。", GetRichTextBoxAllLog()); config["mihomo-overwrite-url"] = $"http://127.0.0.1:{numericUpDownWebUIPort.Value}/{fileName}"; } + } else if (comboBoxOverwriteUrls.Text.StartsWith(githubRawPrefix)) config["mihomo-overwrite-url"] = githubProxyURL + comboBoxOverwriteUrls.Text; else config["mihomo-overwrite-url"] = comboBoxOverwriteUrls.Text != "" ? comboBoxOverwriteUrls.Text : $"http://127.0.0.1:{numericUpDownWebUIPort.Value}/ACL4SSR_Online_Full.yaml"; @@ -1238,46 +1249,7 @@ private async void buttonStartCheck_Click(object sender, EventArgs e) buttonStartCheck.Text = "⏹️ 停止"; toolTip1.SetToolTip(buttonStartCheck, "停止内核检测进程!"); - // 自动检测系统代理 - string configProxy = comboBoxSysProxy.Text; - SysProxyResult sysProxy = await Proxy.GetSysProxyAsync(configProxy); - - if (sysProxy.IsAvailable) - { - if (comboBoxSysProxy.Text == sysProxy.Address) - { - Log("设置系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); - } - else - { - string input = sysProxy.Address.Trim(); - - // 检查是否存在 "://" 协议部分 - int protocolIndex = input.IndexOf("://"); - if (protocolIndex >= 0) - { - // 保留 "://" 之后的内容 - input = input.Substring(protocolIndex + 3); - } - - // 检查是否存在 "/" 路径部分 - int pathIndex = input.IndexOf('/'); - if (pathIndex >= 0) - { - // 只保留 "/" 之前的域名部分 - input = input.Substring(0, pathIndex); - } - - comboBoxSysProxy.Text = input; - Log("检测到系统代理: " + sysProxy.Address, GetRichTextBoxAllLog()); - await SaveConfig(false); - } - } - else - { - Log("未发现系统代理", GetRichTextBoxAllLog()); - } - + await AutoCheckSysProxy(); StartSubsCheckProcess(); } } @@ -1357,8 +1329,8 @@ public async Task DownloadSubsCheckEXE() return; } - // 每次下载前获取 githubproxy - githubProxyURL = await GetGithubProxyUrlAsync(); + //检测系统代理 + await AutoCheckSysProxy(); var result = await 获取版本号(apiUrl, true); if (result.Item1 == "未知版本") @@ -1431,117 +1403,81 @@ public async Task DownloadSubsCheckEXE() return; } - // 处理代理链接里可能嵌套 https:// 的情况 - string 代理下载链接 = githubProxyURL + downloadUrl; - string 原生下载链接 = 代理下载链接; - // 计算"https://"在下载链接中出现的次数 - int httpsCount = 0; - int lastIndex = -1; - int currentIndex = 0; - - // 查找所有"https://"出现的位置 - while ((currentIndex = 代理下载链接.IndexOf("https://", currentIndex)) != -1) - { - httpsCount++; - lastIndex = currentIndex; - currentIndex += 8; // "https://".Length = 8 - } - - // 如果"https://"出现2次或以上,提取最后一个"https://"之后的内容 - if (httpsCount >= 2 && lastIndex != -1) - { - 原生下载链接 = 代理下载链接.Substring(lastIndex); - } - string executablePath = Path.GetDirectoryName(Application.ExecutablePath); - // 创建下载请求 - 优化的多级尝试下载逻辑 - Log("开始下载文件...", GetRichTextBoxAllLog()); - bool downloadSuccess = false; string zipFilePath = Path.Combine(executablePath, desiredAssetName); - string failureReason = ""; // 如果文件已存在,先删除 if (File.Exists(zipFilePath)) File.Delete(zipFilePath); - // 第一次尝试:使用代理下载链接 + 当前HttpClient(不使用系统代理) - try - { - Log($"[尝试1/4] 使用代理下载链接:{代理下载链接}", GetRichTextBoxAllLog()); - downloadSuccess = await DownloadFileAsync(client, 代理下载链接, zipFilePath); - } - catch (Exception ex) + Log("开始下载内核文件...", GetRichTextBoxAllLog()); + + // 定义策略列表(延迟获取 Proxy URL) + var strategies = new List>>(); + + // 如果系统代理可用,先加一个策略 + if (SysProxySetting.IsAvailable) { - Log($"[尝试1/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); - failureReason = ex.Message; + strategies.Add(() => Task.FromResult(("系统代理 + 原生下载链接", true, downloadUrl))); } - // 如果第一次尝试失败,且代理链接与原生链接不同,使用原生下载链接尝试 - if (!downloadSuccess && 代理下载链接 != 原生下载链接) + // 需要异步的才用 async/await + strategies.Add(async () => { - try - { - Log($"[尝试2/4] 使用原生下载链接:{原生下载链接}", GetRichTextBoxAllLog()); - downloadSuccess = await DownloadFileAsync(client, 原生下载链接, zipFilePath); - } - catch (Exception ex) - { - Log($"[尝试2/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); - failureReason = ex.Message; - } - } + githubProxyURL = await GetGithubProxyUrlAsync(); + return ("直连 GitHub Proxy 链接", false, githubProxyURL + downloadUrl); + }); - // 如果前面的尝试都失败,创建使用系统代理的HttpClient再次尝试 - if (!downloadSuccess) + // 无代理 + 原生链接 + strategies.Add(() => Task.FromResult(("无代理 + 原生下载链接", false, downloadUrl))); + + // 总尝试次数 + int totalTries = strategies.Count; + + bool downloadSuccess = false; + string failureReason = ""; + + for (int i = 0; i < totalTries && !downloadSuccess; i++) { + var (desc, useSysProxy, url) = await strategies[i](); + try { - Log("[尝试3/4] 使用系统代理 + 代理下载链接", GetRichTextBoxAllLog()); - using (HttpClient proxyClient = new HttpClient()) + Log($"[尝试{i + 1}/{totalTries}] {desc} => {url}", GetRichTextBoxAllLog()); + + using (HttpClient httpClient = new HttpClient(new HttpClientHandler + { + UseProxy = useSysProxy, + Proxy = useSysProxy ? WebRequest.DefaultWebProxy : null + })) { - proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - proxyClient.Timeout = TimeSpan.FromSeconds(30); + httpClient.DefaultRequestHeaders.UserAgent.ParseAdd( + "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); + httpClient.Timeout = TimeSpan.FromSeconds(30); - downloadSuccess = await DownloadFileAsync(proxyClient, 代理下载链接, zipFilePath); + downloadSuccess = await DownloadFileWithProgressAsync(httpClient, url, zipFilePath); } } catch (Exception ex) { - Log($"[尝试3/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); failureReason = ex.Message; - } - - // 最后一次尝试:使用系统代理 + 原生链接(如果不同) - if (!downloadSuccess && 代理下载链接 != 原生下载链接) - { - try - { - Log("[尝试4/4] 使用系统代理 + 原生下载链接", GetRichTextBoxAllLog()); - using (HttpClient proxyClient = new HttpClient()) - { - proxyClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - proxyClient.Timeout = TimeSpan.FromSeconds(30); - - downloadSuccess = await DownloadFileAsync(proxyClient, 原生下载链接, zipFilePath); - } - } - catch (Exception ex) - { - Log($"[尝试4/4] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); - failureReason = ex.Message; - } + Log($"[尝试{i + 1}/{totalTries}] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); } } + // 如果所有尝试失败 if (!downloadSuccess) { Log($"所有下载尝试均失败,最后错误: {failureReason}", GetRichTextBoxAllLog(), true); - MessageBox.Show($"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", + MessageBox.Show( + $"下载 subs-check.exe 失败,请检查网络连接后重试。\n\n可尝试更换 Github Proxy 后,点击「检查更新」>「更新内核」。\n或前往 {releasesPageUrl} 自行下载!", "下载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + progressBarAll.Value = 0; progressBarAll.Visible = false; return; } + // 下载成功 -> 解压并查找 subs-check.exe Log("下载完成,正在解压文件...", GetRichTextBoxAllLog()); // 解压文件 @@ -1746,6 +1682,7 @@ private async void StartSubsCheckProcess() // 重置进度条 progressBarAll.Value = 0; progressBarAll.Visible = true; + progressBarAll.Enabled = true; labelLogNodeInfo.Text = "实时日志"; using (MemoryStream ms = new MemoryStream(Properties.Resources.going)) { @@ -2650,12 +2587,12 @@ private async void buttonUpdateKernel_Click(object sender, EventArgs e) Log("未找到现有的 subs-check.exe 文件,将直接下载最新版本", GetRichTextBoxAllLog()); } - // 检测可用的 GitHub 代理 - githubProxyURL = await GetGithubProxyUrlAsync(); - if (githubProxyURL == "") - { - Log("未设置 GitHub 代理,将尝试直接下载", GetRichTextBoxAllLog(), true); - } + //// 检测可用的 GitHub 代理 + //githubProxyURL = await GetGithubProxyUrlAsync(); + //if (githubProxyURL == "") + //{ + // Log("未设置 GitHub 代理,将尝试直接下载", GetRichTextBoxAllLog(), true); + //} // 下载最新版本的 subs-check.exe await DownloadSubsCheckEXE(); @@ -2927,127 +2864,162 @@ private void checkBoxTotalBandwidthLimit_CheckedChanged(object sender, EventArgs private async void comboBoxOverwriteUrls_SelectedIndexChanged(object sender, EventArgs e) { - if (comboBoxOverwriteUrls.Text.Contains("[内置]")) await ProcessComboBox5Selection(true); + if (comboBoxOverwriteUrls.Text.Contains("[内置]")) await comboBoxOverwriteUrlsSelection(true); } - private async Task ProcessComboBox5Selection(bool 汇报Log = false) + private async Task comboBoxOverwriteUrlsSelection(bool 汇报Log = false) { // 确定文件名和下载URL - string fileName; - string downloadFilePath; - string downloadUrl; - string displayName; - string executablePath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); + string fileName, downloadUrl, displayName; + string executablePath = Path.GetDirectoryName(Application.ExecutablePath); + if (comboBoxOverwriteUrls.Text.Contains("[内置]布丁狗")) { fileName = "bdg.yaml"; displayName = "[内置]布丁狗的订阅转换"; downloadUrl = "https://raw.githubusercontent.com/cmliu/ACL4SSR/main/yaml/bdg.yaml"; } - else // [内置]ACL4SSR + else { fileName = "ACL4SSR_Online_Full.yaml"; displayName = "[内置]ACL4SSR_Online_Full"; downloadUrl = "https://raw.githubusercontent.com/beck-8/override-hub/main/yaml/ACL4SSR_Online_Full.yaml"; } - // 确保output文件夹存在 string outputFolderPath = Path.Combine(executablePath, "output"); - if (!Directory.Exists(outputFolderPath)) + Directory.CreateDirectory(outputFolderPath); + + string downloadFilePath = Path.Combine(outputFolderPath, fileName); + + if (File.Exists(downloadFilePath)) { - Directory.CreateDirectory(outputFolderPath); + if (汇报Log) Log($"{displayName} 覆写配置文件 已就绪。", GetRichTextBoxAllLog()); + return; } - // 确定文件完整路径 - downloadFilePath = Path.Combine(outputFolderPath, fileName); + Log($"{displayName} 覆写配置文件 未找到,正在下载...", GetRichTextBoxAllLog()); + progressBarAll.Value = 0; + progressBarAll.Visible = true; + + bool success = false; + string lastError = ""; - // 检查文件是否存在 - if (!File.Exists(downloadFilePath)) + // 定义策略列表(延迟获取 Proxy URL) + var strategies = new List>>(); + + // 需要异步的才用 async/await + strategies.Add(async () => { - Log($"{displayName} 覆写配置文件 未找到,正在下载...", GetRichTextBoxAllLog()); + githubProxyURL = await GetGithubProxyUrlAsync(); + return ("直连 GitHub Proxy 链接", false, githubProxyURL + downloadUrl); + }); - // 重置进度条 - progressBarAll.Value = 0; - progressBarAll.Visible = true; + await AutoCheckSysProxy(); + // 如果系统代理可用,先加一个策略 + if (SysProxySetting.IsAvailable) + { + strategies.Add(() => Task.FromResult(("系统代理 + 原生下载链接", true, downloadUrl))); + } - //// 添加GitHub代理前缀如果有 - //githubProxyURL = await GetGithubProxyUrlAsync(); - string fullDownloadUrl = githubProxyURL + downloadUrl; + + // 无代理 + 原生链接 + strategies.Add(() => Task.FromResult(("无代理 + 原生下载链接", false, downloadUrl))); + + + // 总尝试次数 + int totalTries = strategies.Count; + + for (int i = 0; i < totalTries && !success; i++) + { + var (desc, useSysProxy, url) = await strategies[i](); try { - // 创建不使用系统代理的HttpClientHandler - using (HttpClientHandler handler = new HttpClientHandler { UseProxy = false, Proxy = null }) + //Log($"[尝试{i + 1}/{totalTries}] {desc} => {url}", GetRichTextBoxAllLog()); + + using (HttpClientHandler handler = new HttpClientHandler + { + UseProxy = useSysProxy, + Proxy = useSysProxy ? WebRequest.DefaultWebProxy : null + }) using (HttpClient client = new HttpClient(handler)) { - client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - client.Timeout = TimeSpan.FromSeconds(15); // 设置15秒超时 + client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86)"); + client.Timeout = TimeSpan.FromSeconds(15); - // 先获取文件大小 - HttpResponseMessage headResponse = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, fullDownloadUrl)); - long totalBytes = headResponse.Content.Headers.ContentLength ?? 0; + success = await DownloadFileWithProgressAsync(client, url, downloadFilePath); + } + } + catch (Exception ex) + { + lastError = ex.Message; + Log($"[尝试{i + 1}/{totalTries}] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); + } + } - // 如果无法获取文件大小,显示不确定进度 - if (totalBytes == 0) - { - Console.WriteLine($"无法获取 {displayName} 文件大小,将显示不确定进度"); - } + progressBarAll.Visible = false; + if (!success) + { + Log($"{displayName} 覆写配置文件 下载失败: {lastError}", GetRichTextBoxAllLog(), true); + } + else + { + Log($"{displayName} 覆写配置文件 下载成功", GetRichTextBoxAllLog()); + } + } - // 创建下载请求并获取响应流 - using (var response = await client.GetAsync(fullDownloadUrl, HttpCompletionOption.ResponseHeadersRead)) - { - if (response.IsSuccessStatusCode) - { - using (var contentStream = await response.Content.ReadAsStreamAsync()) - using (var fileStream = new FileStream(downloadFilePath, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true)) - { - byte[] buffer = new byte[8192]; - long totalBytesRead = 0; - int bytesRead; + /// + /// 下载文件并更新进度条 + /// + private async Task DownloadFileWithProgressAsync(HttpClient httpClient, string url, string filePath) + { + try + { + // 获取文件大小 + HttpResponseMessage headResponse = await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, url)); + headResponse.EnsureSuccessStatusCode(); // 确保请求成功 + long totalBytes = headResponse.Content.Headers.ContentLength ?? 0; - while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0) - { - await fileStream.WriteAsync(buffer, 0, bytesRead); - totalBytesRead += bytesRead; - - // 更新进度条 - if (totalBytes > 0) - { - int progressPercentage = (int)((totalBytesRead * 100) / totalBytes); - // 确保进度值在有效范围内 (0-100) - progressPercentage = Math.Min(100, Math.Max(0, progressPercentage)); - progressBarAll.Value = progressPercentage; - } - } + // 下载文件 + using (var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)) + { + response.EnsureSuccessStatusCode(); // 确保请求成功 - // 确保进度条显示100% - progressBarAll.Value = 100; - } - progressBarAll.Visible = false; - Log($"{displayName} 覆写配置文件 下载成功", GetRichTextBoxAllLog()); - } - else + using (var contentStream = await response.Content.ReadAsStreamAsync()) + using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true)) + { + byte[] buffer = new byte[8192]; + long totalBytesRead = 0; + int bytesRead; + + while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0) + { + await fileStream.WriteAsync(buffer, 0, bytesRead); + totalBytesRead += bytesRead; + + // 更新进度条 + if (totalBytes > 0) { - progressBarAll.Visible = false; - Log($"{displayName} 覆写配置文件 下载失败: HTTP {(int)response.StatusCode} {response.ReasonPhrase}", GetRichTextBoxAllLog(), true); + int progressPercentage = (int)((totalBytesRead * 100) / totalBytes); + progressPercentage = Math.Min(100, Math.Max(0, progressPercentage)); + progressBarAll.Enabled = true; + progressBarAll.Visible = true; + progressBarAll.Value = progressPercentage; } } } } - catch (Exception ex) - { - Log($"{displayName} 覆写配置文件 下载失败: {ex.Message}", GetRichTextBoxAllLog(), true); - // 出错时重置进度条 - progressBarAll.Value = 0; - progressBarAll.Visible = false; - } + progressBarAll.Value = 0; + progressBarAll.Visible = false; + return true; // 下载成功 } - else + catch { - if (汇报Log) Log($"{displayName} 覆写配置文件 已就绪。", GetRichTextBoxAllLog()); + throw; // 重新抛出异常,让调用者处理 } } + private void numericUpDownConcurrent_ValueChanged(object sender, EventArgs e) { if (checkBoxHighConcurrent.Checked) @@ -3223,6 +3195,8 @@ private async void timerRefresh_Tick(object sender, EventArgs e) if (进度条百分比 < 0) 进度条百分比 = 0; if (进度条百分比 > 100) 进度条百分比 = 100; + progressBarAll.Enabled = true; + progressBarAll.Visible = true; progressBarAll.Value = 进度条百分比; if (!buttonTriggerCheck.Enabled) buttonTriggerCheck.Enabled = true; @@ -3249,7 +3223,7 @@ private async void timerRefresh_Tick(object sender, EventArgs e) //labelLogNodeInfo.Text = $"{nextCheckTime}"; //labelLogNodeInfo.ForeColor = Color.Green; - progressBarAll.Value = 100; + progressBarAll.Visible = false; string idleNotify = "SubsCheck: 已就绪\n" + nextCheckTime; @@ -3293,6 +3267,8 @@ private async void buttonTriggerCheck_Click(object sender, EventArgs e) buttonTriggerCheck.ForeColor = HexToRgbColor("#00BFFF"); //labelLogNodeInfo.Text = $"启动检测"; labelLogNodeInfo.ForeColor = Color.Black; + + await AutoCheckSysProxy(); isSuccess = await SendApiRequestAsync("/api/trigger-check", "发送手动检查信号"); if (isSuccess) { @@ -3652,54 +3628,6 @@ private string GetComputerNameMD5() } } - // 添加辅助下载方法 - async Task DownloadFileAsync(HttpClient httpClient, string url, string filePath) - { - try - { - // 获取文件大小 - HttpResponseMessage headResponse = await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, url)); - headResponse.EnsureSuccessStatusCode(); // 确保请求成功 - long totalBytes = headResponse.Content.Headers.ContentLength ?? 0; - - // 下载文件 - using (var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)) - { - response.EnsureSuccessStatusCode(); // 确保请求成功 - - using (var contentStream = await response.Content.ReadAsStreamAsync()) - using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true)) - { - byte[] buffer = new byte[8192]; - long totalBytesRead = 0; - int bytesRead; - - while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0) - { - await fileStream.WriteAsync(buffer, 0, bytesRead); - totalBytesRead += bytesRead; - - // 更新进度条 - if (totalBytes > 0) - { - int progressPercentage = (int)((totalBytesRead * 100) / totalBytes); - progressPercentage = Math.Min(100, Math.Max(0, progressPercentage)); - progressBarAll.Visible = true; - progressBarAll.Value = progressPercentage; - } - } - } - } - progressBarAll.Value = 0; - progressBarAll.Visible = false; - return true; // 下载成功 - } - catch - { - throw; // 重新抛出异常,让调用者处理 - } - } - private static about aboutWindow = null; private void linkLabelAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { @@ -3922,25 +3850,55 @@ private void numericUpDownTimeout_ValueChanged(object sender, EventArgs e) } - // 获取 githubproxy 地址 + // 获取 githubproxy 地址(带 30 分钟间隔限制) public async Task GetGithubProxyUrlAsync() { const string AUTO = "自动选择"; if (comboBoxGithubProxyUrl == null) return githubProxyURL; - // 如已指定githubproxy,直接返回结果 + // 如果上次运行时间距今不足 30 分钟,直接返回上次结果(若有) + if (_lastGithubProxyUrl != null && (DateTime.Now - _lastGetGithubProxyRunTime).TotalMinutes < 30) + { + Log($"GitHub Proxy:{_lastGithubProxyUrl}", GetRichTextBoxAllLog()); + return _lastGithubProxyUrl; + } + + // 如已指定 githubproxy,直接返回结果 var text = (comboBoxGithubProxyUrl.Text ?? ""); - if (text != AUTO && text.Length > 0) return $"https://{text}/"; + if (text != AUTO && text.Length > 0) + { + _lastGithubProxyUrl = $"https://{text}/"; + _lastGetGithubProxyRunTime = DateTime.Now; + return _lastGithubProxyUrl; + } + // 随机候选列表 var candidates = comboBoxGithubProxyUrl.Items .OfType() .Where(s => !string.IsNullOrWhiteSpace(s) && s != AUTO) .OrderBy(_ => Guid.NewGuid()) .ToList(); - if (!candidates.Any()) return githubProxyURL; - try { var detected = await DetectGitHubProxyAsync(candidates); return string.IsNullOrWhiteSpace(detected) ? githubProxyURL : detected; } - catch { return githubProxyURL; } + if (!candidates.Any()) + { + _lastGithubProxyUrl = githubProxyURL; + _lastGetGithubProxyRunTime = DateTime.Now; + return _lastGithubProxyUrl; + } + + try + { + var detected = await DetectGitHubProxyAsync(candidates); + _lastGithubProxyUrl = string.IsNullOrWhiteSpace(detected) ? githubProxyURL : detected; + } + catch + { + _lastGithubProxyUrl = githubProxyURL; + } + + // 更新最后运行时间 + _lastGetGithubProxyRunTime = DateTime.Now; + return _lastGithubProxyUrl; } // 切换高并发内核和原版内核设置项 diff --git a/Proxy.cs b/Proxy.cs index 521f1d7..060b713 100644 --- a/Proxy.cs +++ b/Proxy.cs @@ -74,7 +74,7 @@ private static async Task IsSysProxyAvailableAsync(string proxy) using (var client = new HttpClient(handler)) { - client.Timeout = TimeSpan.FromSeconds(3); + client.Timeout = TimeSpan.FromSeconds(10); var testUrls = new List> { From cf94e4a1b40f59de2a34f9c90cb4bc24e97f7b61 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 6 Oct 2025 18:05:59 +0800 Subject: [PATCH 39/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E7=AD=96=E7=95=A5=E3=80=81=E9=81=BF=E5=85=8D=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 104 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 39 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 8ff903e..807676e 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -130,10 +130,10 @@ public MainGui() SetupNotifyIconContextMenu(); } - private async void MainGui_Shown(object sender, EventArgs e) + private void MainGui_Shown(object sender, EventArgs e) { // 先检查系统代理 - await AutoCheckSysProxy(); + //await AutoCheckSysProxy(); // 再初始化 AutoUpdater AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; @@ -617,10 +617,6 @@ private async void ReadConfig()//读取配置文件 } } - //// 添加GitHub代理前缀如果有 - //githubProxyURL = await GetGithubProxyUrlAsync(); - //await AutoCheckSysProxy(); - string mihomoOverwriteUrl = 读取config字符串(config, "mihomo-overwrite-url"); int mihomoOverwriteUrlIndex = mihomoOverwriteUrl.IndexOf(githubRawPrefix); if (mihomoOverwriteUrl != null) @@ -1020,8 +1016,6 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 Directory.CreateDirectory(outputFolderPath); } - //await AutoCheckSysProxy(); - // 确定文件完整路径 downloadFilePath = Path.Combine(outputFolderPath, fileName); if (!File.Exists(downloadFilePath)) await comboBoxOverwriteUrlsSelection(); @@ -2501,7 +2495,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { // 找到可用代理 detectedProxyURL = $"https://{proxyItem}/"; - richTextBoxAllLog.Clear(); + //richTextBoxAllLog.Clear(); Log($"找到可用 GitHub 代理: {proxyItem}", GetRichTextBoxAllLog()); proxyFound = true; break; @@ -2901,41 +2895,80 @@ private async Task comboBoxOverwriteUrlsSelection(bool 汇报Log = false) progressBarAll.Value = 0; progressBarAll.Visible = true; - bool success = false; - string lastError = ""; - - // 定义策略列表(延迟获取 Proxy URL) - var strategies = new List>>(); + // 优先尝试 GitHub 带来,再尝试系统代理,最后使用无代理直连 + var (success, lastError) = await TryDownloadWithStrategiesAsync( + downloadUrl, + downloadFilePath, + new[] { DownloadStrategy.GithubProxy, DownloadStrategy.SystemProxy, DownloadStrategy.Direct }); - // 需要异步的才用 async/await - strategies.Add(async () => + if (!success) { - githubProxyURL = await GetGithubProxyUrlAsync(); - return ("直连 GitHub Proxy 链接", false, githubProxyURL + downloadUrl); - }); - - await AutoCheckSysProxy(); - // 如果系统代理可用,先加一个策略 - if (SysProxySetting.IsAvailable) + Log($"{displayName} 覆写配置文件 下载失败: {lastError}", GetRichTextBoxAllLog(), true); + } + else { - strategies.Add(() => Task.FromResult(("系统代理 + 原生下载链接", true, downloadUrl))); + //richTextBoxAllLog.Clear(); + Log($"{displayName} 覆写配置文件 下载成功", GetRichTextBoxAllLog()); } + } + /// + /// 下载策略 + /// + enum DownloadStrategy + { + GithubProxy, + SystemProxy, + Direct + } + private async Task<(bool success, string lastError)> TryDownloadWithStrategiesAsync( + string downloadUrl, + string downloadFilePath, + IEnumerable strategyOrder) + { + bool success = false; + string lastError = ""; - // 无代理 + 原生链接 - strategies.Add(() => Task.FromResult(("无代理 + 原生下载链接", false, downloadUrl))); + // 策略映射表 + var strategyFuncs = new Dictionary>>() + { + [DownloadStrategy.GithubProxy] = async () => + { + string githubProxyURL = await GetGithubProxyUrlAsync(); + if (githubProxyURL == "") + { + return (false, null); // null 表示跳过 + } + return (false, githubProxyURL + downloadUrl); + }, + [DownloadStrategy.SystemProxy] = async () => + { + await AutoCheckSysProxy(); + return SysProxySetting.IsAvailable ? (true, downloadUrl) : (true, null); // null 表示跳过 + }, + [DownloadStrategy.Direct] = () => Task.FromResult((false, downloadUrl)) + }; + var strategies = new List(); - // 总尝试次数 + foreach (var s in strategyOrder) + { + var (useSysProxy, url) = await strategyFuncs[s](); + if (url != null) + { + strategies.Add(s); + } + } int totalTries = strategies.Count; for (int i = 0; i < totalTries && !success; i++) { - var (desc, useSysProxy, url) = await strategies[i](); + var strategy = strategies[i]; try { - //Log($"[尝试{i + 1}/{totalTries}] {desc} => {url}", GetRichTextBoxAllLog()); + var (useSysProxy, url) = await strategyFuncs[strategy](); + //Log($"[尝试{i + 1}/{totalTries}] 使用 {strategy} 下载", GetRichTextBoxAllLog(), true); using (HttpClientHandler handler = new HttpClientHandler { @@ -2953,21 +2986,14 @@ private async Task comboBoxOverwriteUrlsSelection(bool 汇报Log = false) catch (Exception ex) { lastError = ex.Message; - Log($"[尝试{i + 1}/{totalTries}] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); + Log($"[尝试{i + 1}/{totalTries}] 使用 {strategy} 下载失败: {ex.Message}", GetRichTextBoxAllLog(), true); } } - progressBarAll.Visible = false; - if (!success) - { - Log($"{displayName} 覆写配置文件 下载失败: {lastError}", GetRichTextBoxAllLog(), true); - } - else - { - Log($"{displayName} 覆写配置文件 下载成功", GetRichTextBoxAllLog()); - } + return (success, lastError); } + /// /// 下载文件并更新进度条 /// From a681eb323b60e868047de859a6d54302bf6fee0b Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 7 Oct 2025 02:32:50 +0800 Subject: [PATCH 40/92] =?UTF-8?q?perf:=20=E7=BB=9F=E4=B8=80=E8=A6=86?= =?UTF-8?q?=E5=86=99=E6=96=87=E4=BB=B6=E5=92=8C=E5=86=85=E6=A0=B8=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 106 +++++++++++++++++------------------------------------ 1 file changed, 34 insertions(+), 72 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 807676e..f9c71e9 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -43,7 +43,9 @@ public partial class MainGui : Form private string nextCheckTime = null;// 用于存储下次检查时间 string WebUIapiKey = "CMLiussss"; int downloading = 0; - private SysProxyResult SysProxySetting; + private SysProxyResult SysProxySetting = null; + + private DateTime _lastCheckTime = DateTime.MinValue; private static DateTime _lastGetGithubProxyRunTime = DateTime.MinValue; private static string _lastGithubProxyUrl = null; @@ -130,10 +132,10 @@ public MainGui() SetupNotifyIconContextMenu(); } - private void MainGui_Shown(object sender, EventArgs e) + private async void MainGui_Shown(object sender, EventArgs e) { // 先检查系统代理 - //await AutoCheckSysProxy(); + await AutoCheckSysProxy(); // 再初始化 AutoUpdater AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; @@ -183,8 +185,17 @@ private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) } } - public async Task AutoCheckSysProxy(bool lognow = true) + public async Task AutoCheckSysProxy(bool noRepeat = true) { + // 如果10秒内已经执行过,直接返回 + if ((DateTime.Now - _lastCheckTime).TotalSeconds < 10 && noRepeat) + { + //Log("10秒内已检测过系统代理,跳过执行", GetRichTextBoxAllLog()); + return; + } + + _lastCheckTime = DateTime.Now; // 更新执行时间 + // 自动检测系统代理 string configProxy = comboBoxSysProxy.Text; @@ -1322,10 +1333,7 @@ public async Task DownloadSubsCheckEXE() "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - - //检测系统代理 await AutoCheckSysProxy(); - var result = await 获取版本号(apiUrl, true); if (result.Item1 == "未知版本") { @@ -1405,58 +1413,13 @@ public async Task DownloadSubsCheckEXE() Log("开始下载内核文件...", GetRichTextBoxAllLog()); - // 定义策略列表(延迟获取 Proxy URL) - var strategies = new List>>(); - - // 如果系统代理可用,先加一个策略 - if (SysProxySetting.IsAvailable) - { - strategies.Add(() => Task.FromResult(("系统代理 + 原生下载链接", true, downloadUrl))); - } - - // 需要异步的才用 async/await - strategies.Add(async () => - { - githubProxyURL = await GetGithubProxyUrlAsync(); - return ("直连 GitHub Proxy 链接", false, githubProxyURL + downloadUrl); - }); - - // 无代理 + 原生链接 - strategies.Add(() => Task.FromResult(("无代理 + 原生下载链接", false, downloadUrl))); - - // 总尝试次数 - int totalTries = strategies.Count; - - bool downloadSuccess = false; - string failureReason = ""; - - for (int i = 0; i < totalTries && !downloadSuccess; i++) - { - var (desc, useSysProxy, url) = await strategies[i](); - - try - { - Log($"[尝试{i + 1}/{totalTries}] {desc} => {url}", GetRichTextBoxAllLog()); - using (HttpClient httpClient = new HttpClient(new HttpClientHandler - { - UseProxy = useSysProxy, - Proxy = useSysProxy ? WebRequest.DefaultWebProxy : null - })) - { - httpClient.DefaultRequestHeaders.UserAgent.ParseAdd( - "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - httpClient.Timeout = TimeSpan.FromSeconds(30); + // 优先尝试 GitHub 代理,再尝试系统代理,最后使用无代理直连 + var (downloadSuccess, failureReason) = await TryDownloadWithStrategiesAsync( + downloadUrl, + zipFilePath, + new[] { DownloadStrategy.SystemProxy, DownloadStrategy.GithubProxy, DownloadStrategy.Direct }); - downloadSuccess = await DownloadFileWithProgressAsync(httpClient, url, zipFilePath); - } - } - catch (Exception ex) - { - failureReason = ex.Message; - Log($"[尝试{i + 1}/{totalTries}] 失败: {ex.Message}", GetRichTextBoxAllLog(), true); - } - } // 如果所有尝试失败 if (!downloadSuccess) @@ -1499,7 +1462,7 @@ public async Task DownloadSubsCheckEXE() await SaveConfig(false); // 可选:删除 zip 文件(注释状态保留原样) - // File.Delete(zipFilePath); + File.Delete(zipFilePath); } else { @@ -2899,7 +2862,8 @@ private async Task comboBoxOverwriteUrlsSelection(bool 汇报Log = false) var (success, lastError) = await TryDownloadWithStrategiesAsync( downloadUrl, downloadFilePath, - new[] { DownloadStrategy.GithubProxy, DownloadStrategy.SystemProxy, DownloadStrategy.Direct }); + new[] { DownloadStrategy.GithubProxy, DownloadStrategy.SystemProxy, DownloadStrategy.Direct }, + false); if (!success) { @@ -2925,7 +2889,8 @@ enum DownloadStrategy private async Task<(bool success, string lastError)> TryDownloadWithStrategiesAsync( string downloadUrl, string downloadFilePath, - IEnumerable strategyOrder) + IEnumerable strategyOrder, + bool noRepeat = true) { bool success = false; string lastError = ""; @@ -2944,22 +2909,14 @@ enum DownloadStrategy }, [DownloadStrategy.SystemProxy] = async () => { - await AutoCheckSysProxy(); + if (SysProxySetting != null) + await AutoCheckSysProxy(noRepeat); return SysProxySetting.IsAvailable ? (true, downloadUrl) : (true, null); // null 表示跳过 }, [DownloadStrategy.Direct] = () => Task.FromResult((false, downloadUrl)) }; - var strategies = new List(); - - foreach (var s in strategyOrder) - { - var (useSysProxy, url) = await strategyFuncs[s](); - if (url != null) - { - strategies.Add(s); - } - } + var strategies = strategyOrder.ToList(); int totalTries = strategies.Count; for (int i = 0; i < totalTries && !success; i++) @@ -2968,7 +2925,12 @@ enum DownloadStrategy try { var (useSysProxy, url) = await strategyFuncs[strategy](); - //Log($"[尝试{i + 1}/{totalTries}] 使用 {strategy} 下载", GetRichTextBoxAllLog(), true); + + if (url == null) + { + Log($"[尝试{i + 1}/{totalTries}] 策略 {strategy} 不可用,跳过检测。", GetRichTextBoxAllLog(), true); + continue; // 直接跳过 + } using (HttpClientHandler handler = new HttpClientHandler { From b6010ce5ddb576acd93adaca40aa272dde432c0c Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 7 Oct 2025 03:12:20 +0800 Subject: [PATCH 41/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=9B=B4=E6=96=B0=E7=95=8C=E9=9D=A2=E5=92=8C=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E5=8F=82=E6=95=B0=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CheckUpdates.Designer.cs | 4 ++-- CheckUpdates.cs | 7 ++++--- MainGui.cs | 10 +++++----- MoreYAML.cs | 2 +- MoreYAML.resx | 16 +++++++++++++++- Proxy.cs | 2 +- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/CheckUpdates.Designer.cs b/CheckUpdates.Designer.cs index fc1a6b5..0a1dc31 100644 --- a/CheckUpdates.Designer.cs +++ b/CheckUpdates.Designer.cs @@ -93,7 +93,7 @@ private void InitializeComponent() this.buttonUpdateGUI.TabIndex = 2; this.buttonUpdateGUI.Text = "正在获取版本"; this.buttonUpdateGUI.UseVisualStyleBackColor = true; - this.buttonUpdateGUI.Click += new System.EventHandler(this.button1_Click); + this.buttonUpdateGUI.Click += new System.EventHandler(this.buttonUpdateGUI_Click); // // label2 // @@ -161,7 +161,7 @@ private void InitializeComponent() this.buttonUpdateCore.TabIndex = 2; this.buttonUpdateCore.Text = "正在获取版本"; this.buttonUpdateCore.UseVisualStyleBackColor = true; - this.buttonUpdateCore.Click += new System.EventHandler(this.button2_Click); + this.buttonUpdateCore.Click += new System.EventHandler(this.buttonUpdateKernel_Click); // // label7 // diff --git a/CheckUpdates.cs b/CheckUpdates.cs index 541493f..91a14a3 100644 --- a/CheckUpdates.cs +++ b/CheckUpdates.cs @@ -103,6 +103,7 @@ private async void timer1_Tick(object sender, EventArgs e) if (mainForm != null) { githubProxyURL = await mainForm.GetGithubProxyUrlAsync(); + await mainForm.AutoCheckSysProxy(); } if (最新GUI版本号 != 当前GUI版本号) @@ -111,7 +112,7 @@ private async void timer1_Tick(object sender, EventArgs e) string upgradeExePath = System.IO.Path.Combine(Application.StartupPath, "Upgrade.exe"); if (System.IO.File.Exists(upgradeExePath)) { - buttonUpdateGUI.Text = "立即更新"; + buttonUpdateGUI.Text = "更新原版"; buttonUpdateGUI.Enabled = true; } else @@ -308,7 +309,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) return detectedProxyURL; } - private void button2_Click(object sender, EventArgs e) + private void buttonUpdateKernel_Click(object sender, EventArgs e) { // 设置对话框结果为OK,表示用户点击了"立即更新"按钮 this.DialogResult = DialogResult.OK; @@ -317,7 +318,7 @@ private void button2_Click(object sender, EventArgs e) this.Close(); } - private void button1_Click(object sender, EventArgs e) + private void buttonUpdateGUI_Click(object sender, EventArgs e) { if (buttonUpdateGUI.Text == "立即更新 GUI") { diff --git a/MainGui.cs b/MainGui.cs index f9c71e9..f94ea8a 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -1462,7 +1462,7 @@ public async Task DownloadSubsCheckEXE() await SaveConfig(false); // 可选:删除 zip 文件(注释状态保留原样) - File.Delete(zipFilePath); + //File.Delete(zipFilePath); } else { @@ -2458,7 +2458,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { // 找到可用代理 detectedProxyURL = $"https://{proxyItem}/"; - //richTextBoxAllLog.Clear(); + richTextBoxAllLog.Clear(); Log($"找到可用 GitHub 代理: {proxyItem}", GetRichTextBoxAllLog()); proxyFound = true; break; @@ -2797,7 +2797,7 @@ private void buttonCheckUpdate_Click(object sender, EventArgs e) }; // 设置 button2 点击后关闭窗口并返回 DialogResult.OK - // 这需要在 CheckUpdates.cs 中修改 button2_Click 方法 + // 这需要在 CheckUpdates.cs 中修改 buttonUpdateKernel_Click 方法 // 显示 CheckUpdates 窗口 checkUpdatesForm.ShowDialog(); @@ -3844,8 +3844,8 @@ public async Task GetGithubProxyUrlAsync() const string AUTO = "自动选择"; if (comboBoxGithubProxyUrl == null) return githubProxyURL; - // 如果上次运行时间距今不足 30 分钟,直接返回上次结果(若有) - if (_lastGithubProxyUrl != null && (DateTime.Now - _lastGetGithubProxyRunTime).TotalMinutes < 30) + // 如果上次运行时间距今不足 1 分钟,直接返回上次结果(若有) + if (_lastGithubProxyUrl != null && (DateTime.Now - _lastGetGithubProxyRunTime).TotalMinutes < 1) { Log($"GitHub Proxy:{_lastGithubProxyUrl}", GetRichTextBoxAllLog()); return _lastGithubProxyUrl; diff --git a/MoreYAML.cs b/MoreYAML.cs index bfbc919..aa6270b 100644 --- a/MoreYAML.cs +++ b/MoreYAML.cs @@ -78,7 +78,7 @@ private void button2_Click(object sender, EventArgs e) private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - Process.Start("https://github.com/beck-8/subs-check/blob/master/config/config.example.yaml"); + Process.Start("https://github.com/sinspired/subs-check/blob/master/config/config.example.yaml"); } private void button1_Click(object sender, EventArgs e) diff --git a/MoreYAML.resx b/MoreYAML.resx index 017016f..56e187a 100644 --- a/MoreYAML.resx +++ b/MoreYAML.resx @@ -132,6 +132,20 @@ recipient-url: # 钉钉格式:dingtalk://<secret>@<dd_token>/<chat_id> # - dingtalk://xxxxxx@xxxxxxx/123123 # 自定义通知标题 -notify-title: "🔔 节点状态更新" +notify-title: "🔔 节点状态更新" + +# 符合条件节点数量的占比,低于此值会将订阅链接打印出来,用于排查质量差的订阅 +success-rate: 0 + +# platforms: +# - iprisk +# - openai +# - gemini +# - tiktok +# - youtube +# - netflix +# - disney +# - x + \ No newline at end of file diff --git a/Proxy.cs b/Proxy.cs index 060b713..6e9d964 100644 --- a/Proxy.cs +++ b/Proxy.cs @@ -74,7 +74,7 @@ private static async Task IsSysProxyAvailableAsync(string proxy) using (var client = new HttpClient(handler)) { - client.Timeout = TimeSpan.FromSeconds(10); + client.Timeout = TimeSpan.FromSeconds(5); var testUrls = new List> { From 66a82e38361389ac3d9d6ec30b09ca05a44ef03b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 19:15:28 +0000 Subject: [PATCH 42/92] chore(release): update CHANGELOG.md and update.xml for v2.4.0.0 --- CHANGELOG.md | 35 ++++++++++------------------------- update.xml | 10 +++++----- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e48efd3..e9e4ef0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,39 +1,24 @@ # 📝 Changelog -[2.3.0.0] - 2025-09-30 +[2.4.0.0] - 2025-10-06 🚀 Features -- 添加检测流水线并发设置 -- 添加32\64位内核切换 -- 添加高并发内核/原版切换 -- 支持流水线分阶段自适应并发检测 -- 支持流水线分段高并发模式,增强位置标签,大幅提高性能 -- 添加AutoUpdater,优化GUI自动更新,修复部分进度显示 +- 自动检测设置系统代理与界面优化 🐛 Bug Fixes -- 修复saveMethod group的初始化位置 -- 修复版本架构切换逻辑,避免下载进程冲突 -- 修复R2和webdav的默认载入位置 -- 修复cron输入框显示 -- 修复listen-port参数写入错误 -- 修复检查更新窗体错误引用导致重复创建实例的错误 -- 修复生成update.xml使用了错误的version +- *(build)* 修复32 位进程无法访问 64 位进程模块的错误 +- 修复原版内核保留上次成功节点设置 ⚡ Performance -- 优化控件提示,提升使用体验 -- 优化保留之前成功节点的逻辑 -- 优化开始检测\结束检测的按钮事件逻辑,修复bug -- 优化启动检测按钮和日志标签显示 -- 优化检查更新逻辑和UI - -🎨 Styling - -- 语义化控件名称 +- 优化覆写配置和内核下载逻辑,自动选择系统代理或github代理 +- 优化下载策略、避免不必要的检测 +- 统一覆写文件和内核下载更新逻辑,提高稳定性 +- 优化检查更新界面和更多参数页面 ⚙️ Miscellaneous Tasks -- *(UI)* 调整界面尺寸,以适配旧设备 -- Upgrade .NET Framework from 4.7.2 to 4.8 +- *(doc)* 修改readme,更新GUI界面截图 +- *(ui)* 修改启用WebUI API密钥按钮文本 diff --git a/update.xml b/update.xml index 81d463e..c4eb3f4 100644 --- a/update.xml +++ b/update.xml @@ -1,8 +1,8 @@ - 2.3.0.0 - https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.3.0.0/subs-check-win.zip - https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md - false - subs-check.win.gui.exe + 2.4.0.0 + https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.4.0.0/subs-check-win.zip + https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md + false + subs-check.win.gui.exe From bb701a5cb7dd91af36af4fdba3c2aea5c2c66e2e Mon Sep 17 00:00:00 2001 From: sinspired Date: Wed, 8 Oct 2025 01:50:56 +0800 Subject: [PATCH 43/92] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E9=BB=98=E8=AE=A4=E8=8A=82=E7=82=B9=E6=B1=A0=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EditURLs.Designer.cs | 50 +++++++++++---- EditURLs.cs | 128 ++++++++++++++++++++++--------------- MainGui.cs | 3 +- MainGui.resx | 3 - Properties/AssemblyInfo.cs | 4 +- README.md | 4 +- 6 files changed, 118 insertions(+), 74 deletions(-) diff --git a/EditURLs.Designer.cs b/EditURLs.Designer.cs index 5153659..e1a9d68 100644 --- a/EditURLs.Designer.cs +++ b/EditURLs.Designer.cs @@ -36,14 +36,16 @@ private void InitializeComponent() this.button4 = new System.Windows.Forms.Button(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.button5 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 // this.button1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.button1.Location = new System.Drawing.Point(12, 415); + this.button1.Location = new System.Drawing.Point(22, 726); + this.button1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.Size = new System.Drawing.Size(138, 40); this.button1.TabIndex = 0; this.button1.Text = "保存"; this.button1.UseVisualStyleBackColor = true; @@ -51,19 +53,22 @@ private void InitializeComponent() // // textBox1 // - this.textBox1.Location = new System.Drawing.Point(12, 12); + this.textBox1.Location = new System.Drawing.Point(22, 21); + this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBox1.Size = new System.Drawing.Size(776, 397); + this.textBox1.Size = new System.Drawing.Size(1419, 692); this.textBox1.TabIndex = 1; + this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); // // button2 // this.button2.Enabled = false; - this.button2.Location = new System.Drawing.Point(174, 415); + this.button2.Location = new System.Drawing.Point(318, 726); + this.button2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.Size = new System.Drawing.Size(138, 40); this.button2.TabIndex = 2; this.button2.Text = "等待获取"; this.button2.UseVisualStyleBackColor = true; @@ -71,9 +76,10 @@ private void InitializeComponent() // // button3 // - this.button3.Location = new System.Drawing.Point(93, 415); + this.button3.Location = new System.Drawing.Point(170, 726); + this.button3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.Size = new System.Drawing.Size(138, 40); this.button3.TabIndex = 3; this.button3.Text = "去重"; this.button3.UseVisualStyleBackColor = true; @@ -81,9 +87,10 @@ private void InitializeComponent() // // button4 // - this.button4.Location = new System.Drawing.Point(713, 415); + this.button4.Location = new System.Drawing.Point(1307, 726); + this.button4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button4.Name = "button4"; - this.button4.Size = new System.Drawing.Size(75, 23); + this.button4.Size = new System.Drawing.Size(138, 40); this.button4.TabIndex = 4; this.button4.Text = "返回"; this.button4.UseVisualStyleBackColor = true; @@ -96,23 +103,37 @@ private void InitializeComponent() // comboBox1 // this.comboBox1.FormattingEnabled = true; - this.comboBox1.Location = new System.Drawing.Point(255, 418); + this.comboBox1.Location = new System.Drawing.Point(468, 732); + this.comboBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(120, 20); + this.comboBox1.Size = new System.Drawing.Size(217, 29); this.comboBox1.TabIndex = 22; this.comboBox1.Visible = false; // + // button5 + // + this.button5.Location = new System.Drawing.Point(466, 726); + this.button5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(138, 40); + this.button5.TabIndex = 23; + this.button5.Text = "恢复默认值"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // // EditURLs // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); + this.ClientSize = new System.Drawing.Size(1467, 788); + this.Controls.Add(this.button5); this.Controls.Add(this.comboBox1); this.Controls.Add(this.button4); this.Controls.Add(this.button3); this.Controls.Add(this.button2); this.Controls.Add(this.textBox1); this.Controls.Add(this.button1); + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.MinimizeBox = false; this.Name = "EditURLs"; this.ShowIcon = false; @@ -133,5 +154,6 @@ private void InitializeComponent() private System.Windows.Forms.Button button4; private System.Windows.Forms.Timer timer1; private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Button button5; } } \ No newline at end of file diff --git a/EditURLs.cs b/EditURLs.cs index cdc9f01..b6d67ea 100644 --- a/EditURLs.cs +++ b/EditURLs.cs @@ -1,49 +1,72 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Data; -using System.Drawing; using System.Linq; using System.Net.Http; -using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; -using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace subs_check.win.gui { - public partial class EditURLs: Form + public partial class EditURLs : Form { - // 添加一个属性用于存储和传递文本内容 + // 属性 public string UrlContent { get; set; } public System.Windows.Forms.ComboBox.ObjectCollection githubProxys { get; set; } public string githubProxy { get; set; } - string githubProxyURL; - string SubsCheckURLs; + + private string githubProxyURL; + private string SubsCheckURLs; + private string UrlContentOriginal; + public Action LogAction { get; set; } + + // 默认 URL 列表 + private static readonly string[] DefaultUrls = + { + "https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta.yaml", + "https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta-2.yaml", + "https://raw.githubusercontent.com/go4sharing/sub/main/sub.yaml", + "https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt" + }; + + private string GetDefaultUrlContent() + { + return string.Join(Environment.NewLine, DefaultUrls); + } + public EditURLs() { InitializeComponent(); - // 设置textBox1的锚点为上、左、右 + // 设置控件锚点 textBox1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; - // 设置button1、button2、button3的锚点为左、下 button1.Anchor = AnchorStyles.Left | AnchorStyles.Bottom; button2.Anchor = AnchorStyles.Left | AnchorStyles.Bottom; button3.Anchor = AnchorStyles.Left | AnchorStyles.Bottom; - - // 设置button4的锚点为右、下 button4.Anchor = AnchorStyles.Right | AnchorStyles.Bottom; + button5.Anchor = AnchorStyles.Right | AnchorStyles.Bottom; // 新增按钮:恢复默认值 + + if (!string.IsNullOrEmpty(UrlContent)) + { + UrlContentOriginal = UrlContent; + } } - // 加载窗体时处理传入的内容 protected override void OnLoad(EventArgs e) { base.OnLoad(e); - // 将传入的内容显示在textBox1中 - if (!string.IsNullOrEmpty(UrlContent)) textBox1.Text = UrlContent; + // 优先显示传入内容,否则显示默认值 + if (!string.IsNullOrEmpty(UrlContent)) + { + textBox1.Text = UrlContent; + } + else + { + textBox1.Text = GetDefaultUrlContent(); + } timer1.Enabled = true; @@ -60,10 +83,19 @@ protected override void OnLoad(EventArgs e) private void button1_Click(object sender, EventArgs e) { - // 将textBox1的内容保存到UrlContent属性 - UrlContent = textBox1.Text; + if (string.IsNullOrWhiteSpace(textBox1.Text)) + { + textBox1.Text = !string.IsNullOrEmpty(UrlContentOriginal) + ? UrlContentOriginal + : GetDefaultUrlContent(); + + textBox1.SelectionStart = textBox1.Text.Length; - // 设置对话框结果为OK并关闭窗口 + // 调用传入的日志方法 + LogAction?.Invoke("订阅池为空,恢复默认订阅池。"); + } + + UrlContent = textBox1.Text; this.DialogResult = DialogResult.OK; this.Close(); } @@ -75,31 +107,25 @@ private void button4_Click(object sender, EventArgs e) private void button3_Click(object sender, EventArgs e) { - // 确保有内容需要处理 if (string.IsNullOrWhiteSpace(textBox1.Text)) return; - // 按行分割文本 string[] lines = textBox1.Text.Split( new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); - // 去除每行首尾的空白字符 for (int i = 0; i < lines.Length; i++) { lines[i] = lines[i].Trim(); } - // 使用LINQ的Distinct()方法去重,并过滤掉空行 string[] uniqueLines = lines .Where(line => !string.IsNullOrWhiteSpace(line)) - .Distinct(StringComparer.OrdinalIgnoreCase) // 忽略大小写进行去重 + .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray(); - // 将去重后的内容设回textBox1 - textBox1.Text = string.Join(Environment.NewLine, uniqueLines) + "\n"; + textBox1.Text = string.Join(Environment.NewLine, uniqueLines) + Environment.NewLine; - // 可选:显示去重结果 int removed = lines.Length - uniqueLines.Length; if (removed > 0) { @@ -119,7 +145,6 @@ private async void timer1_Tick(object sender, EventArgs e) if (comboBox1.Text == "自动选择") { - // 创建不包含"自动选择"的代理列表 List proxyItems = new List(); for (int j = 0; j < comboBox1.Items.Count; j++) { @@ -128,11 +153,9 @@ private async void timer1_Tick(object sender, EventArgs e) proxyItems.Add(proxyItem); } - // 随机打乱列表顺序 Random random = new Random(); proxyItems = proxyItems.OrderBy(x => random.Next()).ToList(); - // 异步检测可用代理 githubProxyURL = await DetectGitHubProxyAsync(proxyItems); } else @@ -145,17 +168,15 @@ private async void timer1_Tick(object sender, EventArgs e) { using (HttpClient client = new HttpClient()) { - client.Timeout = TimeSpan.FromSeconds(5); // 设置5秒超时 + client.Timeout = TimeSpan.FromSeconds(5); client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - // 使用异步方式检查URL可访问性 HttpResponseMessage response = await client.GetAsync(SubsCheckURLsURL); if (response.IsSuccessStatusCode) { button2.Text = "在线获取"; button2.Enabled = true; SubsCheckURLs = await response.Content.ReadAsStringAsync(); - //MessageBox.Show(SubsCheckURLs); } else { @@ -167,18 +188,15 @@ private async void timer1_Tick(object sender, EventArgs e) catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); - // 网络错误或其他异常情况 button2.Text = "获取失败"; button2.Enabled = false; } } - // 创建专用方法用于异步检测GitHub代理 private async Task DetectGitHubProxyAsync(List proxyItems) { string detectedProxyURL = ""; - // 遍历随机排序后的代理列表 foreach (string proxyItem in proxyItems) { string checkUrl = $"https://{proxyItem}/https://raw.githubusercontent.com/cmliu/SubsCheck-Win-GUI/master/packages.config"; @@ -187,15 +205,12 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { using (HttpClient client = new HttpClient()) { - client.Timeout = TimeSpan.FromSeconds(5); // 设置5秒超时 - // 添加User-Agent头,避免被拒绝访问 + client.Timeout = TimeSpan.FromSeconds(5); client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); - // 使用异步方式 HttpResponseMessage response = await client.GetAsync(checkUrl); if (response.IsSuccessStatusCode) { - // 找到可用代理 detectedProxyURL = $"https://{proxyItem}/"; break; } @@ -203,7 +218,6 @@ private async Task DetectGitHubProxyAsync(List proxyItems) } catch (Exception ex) { - // 记录错误但继续尝试下一个 Console.WriteLine($"Error: {ex.Message}"); } } @@ -212,7 +226,6 @@ private async Task DetectGitHubProxyAsync(List proxyItems) private void button2_Click(object sender, EventArgs e) { - // 检查是否已成功获取在线内容 if (string.IsNullOrEmpty(SubsCheckURLs)) { MessageBox.Show("未能获取在线内容,请重试。", "获取失败", @@ -220,7 +233,6 @@ private void button2_Click(object sender, EventArgs e) return; } - // 显示带有"覆盖"和"追加"选项的对话框 DialogResult result = MessageBox.Show( "请选择如何处理获取到的内容:\n\n" + "- 点击【是】将覆盖当前内容\n" + @@ -230,11 +242,8 @@ private void button2_Click(object sender, EventArgs e) MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); - // 根据用户选择执行对应操作 if (result == DialogResult.Yes) { - // 覆盖操作 - // 确保所有换行符格式一致 (将单独的\n或\r替换为Windows风格的\r\n) string normalizedText = NormalizeLineEndings(SubsCheckURLs); textBox1.Text = normalizedText; MessageBox.Show("已用在线内容覆盖原有内容。", "感谢大自然的馈赠", @@ -242,35 +251,48 @@ private void button2_Click(object sender, EventArgs e) } else if (result == DialogResult.No) { - // 追加操作 - // 确保原有内容末尾有换行符 if (!textBox1.Text.EndsWith("\r\n") && !textBox1.Text.EndsWith("\n")) { textBox1.Text += Environment.NewLine; } - // 追加新内容,确保换行符格式一致 textBox1.Text += NormalizeLineEndings(SubsCheckURLs); MessageBox.Show("已将在线内容追加到原有内容后。", "感谢大自然的馈赠", MessageBoxButtons.OK, MessageBoxIcon.Information); } - - // 如果用户选择"取消",不执行任何操作 } - // 标准化文本中的换行符为Windows风格 (\r\n) private string NormalizeLineEndings(string text) { if (string.IsNullOrEmpty(text)) return string.Empty; - // 先将所有类型的换行符替换为\n text = text.Replace("\r\n", "\n").Replace("\r", "\n"); - // 然后将\n替换为\r\n text = text.Replace("\n", Environment.NewLine); return text; } + private void textBox1_TextChanged(object sender, EventArgs e) + { + //if (string.IsNullOrWhiteSpace(textBox1.Text)) + //{ + // textBox1.Text = !string.IsNullOrEmpty(UrlContentOriginal) + // ? UrlContentOriginal + // : GetDefaultUrlContent(); + + // textBox1.SelectionStart = textBox1.Text.Length; + //} + } + + // 恢复默认值按钮事件 + + private void button5_Click(object sender, EventArgs e) + { + textBox1.Text = GetDefaultUrlContent(); + + MessageBox.Show("已恢复为默认订阅地址。", "操作完成", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } } } diff --git a/MainGui.cs b/MainGui.cs index f94ea8a..24c25fa 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -2358,7 +2358,7 @@ private RichTextBox GetRichTextBoxAllLog() return richTextBoxAllLog; } - private void Log(string message, RichTextBox richTextBoxAllLog, bool isError = false) + public void Log(string message, RichTextBox richTextBoxAllLog, bool isError = false) { string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string logType = isError ? "ERR" : "INF"; @@ -2697,6 +2697,7 @@ private async void textBoxSubsUrls_DoubleClick(object sender, EventArgs e) editURLsForm.UrlContent = textBoxSubsUrls.Text + "\n"; editURLsForm.githubProxys = comboBoxGithubProxyUrl.Items; editURLsForm.githubProxy = comboBoxGithubProxyUrl.Text; + editURLsForm.LogAction = (msg) => Log(msg, richTextBoxAllLog); // 传递主窗体的 Log 方法 // 显示对话框并等待结果 DialogResult result = editURLsForm.ShowDialog(); diff --git a/MainGui.resx b/MainGui.resx index c3120ae..de7e7b4 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 - - 196, 21 - 533, 19 diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 1c6c7d9..9185da0 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.4.0.0")] -[assembly: AssemblyFileVersion("2.4.0.0")] +[assembly: AssemblyVersion("2.4.0.1")] +[assembly: AssemblyFileVersion("2.4.0.1")] diff --git a/README.md b/README.md index 46e5e4e..4ebf001 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,9 @@ 首先声明,这款软件并非我原创开发。Subs-Check是由 [bestruirui](https://github.com/bestruirui/BestSub) 原创、由 [beck-8](https://github.com/beck-8/subs-check) 进行二次开发,而我所编写的 GUI 仅是在这两位开发者的原始版本基础上进行的 **二次开发**。 > ✨ 修复界面模糊,支持高DPI缩放,增加自适应高并发内核切换,增加`i386/64`位内核切换,优化自动更新,增加了新的参数设置项。 -> 内核新增功能详见:[sinspired](https://github.com/sinspired/subs-check) 。 +> 新增:“系统代理”设置,支持系统代理自动检测并设置。 + +> 内核新增功能详见:[sinspired/subs-check](https://github.com/sinspired/subs-check) - **视频教程:[永久免费0门槛!小白也有无限高速代理节点!](https://youtu.be/sS9Tuf1PCyc)** - **数字签名:[关于项目报毒说明](https://www.youtube.com/watch?v=4906t5zygAE&t=123s)** From 752cc3475a3b76d04b1d9e5bc10256763c02a007 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 20 Oct 2025 17:05:40 +0800 Subject: [PATCH 44/92] =?UTF-8?q?perf:=20=E5=90=AF=E5=8A=A8=E5=86=85?= =?UTF-8?q?=E6=A0=B8=E6=97=B6=E8=AE=BE=E7=BD=AE=E4=B8=80=E4=B8=AA=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=EF=BC=8C=E4=BB=A5=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E6=98=AF=E7=94=B1GUI=E5=90=AF=E5=8A=A8=E7=9A=84=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MainGui.cs b/MainGui.cs index 24c25fa..710e724 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -1649,6 +1649,9 @@ private async void StartSubsCheckProcess() // 获取当前应用程序目录 string executablePath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); string subsCheckPath = Path.Combine(executablePath, "subs-check.exe"); + // 设置一个环境变量以表明是有GUI启动的 + + Environment.SetEnvironmentVariable("START_FROM_GUI", "true"); // 检查是否有其他subs-check.exe进程正在运行,并强制结束它们 try From f47fa948ae006c5df3206ffd40395ff5a2394caa Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 20 Oct 2025 19:17:56 +0800 Subject: [PATCH 45/92] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=A3=80=E6=9F=A5=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++- CheckUpdates.cs | 2 +- MainGui.cs | 4 ++-- Program.cs | 2 +- about.Designer.cs | 2 +- about.cs | 4 ++-- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 52d9dd1..026af72 100644 --- a/.gitignore +++ b/.gitignore @@ -361,4 +361,6 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +FodyWeavers.xsd + +*.ini diff --git a/CheckUpdates.cs b/CheckUpdates.cs index 91a14a3..1076f83 100644 --- a/CheckUpdates.cs +++ b/CheckUpdates.cs @@ -334,7 +334,7 @@ private void buttonUpdateGUI_Click(object sender, EventArgs e) return; } //下载链接 - string downloadURL = $"{githubProxyURL}https://github.com/cmliu/SubsCheck-Win-GUI/releases/download/{最新GUI版本号}/SubsCheck_Win_GUI.zip"; + string downloadURL = $"{githubProxyURL}https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/{最新GUI版本号}/SubsCheck_Win_GUI.zip"; //目标文件 string downloadEXE = "subs-check.win.gui.exe"; diff --git a/MainGui.cs b/MainGui.cs index 710e724..c9723b7 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -399,7 +399,7 @@ private async Task CheckGitHubVersionAsync() return; // 静默返回,不显示错误 } - var result = await 获取版本号("https://api.github.com/repos/cmliu/SubsCheck-Win-GUI/releases/latest"); + var result = await 获取版本号("https://api.github.com/repos/sinspired/SubsCheck-Win-GUI/releases/latest"); if (result.Item1 != "未知版本") { string latestVersion = result.Item1; @@ -2443,7 +2443,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) // 遍历随机排序后的代理列表 foreach (string proxyItem in proxyItems) { - string checkUrl = $"https://{proxyItem}/https://raw.githubusercontent.com/cmliu/SubsCheck-Win-GUI/master/packages.config"; + string checkUrl = $"https://{proxyItem}/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/packages.config"; Log($"正在测试 GitHub 代理: {proxyItem}", GetRichTextBoxAllLog()); richTextBoxAllLog.Refresh(); diff --git a/Program.cs b/Program.cs index 9afb0a8..2db094a 100644 --- a/Program.cs +++ b/Program.cs @@ -10,7 +10,7 @@ namespace subs_check.win.gui static class Program { // 定义一个全局唯一的标识符,使用项目名称作为互斥体的名称 - private static string appMutexName = "cmliu/SubsCheck-Win-GUI"; + private static string appMutexName = "sinspired/SubsCheck-Win-GUI"; private static Mutex mutex; /// diff --git a/about.Designer.cs b/about.Designer.cs index c695c63..d9ad29c 100644 --- a/about.Designer.cs +++ b/about.Designer.cs @@ -118,7 +118,7 @@ private void InitializeComponent() this.linkLabel1.Size = new System.Drawing.Size(257, 12); this.linkLabel1.TabIndex = 6; this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "https://github.com/cmliu/SubsCheck-Win-GUI"; + this.linkLabel1.Text = "https://github.com/sinspired/SubsCheck-Win-GUI"; this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // // label6 diff --git a/about.cs b/about.cs index c728cb4..d9acc00 100644 --- a/about.cs +++ b/about.cs @@ -37,12 +37,12 @@ private void linkLabel4_LinkClicked(object sender, LinkLabelLinkClickedEventArgs private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - Process.Start("https://github.com/cmliu/SubsCheck-Win-GUI"); + Process.Start("https://github.com/sinspired/SubsCheck-Win-GUI"); } private void linkLabel5_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - Process.Start("https://github.com/beck-8/subs-check"); + Process.Start("https://github.com/sinspired/subs-check"); } private void linkLabel6_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) From 5d8a97dfbdf1f98ccd505eb849ebfcc6c5edf164 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:23:07 +0000 Subject: [PATCH 46/92] chore(release): update CHANGELOG.md and update.xml for v2.4.0.1 --- CHANGELOG.md | 21 +++++---------------- update.xml | 4 ++-- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9e4ef0..28f946d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,24 +1,13 @@ # 📝 Changelog -[2.4.0.0] - 2025-10-06 - -🚀 Features - -- 自动检测设置系统代理与界面优化 - -🐛 Bug Fixes - -- *(build)* 修复32 位进程无法访问 64 位进程模块的错误 -- 修复原版内核保留上次成功节点设置 +[2.4.0.1] - 2025-10-20 ⚡ Performance -- 优化覆写配置和内核下载逻辑,自动选择系统代理或github代理 -- 优化下载策略、避免不必要的检测 -- 统一覆写文件和内核下载更新逻辑,提高稳定性 -- 优化检查更新界面和更多参数页面 +- 支持恢复默认节点池链接 +- 启动内核时设置一个环境变量,以表示是由GUI启动的进程 ⚙️ Miscellaneous Tasks -- *(doc)* 修改readme,更新GUI界面截图 -- *(ui)* 修改启用WebUI API密钥按钮文本 +- *(release)* Update CHANGELOG.md and update.xml for v2.4.0.0 +- 修改更新检查地址 diff --git a/update.xml b/update.xml index c4eb3f4..123304c 100644 --- a/update.xml +++ b/update.xml @@ -1,7 +1,7 @@ - 2.4.0.0 - https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.4.0.0/subs-check-win.zip + 2.4.0.1 + https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.4.0.1/subs-check-win.zip https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md false subs-check.win.gui.exe From 884045ad781553671c7223608c708eeede647ca6 Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 28 Oct 2025 20:47:10 +0800 Subject: [PATCH 47/92] =?UTF-8?q?perf:=20=E6=B7=BB=E5=8A=A0=E6=9C=AA?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E7=9A=84=E5=8F=82=E6=95=B0=E9=A1=B9=E5=88=B0?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E5=8F=82=E6=95=B0=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 23 ++++++++++++- MainGui.resx | 3 ++ MoreYAML.Designer.cs | 66 +++++++++++++++++++++----------------- MoreYAML.resx | 58 +++++++++++++++++++++++++++++++++ Properties/AssemblyInfo.cs | 4 +-- 5 files changed, 122 insertions(+), 32 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index c9723b7..2db6ca3 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -522,6 +522,11 @@ private async void ReadConfig()//读取配置文件 checkBoxHighConcurrent.Checked = needHighConcurrent; + if (checkBoxHighConcurrent.Checked) + { + comboBoxSubscriptionType.Items.AddRange(new object[] { "", "tag", "enclosure", "license", "nofollow" }); + } + // 根据是否启用高并发,调整界面布局 string sysproxy; if (!checkBoxHighConcurrent.Checked) @@ -2130,7 +2135,23 @@ private void buttonCopySubscriptionUrl_Click(object sender, EventArgs e) try { // 构造URL - string url = comboBoxSubscriptionType.Text == "Clash" ? $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/mihomo" : $"http://{本地IP}:{numericUpDownSubStorePort.Value}/download/sub"; + string url; + if (comboBoxSubscriptionType.Text == "Clash") + { + url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/mihomo"; + } + else if (comboBoxSubscriptionType.Text == "Singbox-1.11" && checkBoxHighConcurrent.Checked) + { + url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/singbox-1.11"; + } + else if (comboBoxSubscriptionType.Text == "Singbox-1.12" && checkBoxHighConcurrent.Checked) + { + url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/singbox-1.11"; + } + else + { + url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/download/sub"; + } // 将URL复制到剪贴板 Clipboard.SetText(url); diff --git a/MainGui.resx b/MainGui.resx index de7e7b4..c3120ae 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,6 +3480,9 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 + + 196, 21 + 533, 19 diff --git a/MoreYAML.Designer.cs b/MoreYAML.Designer.cs index d749cb4..31314d6 100644 --- a/MoreYAML.Designer.cs +++ b/MoreYAML.Designer.cs @@ -31,9 +31,9 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MoreYAML)); this.button1 = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.button2 = new System.Windows.Forms.Button(); - this.textBox1 = new System.Windows.Forms.TextBox(); this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.SuspendLayout(); @@ -41,9 +41,10 @@ private void InitializeComponent() // button1 // this.button1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.button1.Location = new System.Drawing.Point(12, 415); + this.button1.Location = new System.Drawing.Point(22, 726); + this.button1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.Size = new System.Drawing.Size(138, 40); this.button1.TabIndex = 0; this.button1.Text = "保存"; this.button1.UseVisualStyleBackColor = true; @@ -53,52 +54,58 @@ private void InitializeComponent() // this.groupBox1.Controls.Add(this.linkLabel1); this.groupBox1.Controls.Add(this.textBox1); - this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Location = new System.Drawing.Point(22, 21); + this.groupBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(776, 397); + this.groupBox1.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.groupBox1.Size = new System.Drawing.Size(1423, 695); this.groupBox1.TabIndex = 1; this.groupBox1.TabStop = false; this.groupBox1.Text = "YAML"; // - // button2 + // linkLabel1 // - this.button2.Location = new System.Drawing.Point(713, 415); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); - this.button2.TabIndex = 2; - this.button2.Text = "返回"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); + this.linkLabel1.AutoSize = true; + this.linkLabel1.Location = new System.Drawing.Point(1072, 0); + this.linkLabel1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(342, 21); + this.linkLabel1.TabIndex = 1; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "更多请参考 config.yaml 参数文档"; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // // textBox1 // this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.textBox1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.textBox1.Location = new System.Drawing.Point(6, 13); + this.textBox1.Location = new System.Drawing.Point(11, 23); + this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBox1.Size = new System.Drawing.Size(764, 378); + this.textBox1.Size = new System.Drawing.Size(1399, 660); this.textBox1.TabIndex = 0; this.textBox1.Text = resources.GetString("textBox1.Text"); this.textBox1.UseWaitCursor = true; // - // linkLabel1 + // button2 // - this.linkLabel1.AutoSize = true; - this.linkLabel1.Location = new System.Drawing.Point(585, 0); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(191, 12); - this.linkLabel1.TabIndex = 1; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "更多请参考 config.yaml 参数文档"; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + this.button2.Location = new System.Drawing.Point(1307, 726); + this.button2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(138, 40); + this.button2.TabIndex = 2; + this.button2.Text = "返回"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); // // button3 // - this.button3.Location = new System.Drawing.Point(93, 415); + this.button3.Location = new System.Drawing.Point(170, 726); + this.button3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.Size = new System.Drawing.Size(138, 40); this.button3.TabIndex = 3; this.button3.Text = "重置"; this.button3.UseVisualStyleBackColor = true; @@ -106,13 +113,14 @@ private void InitializeComponent() // // MoreYAML // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); + this.ClientSize = new System.Drawing.Size(1467, 788); this.Controls.Add(this.button3); this.Controls.Add(this.button2); this.Controls.Add(this.groupBox1); this.Controls.Add(this.button1); + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "MoreYAML"; diff --git a/MoreYAML.resx b/MoreYAML.resx index 56e187a..bacf753 100644 --- a/MoreYAML.resx +++ b/MoreYAML.resx @@ -137,6 +137,30 @@ notify-title: "🔔 节点状态更新" # 符合条件节点数量的占比,低于此值会将订阅链接打印出来,用于排查质量差的订阅 success-rate: 0 +# 是否显示检测进度 +print-progress: false +# 进度条显示模式: +# "auto": 根据测活-测速-媒体检测的阶段权重自动显示 +# "stage": 每个阶段完成,显示下一阶段剩余任务 +progress-mode: auto + +# 是否开启新版本更新 +# 支持启动时检查更新及定时更新任务,无缝升级新版本 +# 支持apprise API通知渠道 +# true: 自动更新; false: 不更新 +update: true +# 启动时检查更新版本 +update-on-startup: true +# 定时检查更新 +# "0 0,9,21 * * *" 默认每天0点,9点,21点检查更新 +cron-check-update: "0 0,9,21 * * *" +# 使用预发布版本 +prerelease: false +# 下载新版本超时时间(分钟)(默认2分钟) +# 如系统代理和github代理不稳定,可适当调大即可 +# 请输入整数 +update-timeout: 2 + # platforms: # - iprisk # - openai @@ -146,6 +170,40 @@ success-rate: 0 # - netflix # - disney # - x + +# 只测试指定协议的节点 +node-type: + # - ss + # - vmess + # - vless + +# singbox规则配置 +# json文件为分流规则 +# js脚本用来根据规则对节点进行处理 +# singbox每个版本规则不兼容,须根据客户端版本选择合适的规则 +# singbox latest 版本配置 +singbox-latest: + version: 1.12 + json: + - https://raw.githubusercontent.com/sinspired/sub-store-template/main/1.12.x/sing-box.json + js: + - https://raw.githubusercontent.com/sinspired/sub-store-template/main/1.12.x/sing-box.js + +# singbox 1.11 版本配置(iOS 兼容) +singbox-old: + version: 1.11 + json: + - https://raw.githubusercontent.com/sinspired/sub-store-template/main/1.11.x/sing-box.json + js: + - https://raw.githubusercontent.com/sinspired/sub-store-template/main/1.11.x/sing-box.js + +ghproxy-group: + - https://ghp.yeye.f5.si/ + - https://git.llvho.com/ + - https://hub.885666.xyz/ + - https://p.jackyu.cn/ + - https://github.cnxiaobai.com/ + \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 9185da0..d08eca7 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.4.0.1")] -[assembly: AssemblyFileVersion("2.4.0.1")] +[assembly: AssemblyVersion("2.4.0.2")] +[assembly: AssemblyFileVersion("2.4.0.2")] From 9eca18a7ec00223cf6214efbca1f10be0ef3b607 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 31 Oct 2025 16:27:39 +0800 Subject: [PATCH 48/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0singbox?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E5=A4=8D=E5=88=B6=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 6 +++++- MainGui.resx | 3 --- Properties/AssemblyInfo.cs | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 2db6ca3..997b0b8 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -524,7 +524,7 @@ private async void ReadConfig()//读取配置文件 if (checkBoxHighConcurrent.Checked) { - comboBoxSubscriptionType.Items.AddRange(new object[] { "", "tag", "enclosure", "license", "nofollow" }); + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox-1.11", "Singbox-1.12" }); } // 根据是否启用高并发,调整界面布局 @@ -3990,6 +3990,10 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg // 恢复事件 checkBoxSwitchArch64.CheckedChanged += checkBoxSwitchArch64_CheckedChanged; } + if (checkBoxHighConcurrent.Checked) + { + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox-1.11", "Singbox-1.12" }); + } } checkBoxSwitchArch64.Enabled = false; diff --git a/MainGui.resx b/MainGui.resx index c3120ae..de7e7b4 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 - - 196, 21 - 533, 19 diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index d08eca7..9de16a8 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.4.0.2")] -[assembly: AssemblyFileVersion("2.4.0.2")] +[assembly: AssemblyVersion("2.4.0.3")] +[assembly: AssemblyFileVersion("2.4.0.3")] From 5731a4e969ff0077e7d5ed87400ecbbb0a7e1e61 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 31 Oct 2025 17:09:28 +0800 Subject: [PATCH 49/92] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=E6=96=B0?= =?UTF-8?q?=E7=9A=84node=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 29 ++++++++++++++++++----------- subs-check.win.gui.csproj | 5 ++++- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 997b0b8..c1a7c15 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -2627,7 +2627,11 @@ private async Task KillNodeProcessAsync() // 获取当前应用程序的执行目录 string executablePath = Path.GetDirectoryName(Application.ExecutablePath); - string nodeExePath = Path.Combine(executablePath, "output", "node.exe"); + string nodeExePath_old = Path.Combine(executablePath, "output", "node.exe"); + string nodeExePath_new = Path.Combine(executablePath, "output", "sub-store", "node.exe"); + + // 初始化要检查的路径数组 + string[] nodeExePaths = new string[] { nodeExePath_old, nodeExePath_new }; // 获取所有 node.exe 进程 Process[] nodeProcesses = Process.GetProcessesByName("node"); @@ -2650,19 +2654,22 @@ private async Task KillNodeProcessAsync() string processPath = await Task.Run(() => GetProcessPathByWmi(process.Id)); // 检查是否匹配我们要查找的 node.exe 路径 - if (!string.IsNullOrEmpty(processPath) && - processPath.Equals(nodeExePath, StringComparison.OrdinalIgnoreCase)) + foreach (var nodeExePath in nodeExePaths) { - Log($"发现匹配路径的 node.exe 进程(ID: {process.Id}),正在强制结束...", GetRichTextBoxAllLog()); - - await Task.Run(() => + if (!string.IsNullOrEmpty(processPath) && + processPath.Equals(nodeExePath, StringComparison.OrdinalIgnoreCase)) { - process.Kill(); - process.WaitForExit(); - }); + Log($"发现匹配路径的 node.exe 进程(ID: {process.Id}),正在强制结束...", GetRichTextBoxAllLog()); - Log($"成功结束 node.exe 进程(ID: {process.Id})", GetRichTextBoxAllLog()); - terminatedCount++; + await Task.Run(() => + { + process.Kill(); + process.WaitForExit(); + }); + + Log($"成功结束 node.exe 进程(ID: {process.Id})", GetRichTextBoxAllLog()); + terminatedCount++; + } } } catch (Exception ex) diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index 983f812..8e3d6fc 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -72,7 +72,10 @@ - + From fbac9c4a8168cfe5fe7852ed65b9221513da8e68 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 31 Oct 2025 17:10:06 +0800 Subject: [PATCH 50/92] =?UTF-8?q?chore(CI):=20=E6=9B=B4=E6=96=B0=E6=9E=84?= =?UTF-8?q?=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 068815c..c6fd9a1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -129,3 +129,17 @@ jobs: files: release/subs-check-win.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Send Telegram message on push + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} # 频道 ID + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} # Bot Token + format: markdown + message: | + 💻 *subs-check_GUI 更新* + + 版本: `${{ github.ref_name }}` + 项目: `${{ github.repository }}` + + 🔗 [查看详情](https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}) \ No newline at end of file From 579d557f908f1408cc9bbaa19273de9416cc2704 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 31 Oct 2025 17:19:00 +0800 Subject: [PATCH 51/92] =?UTF-8?q?perf:=20=E6=9B=B4=E6=96=B0=20=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoreYAML.resx | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/MoreYAML.resx b/MoreYAML.resx index bacf753..0da9248 100644 --- a/MoreYAML.resx +++ b/MoreYAML.resx @@ -121,16 +121,24 @@ # 节点前缀,依赖rename-node为true才生效 node-prefix: "" +# 配置通知渠道,将自动发送检测结果通知,新版本通知 +# 复制 https://vercel.com/new/clone?repository-url=https://github.com/sinspired/apprise_vercel 到浏览器 +# 按提示部署,建议为 Vercel 项目设置自定义域名(国内访问 Vercel 可能受限)。 # 填写搭建的apprise API server 地址 -# https://notify.xxxx.us.kg/notify +# 示例:https://notify.xxxx.us.kg/notify apprise-api-server: "" -# 填写通知目标 +# 通知渠道 # 支持100+ 个通知渠道,详细格式请参照 https://github.com/caronc/apprise -recipient-url: - # telegram格式:tgram://<bot_token>/<chat_id> +# 格式参考: +# telegram格式:tgram://{bot_token}/{chat_id} +# 钉钉格式:dingtalk://{Secret}@{ApiKey} +# QQ邮箱:mailto://{QQ号}:{邮箱授权码}@qq.com +# 邮箱授权码:设置-账号-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务-开通-继续获取授权码 +recipient-url: # - tgram://xxxxxx/-1002149239223 - # 钉钉格式:dingtalk://<secret>@<dd_token>/<chat_id> - # - dingtalk://xxxxxx@xxxxxxx/123123 + # - dingtalk://xxxxxx@xxxxxxx + # - mailto://xxxxx:xxxxxx@qq.com + # 自定义通知标题 notify-title: "🔔 节点状态更新" @@ -148,7 +156,7 @@ progress-mode: auto # 支持启动时检查更新及定时更新任务,无缝升级新版本 # 支持apprise API通知渠道 # true: 自动更新; false: 不更新 -update: true +update: false # 启动时检查更新版本 update-on-startup: true # 定时检查更新 @@ -202,8 +210,6 @@ ghproxy-group: - https://git.llvho.com/ - https://hub.885666.xyz/ - https://p.jackyu.cn/ - - https://github.cnxiaobai.com/ - - + - https://github.cnxiaobai.com/ \ No newline at end of file From cd69f645e8ede3f1a8bc17a4e004025d29bfe5b2 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 31 Oct 2025 19:06:14 +0800 Subject: [PATCH 52/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0sub-store?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=80=89=E9=A1=B9=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=85=AC=E7=BD=91=E5=88=86=E4=BA=AB=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 4 +- MainGui.Designer.cs | 125 +++++++++++++++++++++------------- MainGui.cs | 71 ++++++++++++++++--- Properties/AssemblyInfo.cs | 4 +- update.xml | 2 +- 5 files changed, 143 insertions(+), 63 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c6fd9a1..fd2762f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -103,7 +103,7 @@ jobs: ${VERSION} https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/${CURRENT_TAG}/subs-check-win.zip https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md - false + true subs-check.win.gui.exe EOF @@ -137,7 +137,7 @@ jobs: token: ${{ secrets.TELEGRAM_BOT_TOKEN }} # Bot Token format: markdown message: | - 💻 *subs-check_GUI 更新* + 💻 *subs-check_GUI 更新(推荐)* 版本: `${{ github.ref_name }}` 项目: `${{ github.repository }}` diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 95329ea..9a8f92c 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -68,13 +68,15 @@ private void InitializeComponent() this.labelLogNodeInfo = new System.Windows.Forms.Label(); this.richTextBoxAllLog = new System.Windows.Forms.RichTextBox(); this.groupBoxAdvanceSettings = new System.Windows.Forms.GroupBox(); + this.comboBoxOverwriteUrls = new System.Windows.Forms.ComboBox(); + this.textBoxSubStorePath = new System.Windows.Forms.TextBox(); + this.labelSubstoreParh = new System.Windows.Forms.Label(); this.numericUpDownTotalBandwidthLimit = new System.Windows.Forms.NumericUpDown(); this.numericUpDownSuccessLimit = new System.Windows.Forms.NumericUpDown(); this.numericUpDownDownloadMb = new System.Windows.Forms.NumericUpDown(); this.comboBoxSysProxy = new System.Windows.Forms.ComboBox(); this.comboBoxSpeedtestUrl = new System.Windows.Forms.ComboBox(); this.comboBoxGithubProxyUrl = new System.Windows.Forms.ComboBox(); - this.comboBoxOverwriteUrls = new System.Windows.Forms.ComboBox(); this.labelOverwriteUrls = new System.Windows.Forms.Label(); this.labelDownloadMb = new System.Windows.Forms.Label(); this.textBoxWebUiAPIKey = new System.Windows.Forms.TextBox(); @@ -197,7 +199,7 @@ private void InitializeComponent() // // numericUpDownMinSpeed // - this.numericUpDownMinSpeed.Location = new System.Drawing.Point(192, 180); + this.numericUpDownMinSpeed.Location = new System.Drawing.Point(197, 180); this.numericUpDownMinSpeed.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownMinSpeed.Maximum = new decimal(new int[] { 20480, @@ -221,7 +223,7 @@ private void InitializeComponent() // // numericUpDownTimeout // - this.numericUpDownTimeout.Location = new System.Drawing.Point(192, 131); + this.numericUpDownTimeout.Location = new System.Drawing.Point(197, 131); this.numericUpDownTimeout.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownTimeout.Maximum = new decimal(new int[] { 10000, @@ -245,7 +247,7 @@ private void InitializeComponent() // // numericUpDownInterval // - this.numericUpDownInterval.Location = new System.Drawing.Point(192, 82); + this.numericUpDownInterval.Location = new System.Drawing.Point(197, 82); this.numericUpDownInterval.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownInterval.Maximum = new decimal(new int[] { 1440, @@ -269,7 +271,7 @@ private void InitializeComponent() // // numericUpDownConcurrent // - this.numericUpDownConcurrent.Location = new System.Drawing.Point(192, 33); + this.numericUpDownConcurrent.Location = new System.Drawing.Point(197, 33); this.numericUpDownConcurrent.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.numericUpDownConcurrent.Maximum = new decimal(new int[] { 1024, @@ -300,7 +302,7 @@ private void InitializeComponent() "gist", "r2", "webdav"}); - this.comboBoxSaveMethod.Location = new System.Drawing.Point(192, 230); + this.comboBoxSaveMethod.Location = new System.Drawing.Point(197, 230); this.comboBoxSaveMethod.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBoxSaveMethod.Name = "comboBoxSaveMethod"; this.comboBoxSaveMethod.Size = new System.Drawing.Size(106, 29); @@ -310,7 +312,7 @@ private void InitializeComponent() // checkBoxSwitchArch64 // this.checkBoxSwitchArch64.AutoSize = true; - this.checkBoxSwitchArch64.Location = new System.Drawing.Point(167, 539); + this.checkBoxSwitchArch64.Location = new System.Drawing.Point(170, 539); this.checkBoxSwitchArch64.Name = "checkBoxSwitchArch64"; this.checkBoxSwitchArch64.Size = new System.Drawing.Size(111, 25); this.checkBoxSwitchArch64.TabIndex = 38; @@ -324,7 +326,7 @@ private void InitializeComponent() this.textBoxCron.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; this.textBoxCron.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList; this.textBoxCron.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxCron.Location = new System.Drawing.Point(85, 496); + this.textBoxCron.Location = new System.Drawing.Point(89, 496); this.textBoxCron.Margin = new System.Windows.Forms.Padding(5); this.textBoxCron.Name = "textBoxCron"; this.textBoxCron.Size = new System.Drawing.Size(214, 31); @@ -406,13 +408,13 @@ private void InitializeComponent() this.comboBoxSubscriptionType.Location = new System.Drawing.Point(15, 578); this.comboBoxSubscriptionType.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBoxSubscriptionType.Name = "comboBoxSubscriptionType"; - this.comboBoxSubscriptionType.Size = new System.Drawing.Size(132, 29); + this.comboBoxSubscriptionType.Size = new System.Drawing.Size(144, 29); this.comboBoxSubscriptionType.TabIndex = 19; // // buttonCopySubscriptionUrl // this.buttonCopySubscriptionUrl.Enabled = false; - this.buttonCopySubscriptionUrl.Location = new System.Drawing.Point(161, 575); + this.buttonCopySubscriptionUrl.Location = new System.Drawing.Point(165, 575); this.buttonCopySubscriptionUrl.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonCopySubscriptionUrl.Name = "buttonCopySubscriptionUrl"; this.buttonCopySubscriptionUrl.Size = new System.Drawing.Size(138, 40); @@ -427,7 +429,7 @@ private void InitializeComponent() this.buttonTriggerCheck.Location = new System.Drawing.Point(13, 625); this.buttonTriggerCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonTriggerCheck.Name = "buttonTriggerCheck"; - this.buttonTriggerCheck.Size = new System.Drawing.Size(138, 40); + this.buttonTriggerCheck.Size = new System.Drawing.Size(146, 40); this.buttonTriggerCheck.TabIndex = 30; this.buttonTriggerCheck.Text = "🔀未启动"; this.buttonTriggerCheck.UseVisualStyleBackColor = true; @@ -436,7 +438,7 @@ private void InitializeComponent() // buttonWebUi // this.buttonWebUi.Enabled = false; - this.buttonWebUi.Location = new System.Drawing.Point(161, 625); + this.buttonWebUi.Location = new System.Drawing.Point(165, 625); this.buttonWebUi.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonWebUi.Name = "buttonWebUi"; this.buttonWebUi.Size = new System.Drawing.Size(138, 40); @@ -448,7 +450,7 @@ private void InitializeComponent() // checkBoxStartup // this.checkBoxStartup.AutoSize = true; - this.checkBoxStartup.Location = new System.Drawing.Point(167, 676); + this.checkBoxStartup.Location = new System.Drawing.Point(170, 676); this.checkBoxStartup.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.checkBoxStartup.Name = "checkBoxStartup"; this.checkBoxStartup.Size = new System.Drawing.Size(120, 25); @@ -488,7 +490,7 @@ private void InitializeComponent() this.textBoxSubsUrls.Multiline = true; this.textBoxSubsUrls.Name = "textBoxSubsUrls"; this.textBoxSubsUrls.ReadOnly = true; - this.textBoxSubsUrls.Size = new System.Drawing.Size(281, 223); + this.textBoxSubsUrls.Size = new System.Drawing.Size(286, 223); this.textBoxSubsUrls.TabIndex = 17; this.textBoxSubsUrls.Text = resources.GetString("textBoxSubsUrls.Text"); this.textBoxSubsUrls.WordWrap = false; @@ -501,7 +503,7 @@ private void InitializeComponent() this.buttonStartCheck.Location = new System.Drawing.Point(13, 676); this.buttonStartCheck.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonStartCheck.Name = "buttonStartCheck"; - this.buttonStartCheck.Size = new System.Drawing.Size(138, 79); + this.buttonStartCheck.Size = new System.Drawing.Size(146, 79); this.buttonStartCheck.TabIndex = 0; this.buttonStartCheck.Text = "▶️ 启动"; this.buttonStartCheck.UseVisualStyleBackColor = true; @@ -509,7 +511,7 @@ private void InitializeComponent() // // buttonAdvanceSettings // - this.buttonAdvanceSettings.Location = new System.Drawing.Point(161, 715); + this.buttonAdvanceSettings.Location = new System.Drawing.Point(165, 715); this.buttonAdvanceSettings.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.buttonAdvanceSettings.Name = "buttonAdvanceSettings"; this.buttonAdvanceSettings.Size = new System.Drawing.Size(138, 40); @@ -684,6 +686,9 @@ private void InitializeComponent() // // groupBoxAdvanceSettings // + this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxOverwriteUrls); + this.groupBoxAdvanceSettings.Controls.Add(this.textBoxSubStorePath); + this.groupBoxAdvanceSettings.Controls.Add(this.labelSubstoreParh); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownTotalBandwidthLimit); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSuccessLimit); this.groupBoxAdvanceSettings.Controls.Add(this.numericUpDownSubStorePort); @@ -694,7 +699,6 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxSpeedtestUrl); this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxGithubProxyUrl); this.groupBoxAdvanceSettings.Controls.Add(this.labelSubstorePort); - this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxOverwriteUrls); this.groupBoxAdvanceSettings.Controls.Add(this.labelOverwriteUrls); this.groupBoxAdvanceSettings.Controls.Add(this.labelWebUIPort); this.groupBoxAdvanceSettings.Controls.Add(this.labelDownloadMb); @@ -721,6 +725,58 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.Text = "高级设置"; this.groupBoxAdvanceSettings.Visible = false; // + // comboBoxOverwriteUrls + // + this.comboBoxOverwriteUrls.FormattingEnabled = true; + this.comboBoxOverwriteUrls.Items.AddRange(new object[] { + "[内置]布丁狗的订阅转换", + "[内置]ACL4SSR_Online_Full", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/布丁狗的订阅转" + + "换.yaml", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + + "_Online_Full.yaml", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + + "_Online_Full_WithIcon.yaml", + "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/添加直连规则." + + "yaml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/布丁狗的订阅转换.y" + + "aml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + + "line_Full.yaml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + + "line_Full_WithIcon.yaml", + "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/添加直连规则.yam" + + "l"}); + this.comboBoxOverwriteUrls.Location = new System.Drawing.Point(914, 128); + this.comboBoxOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.comboBoxOverwriteUrls.Name = "comboBoxOverwriteUrls"; + this.comboBoxOverwriteUrls.Size = new System.Drawing.Size(504, 29); + this.comboBoxOverwriteUrls.TabIndex = 24; + this.comboBoxOverwriteUrls.SelectedIndexChanged += new System.EventHandler(this.comboBoxOverwriteUrls_SelectedIndexChanged); + // + // textBoxSubStorePath + // + this.textBoxSubStorePath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBoxSubStorePath.ForeColor = System.Drawing.SystemColors.WindowFrame; + this.textBoxSubStorePath.Location = new System.Drawing.Point(914, 175); + this.textBoxSubStorePath.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBoxSubStorePath.Name = "textBoxSubStorePath"; + this.textBoxSubStorePath.Size = new System.Drawing.Size(144, 31); + this.textBoxSubStorePath.TabIndex = 41; + this.textBoxSubStorePath.Text = "请输入路径"; + this.textBoxSubStorePath.Enter += new System.EventHandler(this.textBoxSubStorePath_Enter); + this.textBoxSubStorePath.Leave += new System.EventHandler(this.textBoxSubStorePath_Leave); + // + // labelSubstoreParh + // + this.labelSubstoreParh.AutoSize = true; + this.labelSubstoreParh.Location = new System.Drawing.Point(735, 180); + this.labelSubstoreParh.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.labelSubstoreParh.Name = "labelSubstoreParh"; + this.labelSubstoreParh.Size = new System.Drawing.Size(183, 21); + this.labelSubstoreParh.TabIndex = 42; + this.labelSubstoreParh.Text = "Sub-Store 路径:"; + // // numericUpDownTotalBandwidthLimit // this.numericUpDownTotalBandwidthLimit.Enabled = false; @@ -1267,44 +1323,15 @@ private void InitializeComponent() this.comboBoxGithubProxyUrl.TabIndex = 21; this.comboBoxGithubProxyUrl.Leave += new System.EventHandler(this.comboBoxGithubProxyUrl_Leave); // - // comboBoxOverwriteUrls - // - this.comboBoxOverwriteUrls.FormattingEnabled = true; - this.comboBoxOverwriteUrls.Items.AddRange(new object[] { - "[内置]布丁狗的订阅转换", - "[内置]ACL4SSR_Online_Full", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/布丁狗的订阅转" + - "换.yaml", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + - "_Online_Full.yaml", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/ACL4SSR" + - "_Online_Full_WithIcon.yaml", - "https://raw.githubusercontent.com/mihomo-party-org/override-hub/main/yaml/添加直连规则." + - "yaml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/布丁狗的订阅转换.y" + - "aml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + - "line_Full.yaml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/ACL4SSR_On" + - "line_Full_WithIcon.yaml", - "https://fastly.jsdelivr.net/gh/mihomo-party-org/override-hub@main/yaml/添加直连规则.yam" + - "l"}); - this.comboBoxOverwriteUrls.Location = new System.Drawing.Point(901, 128); - this.comboBoxOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.comboBoxOverwriteUrls.Name = "comboBoxOverwriteUrls"; - this.comboBoxOverwriteUrls.Size = new System.Drawing.Size(517, 29); - this.comboBoxOverwriteUrls.TabIndex = 24; - this.comboBoxOverwriteUrls.SelectedIndexChanged += new System.EventHandler(this.comboBoxOverwriteUrls_SelectedIndexChanged); - // // labelOverwriteUrls // this.labelOverwriteUrls.AutoSize = true; this.labelOverwriteUrls.Location = new System.Drawing.Point(735, 132); this.labelOverwriteUrls.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); this.labelOverwriteUrls.Name = "labelOverwriteUrls"; - this.labelOverwriteUrls.Size = new System.Drawing.Size(170, 21); + this.labelOverwriteUrls.Size = new System.Drawing.Size(181, 21); this.labelOverwriteUrls.TabIndex = 23; - this.labelOverwriteUrls.Text = "Clash覆写配置:"; + this.labelOverwriteUrls.Text = "Clash 覆写配置:"; // // labelDownloadMb // @@ -1989,6 +2016,8 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox comboBoxSysProxy; private System.Windows.Forms.Label label1; private System.Windows.Forms.CheckBox checkBoxEnableSuccessLimit; + private System.Windows.Forms.Label labelSubstoreParh; + private System.Windows.Forms.TextBox textBoxSubStorePath; } } diff --git a/MainGui.cs b/MainGui.cs index c1a7c15..c78ef33 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -92,7 +92,7 @@ public MainGui() toolTip1.SetToolTip(checkBoxDropBadCFNodes, "丢弃无法访问CF CDN网站的节点。\r\n- 这类节点可以正常访问YouTube、Google等网站。\r\n- 无法访问cloudflare及使用了CDN服务的网站,比如Twitter、claude等。\r\n- 开启会导致节点数量大幅减少。"); - toolTip1.SetToolTip(comboBoxSubscriptionType, "通用订阅:内置了Sub-Store程序,自适应订阅格式。\nClash订阅:带规则的 Mihomo、Clash 订阅格式。"); + toolTip1.SetToolTip(comboBoxSubscriptionType, "通用订阅:内置了Sub-Store程序,自适应订阅格式。\nClash订阅:带规则的 Mihomo、Clash 订阅格式。\nSingbox:带规则的singbox订阅,需匹配版本"); toolTip1.SetToolTip(comboBoxOverwriteUrls, "生成带规则的 Clash 订阅所需的覆写规则文件"); toolTip1.SetToolTip(checkBoxStartup, "开机启动:勾选后,程序将在Windows启动时自动运行"); @@ -104,6 +104,8 @@ public MainGui() toolTip1.SetToolTip(numericUpDownDLTimehot, "下载测试时间(s):与下载链接大小相关,默认最大测试10s。"); toolTip1.SetToolTip(numericUpDownWebUIPort, "本地监听端口:用于直接返回测速结果的节点信息,方便 Sub-Store 实现订阅转换。"); toolTip1.SetToolTip(numericUpDownSubStorePort, "Sub-Store监听端口:用于订阅订阅转换。\n注意:除非你知道你在干什么,否则不要将你的 Sub-Store 暴露到公网,否则可能会被滥用"); + toolTip1.SetToolTip(textBoxSubStorePath, "Sub-Store自定义路径\n设置path之后,可以安全暴露到公网,开启订阅分享功能。\r\n# 订阅示例:http://127.0.0.1:8299/{sub-store-path}/api/file/mihomo\r\n# WebUI 支持分享订阅,直接复制订阅链接"); + toolTip1.SetToolTip(numericUpDownDownloadMb, "下载测试限制(MB):当达到下载数据大小时,停止下载,可节省测速流量,减少测速测死的概率"); toolTip1.SetToolTip(textBoxSubsUrls, "节点池订阅地址:支持 Link、Base64、Clash 格式的订阅链接。"); toolTip1.SetToolTip(checkBoxEnableRenameNode, "以节点IP查询位置重命名节点。\n质量差的节点可能造成IP查询失败,造成整体检查速度稍微变慢。"); @@ -128,6 +130,8 @@ public MainGui() toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会在内存中保留成功节点以便下次使用(重启后丢失)\n可在订阅链接中添加以下地址作为替代:\n- http://127.0.0.1:8199/all.yaml#KeepSucced\n"); + toolTip1.SetToolTip(checkBoxEnableWebUI, "勾选后启用WebUI管理界面\n建议启用\n建议使用 Cloudflare Tunel隧道 映射主机端口\r\n可使用域名编辑、管理配置,开始、结束检测任务\n本地管理地址: http://127.0.0.1:8199/admin\n"); + toolTip1.SetToolTip(textBoxWebUiAPIKey, "Web控制面板的api-key"); // 设置通知图标的上下文菜单 SetupNotifyIconContextMenu(); } @@ -524,7 +528,7 @@ private async void ReadConfig()//读取配置文件 if (checkBoxHighConcurrent.Checked) { - comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox-1.11", "Singbox-1.12" }); + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.11", "Singbox1.12" }); } // 根据是否启用高并发,调整界面布局 @@ -790,6 +794,14 @@ private async void ReadConfig()//读取配置文件 } } + string substorePath = 读取config字符串(config, "sub-store-path"); + if (!string.IsNullOrEmpty(substorePath)) + { + if (substorePath.StartsWith("/")) substorePath = substorePath.Substring(1); + + textBoxSubStorePath.Text = substorePath; + } + string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { @@ -930,6 +942,14 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 } config["api-key"] = WebUIapiKey; + string substorePath = textBoxSubStorePath.Text.Trim(); + // 如果不是以 "/" 开头,则补上 + if (!substorePath.StartsWith("/")) substorePath = "/" + substorePath; + // 如果是默认提示文字或仅有 "/",则清空 + if (substorePath == "/请输入路径" || substorePath == "/") substorePath = ""; + + config["sub-store-path"] = substorePath; + // 保存sub-store-port config["sub-store-port"] = $@":{numericUpDownSubStorePort.Value}"; @@ -2134,23 +2154,29 @@ private void buttonCopySubscriptionUrl_Click(object sender, EventArgs e) string 本地IP = GetLocalLANIP(); try { - // 构造URL + string subPath = textBoxSubStorePath.Text.Trim(); + subPath = !string.IsNullOrEmpty(subPath) && subPath != "请输入路径" + ? (subPath.StartsWith("/") ? subPath : "/" + subPath) + : string.Empty; + + string baseSubStoreUrl = $"http://{本地IP}:{numericUpDownSubStorePort.Value}{subPath}"; string url; + if (comboBoxSubscriptionType.Text == "Clash") { - url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/mihomo"; + url = $"{baseSubStoreUrl}/api/file/mihomo"; } - else if (comboBoxSubscriptionType.Text == "Singbox-1.11" && checkBoxHighConcurrent.Checked) + else if (comboBoxSubscriptionType.Text == "Singbox1.11" && checkBoxHighConcurrent.Checked) { - url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/singbox-1.11"; + url = $"{baseSubStoreUrl}/api/file/singbox-1.11"; } - else if (comboBoxSubscriptionType.Text == "Singbox-1.12" && checkBoxHighConcurrent.Checked) + else if (comboBoxSubscriptionType.Text == "Singbox1.12" && checkBoxHighConcurrent.Checked) { - url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/api/file/singbox-1.11"; + url = $"{baseSubStoreUrl}/api/file/singbox-1.12"; } else { - url = $"http://{本地IP}:{numericUpDownSubStorePort.Value}/download/sub"; + url = $"{baseSubStoreUrl}/download/sub"; } // 将URL复制到剪贴板 @@ -2341,6 +2367,31 @@ private void textBoxWebUiAPIKey_Leave(object sender, EventArgs e) } } + private void textBoxSubStorePath_Enter(object sender, EventArgs e) + { + textBoxSubStorePath.PasswordChar = '\0'; + if (textBoxSubStorePath.Text == "请输入路径") + { + textBoxSubStorePath.Text = ""; + textBoxSubStorePath.ForeColor = Color.Black; + } + } + + private void textBoxSubStorePath_Leave(object sender, EventArgs e) + { + + if (textBoxSubStorePath.Text == "") + { + textBoxSubStorePath.PasswordChar = '\0'; + textBoxSubStorePath.Text = "请输入路径"; + textBoxSubStorePath.ForeColor = Color.Gray; + } + else + { + textBoxSubStorePath.ForeColor = Color.Black; + textBoxSubStorePath.PasswordChar = '*'; + } + } private void textBox7_Leave(object sender, EventArgs e) { // 检查是否有内容 @@ -3999,7 +4050,7 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg } if (checkBoxHighConcurrent.Checked) { - comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox-1.11", "Singbox-1.12" }); + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.11", "Singbox1.12" }); } } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 9de16a8..6292882 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.4.0.3")] -[assembly: AssemblyFileVersion("2.4.0.3")] +[assembly: AssemblyVersion("2.5.0.0")] +[assembly: AssemblyFileVersion("2.5.0.0")] diff --git a/update.xml b/update.xml index 123304c..0b3144b 100644 --- a/update.xml +++ b/update.xml @@ -3,6 +3,6 @@ 2.4.0.1 https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.4.0.1/subs-check-win.zip https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md - false + true subs-check.win.gui.exe From fab5bd0bf0760920f54e830bbe54d0bbd54cf67c Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 3 Nov 2025 17:06:04 +0800 Subject: [PATCH 53/92] =?UTF-8?q?fix:=20=E8=87=AA=E5=8A=A8=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E7=B3=BB=E7=BB=9F=E4=BB=A3=E7=90=86=E5=B9=B6=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE,=E6=8F=90=E9=AB=98=E4=BA=86=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 12 ++++-- MainGui.cs | 23 ++++++++++- Properties/AssemblyInfo.cs | 4 +- Proxy.cs | 78 +++++++++++++++++++------------------- 4 files changed, 70 insertions(+), 47 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 9a8f92c..09044a5 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -855,13 +855,19 @@ private void InitializeComponent() this.comboBoxSysProxy.ImeMode = System.Windows.Forms.ImeMode.Close; this.comboBoxSysProxy.Items.AddRange(new object[] { "自动检测", + "127.0.0.1:443", "127.0.0.1:7890", - "127.0.0.1:10808", - "127.0.0.1:10809", "127.0.0.1:7891", "127.0.0.1:1080", "127.0.0.1:8080", - "127.0.0.1:443"}); + "127.0.0.1:10808", + "127.0.0.1:10809", + "127.0.0.1:3067", + "127.0.0.1:2080", + "127.0.0.1:1194", + "127.0.0.1:1082", + "127.0.0.1:12334", + "127.0.0.1:12335"}); this.comboBoxSysProxy.Location = new System.Drawing.Point(848, 32); this.comboBoxSysProxy.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); this.comboBoxSysProxy.Name = "comboBoxSysProxy"; diff --git a/MainGui.cs b/MainGui.cs index c78ef33..1cd3de3 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -202,6 +202,15 @@ public async Task AutoCheckSysProxy(bool noRepeat = true) // 自动检测系统代理 string configProxy = comboBoxSysProxy.Text; + if (configProxy == "自动检测" || string.IsNullOrEmpty(configProxy)||configProxy == "http://" || configProxy == "https://") + { + configProxy = ""; + } + + if ((!configProxy.StartsWith("http://") || !configProxy.StartsWith("https://")) && configProxy != "") + { + configProxy = "http://" + configProxy; + } SysProxySetting = await Proxy.GetSysProxyAsync(configProxy); @@ -230,14 +239,14 @@ public async Task AutoCheckSysProxy(bool noRepeat = true) } comboBoxSysProxy.Text = input; - Log("检测到系统代理: " + SysProxySetting.Address, GetRichTextBoxAllLog()); + Log("检测到可用系统代理并设置: " + SysProxySetting.Address, GetRichTextBoxAllLog()); //await SaveConfig(false); } } else { - Log("未发现系统代理", GetRichTextBoxAllLog()); + Log("未发现系统代理或系统代理不可用", GetRichTextBoxAllLog()); } } @@ -536,10 +545,18 @@ private async void ReadConfig()//读取配置文件 if (!checkBoxHighConcurrent.Checked) { sysproxy = 读取config字符串(config, "proxy"); + if (sysproxy == null || sysproxy == "") + { + sysproxy = 读取config字符串(config, "system-proxy"); + } } else { sysproxy = 读取config字符串(config, "system-proxy"); + if (sysproxy == null || sysproxy == "") + { + sysproxy = 读取config字符串(config, "proxy"); + } } if (sysproxy != null) { @@ -968,10 +985,12 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 if (checkBoxHighConcurrent.Checked) { config["system-proxy"] = sysProxyURL; + config["proxy"] = sysProxyURL; } else { config["proxy"] = sysProxyURL; + config["system-proxy"] = sysProxyURL; } // 保存订阅列表 diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 6292882..40dbfde 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.5.0.0")] -[assembly: AssemblyFileVersion("2.5.0.0")] +[assembly: AssemblyVersion("2.5.0.1")] +[assembly: AssemblyFileVersion("2.5.0.1")] diff --git a/Proxy.cs b/Proxy.cs index 6e9d964..e5ebe19 100644 --- a/Proxy.cs +++ b/Proxy.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net; using System.Net.Http; using System.Threading; @@ -17,7 +18,13 @@ internal class Proxy "http://127.0.0.1:1080", "http://127.0.0.1:8080", "http://127.0.0.1:10808", - "http://127.0.0.1:10809" + "http://127.0.0.1:10809", + "http://127.0.0.1:3067", + "http://127.0.0.1:2080", + "http://127.0.0.1:1194", + "http://127.0.0.1:1082", + "http://127.0.0.1:12334", + "http://127.0.0.1:12335" }; public class SysProxyResult @@ -61,7 +68,7 @@ public static Task GetSysProxyAsync(string configProxy) /// /// 检测代理是否可用(要求 Google 204 和 GitHub Raw 都成功) /// - private static async Task IsSysProxyAvailableAsync(string proxy) + private static async Task IsSysProxyAvailableAsync(string proxy, CancellationToken token = default) { try { @@ -74,39 +81,22 @@ private static async Task IsSysProxyAvailableAsync(string proxy) using (var client = new HttpClient(handler)) { - client.Timeout = TimeSpan.FromSeconds(5); + client.Timeout = TimeSpan.FromSeconds(10); - var testUrls = new List> + var testTasks = new[] { - Tuple.Create("https://www.google.com/generate_204", HttpStatusCode.NoContent), - Tuple.Create("https://raw.githubusercontent.com/github/gitignore/main/Go.gitignore", HttpStatusCode.OK) + client.GetAsync("https://www.google.com/generate_204", token), + client.GetAsync("https://raw.githubusercontent.com/github/gitignore/main/Go.gitignore", token) }; - var tasks = new List>(); - foreach (var t in testUrls) - { - tasks.Add(Task.Run(async () => - { - try - { - var resp = await client.GetAsync(t.Item1); - return resp.StatusCode == t.Item2; - } - catch - { - return false; - } - })); - } - - var results = await Task.WhenAll(tasks); - foreach (var ok in results) - { - if (!ok) return false; - } - return true; + var responses = await Task.WhenAll(testTasks); + return responses[0].StatusCode == HttpStatusCode.NoContent && responses[1].StatusCode == HttpStatusCode.OK; } } + catch (OperationCanceledException) + { + return false; // Expected cancellation + } catch { return false; @@ -126,30 +116,38 @@ private static async Task FindAvailableSysProxyAsync(string configProxy, // Step 2: 并发检测候选代理 var cts = new CancellationTokenSource(); - var tasks = new List>(); - + var runningTasks = new List>(); foreach (var p in candidates) { - tasks.Add(Task.Run(async () => + runningTasks.Add(Task.Run(async () => { - if (await IsSysProxyAvailableAsync(p)) + if (await IsSysProxyAvailableAsync(p, cts.Token)) { - cts.Cancel(); // 找到一个就取消其他任务 return p; } return null; }, cts.Token)); } - var allTasks = Task.WhenAll(tasks); - var completed = await Task.WhenAny(allTasks, Task.Delay(5000)); - if (completed == allTasks) + while (runningTasks.Any()) { - foreach (var t in tasks) + var completedTask = await Task.WhenAny(runningTasks); + runningTasks.Remove(completedTask); + + try + { + string result = await completedTask; + if (!string.IsNullOrEmpty(result)) + { + cts.Cancel(); // 找到一个就取消其他任务 + return result; // 立即返回结果 + } + } + catch (OperationCanceledException) { - if (!string.IsNullOrEmpty(t.Result)) - return t.Result; + // This task was canceled because another one finished first. Ignore. } + // Other exceptions can be logged if needed. } return string.Empty; From 6c89295e9b6e188649a7716fdb769f7b07bc93e2 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 3 Nov 2025 17:42:02 +0800 Subject: [PATCH 54/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E6=A3=80=E6=B5=8B=E5=92=8C=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Proxy.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Proxy.cs b/Proxy.cs index e5ebe19..7a8b654 100644 --- a/Proxy.cs +++ b/Proxy.cs @@ -82,6 +82,7 @@ private static async Task IsSysProxyAvailableAsync(string proxy, Cancellat using (var client = new HttpClient(handler)) { client.Timeout = TimeSpan.FromSeconds(10); + client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) cmliu/SubsCheck-Win-GUI"); var testTasks = new[] { From 4e31d3aba1cc47ad84bce12f6d98926a2027cf67 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 3 Nov 2025 17:58:19 +0800 Subject: [PATCH 55/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 1cd3de3..d8a2e60 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -202,7 +202,7 @@ public async Task AutoCheckSysProxy(bool noRepeat = true) // 自动检测系统代理 string configProxy = comboBoxSysProxy.Text; - if (configProxy == "自动检测" || string.IsNullOrEmpty(configProxy)||configProxy == "http://" || configProxy == "https://") + if (configProxy == "自动检测" || string.IsNullOrEmpty(configProxy) || configProxy == "http://" || configProxy == "https://") { configProxy = ""; } @@ -415,12 +415,32 @@ private async Task CheckGitHubVersionAsync() var result = await 获取版本号("https://api.github.com/repos/sinspired/SubsCheck-Win-GUI/releases/latest"); if (result.Item1 != "未知版本") { - string latestVersion = result.Item1; - if (latestVersion != 当前GUI版本号) + string latestVersionStr = result.Item1; + try { - 最新GUI版本号 = latestVersion; - 标题 = "SubsCheck Win GUI " + 当前GUI版本号 + $" 发现新版本: {最新GUI版本号} 请及时更新!"; - this.Text = 标题; + // 移除版本号前的 'v' 前缀以便正确解析 + string latestVersionToParse = latestVersionStr.StartsWith("v") ? latestVersionStr.Substring(1) : latestVersionStr; + string currentVersionToParse = 当前GUI版本号.StartsWith("v") ? 当前GUI版本号.Substring(1) : 当前GUI版本号; + + Version latestVersion = new Version(latestVersionToParse); + Version currentVersion = new Version(currentVersionToParse); + + if (latestVersion > currentVersion) + { + 最新GUI版本号 = latestVersionStr; + 标题 = "SubsCheck Win GUI " + 当前GUI版本号 + $" 发现新版本: {最新GUI版本号} 请及时更新!"; + this.Text = 标题; + } + } + catch (Exception) + { + // 版本号格式解析失败,回退到原始的字符串比较 + if (latestVersionStr != 当前GUI版本号) + { + 最新GUI版本号 = latestVersionStr; + 标题 = "SubsCheck Win GUI " + 当前GUI版本号 + $" 发现新版本: {最新GUI版本号} 请及时更新!"; + this.Text = 标题; + } } } } From 1eda76f2ed9d3a51c4e9281927a422a983858886 Mon Sep 17 00:00:00 2001 From: sinspired Date: Mon, 3 Nov 2025 18:02:16 +0800 Subject: [PATCH 56/92] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0Newtonsoft.Jso?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Properties/AssemblyInfo.cs | 2 +- packages.config | 8 ++++---- subs-check.win.gui.csproj | 7 ++----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 40dbfde..098b233 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -8,7 +8,7 @@ [assembly: AssemblyTitle("SubsCheck Win GUI")] [assembly: AssemblyDescription("SubsCheck 为 Windows 用户设计的 GUI 程序界面。修复字体模糊,兼容新旧dpi设备,新增高并发、64位内核,新增历次检测可用节点,添加新内核特性。")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("TG:CMLiussss")] +[assembly: AssemblyCompany("TG:sinspired")] [assembly: AssemblyProduct("SubsCheck Win GUI")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] diff --git a/packages.config b/packages.config index 185f49e..dce3d59 100644 --- a/packages.config +++ b/packages.config @@ -1,7 +1,7 @@  - - - - + + + + \ No newline at end of file diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index 8e3d6fc..b0da823 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -72,10 +72,7 @@ - + @@ -94,7 +91,7 @@ packages\Microsoft.Web.WebView2.1.0.2592.51\lib\net462\Microsoft.Web.WebView2.Wpf.dll - packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll From cbd961d459de192b6a0c1af82038ae7e16cefa14 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 13:30:54 +0000 Subject: [PATCH 57/92] chore(release): update CHANGELOG.md and update.xml for v2.5.0.1 --- CHANGELOG.md | 13 ++++++++----- update.xml | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28f946d..f385cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,16 @@ # 📝 Changelog -[2.4.0.1] - 2025-10-20 +[2.5.0.1] - 2025-11-03 + +🐛 Bug Fixes + +- 自动检测系统代理并设置,提高了兼容性 ⚡ Performance -- 支持恢复默认节点池链接 -- 启动内核时设置一个环境变量,以表示是由GUI启动的进程 +- 优化代理检测和设置 +- 优化版本检测 ⚙️ Miscellaneous Tasks -- *(release)* Update CHANGELOG.md and update.xml for v2.4.0.0 -- 修改更新检查地址 +- 更新Newtonsoft.Json diff --git a/update.xml b/update.xml index 0b3144b..d7a88c9 100644 --- a/update.xml +++ b/update.xml @@ -1,7 +1,7 @@ - 2.4.0.1 - https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.4.0.1/subs-check-win.zip + 2.5.0.1 + https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.5.0.1/subs-check-win.zip https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md true subs-check.win.gui.exe From 2cf5e2763e2be3c86f67e739c6ee311f06dc0df2 Mon Sep 17 00:00:00 2001 From: Sinspired <63581268+sinspired@users.noreply.github.com> Date: Sun, 9 Nov 2025 07:17:46 +0800 Subject: [PATCH 58/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 4ebf001..c1a2018 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # 🚀 SubsCheck-Win-GUI -首先声明,这款软件并非我原创开发。Subs-Check是由 [bestruirui](https://github.com/bestruirui/BestSub) 原创、由 [beck-8](https://github.com/beck-8/subs-check) 进行二次开发,而我所编写的 GUI 仅是在这两位开发者的原始版本基础上进行的 **二次开发**。 - > ✨ 修复界面模糊,支持高DPI缩放,增加自适应高并发内核切换,增加`i386/64`位内核切换,优化自动更新,增加了新的参数设置项。 > 新增:“系统代理”设置,支持系统代理自动检测并设置。 From 30973d396d02580ac25f3a82f9ddad9d09969766 Mon Sep 17 00:00:00 2001 From: Sinspired <63581268+sinspired@users.noreply.github.com> Date: Sun, 9 Nov 2025 07:19:29 +0800 Subject: [PATCH 59/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c1a2018..fe2240a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # 🚀 SubsCheck-Win-GUI +> 内核新增功能详见:[sinspired/subs-check](https://github.com/sinspired/subs-check) + > ✨ 修复界面模糊,支持高DPI缩放,增加自适应高并发内核切换,增加`i386/64`位内核切换,优化自动更新,增加了新的参数设置项。 > 新增:“系统代理”设置,支持系统代理自动检测并设置。 -> 内核新增功能详见:[sinspired/subs-check](https://github.com/sinspired/subs-check) - - **视频教程:[永久免费0门槛!小白也有无限高速代理节点!](https://youtu.be/sS9Tuf1PCyc)** - **数字签名:[关于项目报毒说明](https://www.youtube.com/watch?v=4906t5zygAE&t=123s)** - **Telegram交流群:[@CMLiussss](https://t.me/CMLiussss)** From 0790a7eb778d9ade2d6e883d12ed63a37af458cb Mon Sep 17 00:00:00 2001 From: sinspired Date: Tue, 18 Nov 2025 22:20:22 +0800 Subject: [PATCH 60/92] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E5=9C=B0=E5=9D=80=E7=AA=97=E5=8F=A3=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EditURLs.Designer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/EditURLs.Designer.cs b/EditURLs.Designer.cs index e1a9d68..45f7c05 100644 --- a/EditURLs.Designer.cs +++ b/EditURLs.Designer.cs @@ -55,6 +55,7 @@ private void InitializeComponent() // this.textBox1.Location = new System.Drawing.Point(22, 21); this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox1.MaxLength = 99999999; this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; From 98571f835102877e612db4b05ab7ef7fdfc80c8f Mon Sep 17 00:00:00 2001 From: sinspired Date: Wed, 19 Nov 2025 21:19:36 +0800 Subject: [PATCH 61/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=B8=8D?= =?UTF-8?q?=E6=B5=8B=E9=80=9F=E5=92=8C=E9=9A=8F=E6=9C=BA=E6=B5=8B=E9=80=9F?= =?UTF-8?q?=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 6 +++-- MainGui.cs | 52 ++++++++++++++++++++++++++++++++++---- MainGui.resx | 3 +++ Properties/AssemblyInfo.cs | 4 +-- 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 09044a5..4ba07df 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -878,6 +878,9 @@ private void InitializeComponent() // this.comboBoxSpeedtestUrl.FormattingEnabled = true; this.comboBoxSpeedtestUrl.Items.AddRange(new object[] { + "不测速", + "https://github.com/2dust/v2rayN/releases/download/7.15.7/v2rayN-windows-64-SelfCo" + + "ntained.zip", "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + "Waifu2x-Extension-GUI-v2.21.12-Portable.7z", "https://github.com/2dust/v2rayN/releases/download/7.10.4/v2rayN-windows-64-deskto" + @@ -889,8 +892,7 @@ private void InitializeComponent() this.comboBoxSpeedtestUrl.Name = "comboBoxSpeedtestUrl"; this.comboBoxSpeedtestUrl.Size = new System.Drawing.Size(570, 29); this.comboBoxSpeedtestUrl.TabIndex = 19; - this.comboBoxSpeedtestUrl.Text = "https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/" + - "Waifu2x-Extension-GUI-v2.21.12-Portable.7z"; + this.comboBoxSpeedtestUrl.Text = "不测速"; // // comboBoxGithubProxyUrl // diff --git a/MainGui.cs b/MainGui.cs index d8a2e60..b99e4b4 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -631,10 +631,36 @@ private async void ReadConfig()//读取配置文件 if (downloadLimitSpeedValue.HasValue) numericUpDownTotalBandwidthLimit.Value = downloadLimitSpeedValue.Value; string speedTestUrl = 读取config字符串(config, "speed-test-url"); + if (checkBoxHighConcurrent.Checked && !comboBoxSpeedtestUrl.Items.Contains("random")) + { + // 只有当列表里至少有1个元素时,才能插在第2个位置(索引1) + // 否则只能插在第1个位置(索引0) + int insertIndex = comboBoxSpeedtestUrl.Items.Count > 0 ? 1 : 0; + + comboBoxSpeedtestUrl.Items.Insert(insertIndex, "random"); + } + else + { + comboBoxSpeedtestUrl.Items.Remove("random"); + if (comboBoxSpeedtestUrl.Text == "random") comboBoxSpeedtestUrl.Text = "不测速"; + } + if (speedTestUrl != null) { - comboBoxSpeedtestUrl.Items.Add(speedTestUrl); - comboBoxSpeedtestUrl.Text = speedTestUrl; + if (speedTestUrl == "") + { + comboBoxSpeedtestUrl.Text = "不测速"; + + } + else + { + comboBoxSpeedtestUrl.Items.Add(speedTestUrl); + comboBoxSpeedtestUrl.Text = speedTestUrl; + } + } + else + { + comboBoxSpeedtestUrl.Text = "不测速"; } string listenport = 读取config字符串(config, "listen-port"); @@ -942,8 +968,12 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["total-speed-limit"] = (int)numericUpDownTotalBandwidthLimit.Value; - if (!string.IsNullOrEmpty(comboBoxSpeedtestUrl.Text)) config["speed-test-url"] = comboBoxSpeedtestUrl.Text; - + if (!string.IsNullOrEmpty(comboBoxSpeedtestUrl.Text)) + { + string testURL = comboBoxSpeedtestUrl.Text; + if (comboBoxSpeedtestUrl.Text == "不测速") testURL = ""; + config["speed-test-url"] = testURL; + } // 保存save-method,将"本地"转换为"local" config["save-method"] = comboBoxSaveMethod.Text == "本地" ? "local" : comboBoxSaveMethod.Text; @@ -2242,6 +2272,7 @@ private void comboBox2_Leave(object sender, EventArgs e) // 检查是否有内容 if (string.IsNullOrWhiteSpace(comboBoxSpeedtestUrl.Text)) { + comboBoxSpeedtestUrl.Text = "不测速"; return; } @@ -2572,7 +2603,7 @@ private async Task DetectGitHubProxyAsync(List proxyItems) { // 找到可用代理 detectedProxyURL = $"https://{proxyItem}/"; - richTextBoxAllLog.Clear(); + //richTextBoxAllLog.Clear(); 暂时禁用 Log($"找到可用 GitHub 代理: {proxyItem}", GetRichTextBoxAllLog()); proxyFound = true; break; @@ -4102,8 +4133,19 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg currentKernel = want; if (!EnableHighConcurrent) { + if (comboBoxSpeedtestUrl.Text == "random") comboBoxSpeedtestUrl.Text = "不测速"; + comboBoxSpeedtestUrl.Items.Remove("random"); numericUpDownPipeAlive.Value = 0; numericUpDownPipeSpeed.Value = 0; numericUpDownPipeMedia.Value = 0; } + else if (!comboBoxSpeedtestUrl.Items.Contains("random")) + { + // 只有当列表里至少有1个元素时,才能插在第2个位置(索引1) + // 否则只能插在第1个位置(索引0) + int insertIndex = comboBoxSpeedtestUrl.Items.Count > 0 ? 1 : 0; + + comboBoxSpeedtestUrl.Items.Insert(insertIndex, "random"); + } + checkBoxSwitchArch64.Enabled = true; checkBoxHighConcurrent.Enabled = true; buttonCheckUpdate.Enabled = true; diff --git a/MainGui.resx b/MainGui.resx index de7e7b4..c3120ae 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,6 +3480,9 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 + + 196, 21 + 533, 19 diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 098b233..26b7791 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.5.0.1")] -[assembly: AssemblyFileVersion("2.5.0.1")] +[assembly: AssemblyVersion("2.5.0.2")] +[assembly: AssemblyFileVersion("2.5.0.2")] From feabec783472ef59eeb73abac4791e22aae6dd37 Mon Sep 17 00:00:00 2001 From: sinspired Date: Wed, 19 Nov 2025 21:48:19 +0800 Subject: [PATCH 62/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E7=BB=9F=E8=AE=A1=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 13 +++++++++++++ MainGui.cs | 3 +++ MainGui.resx | 3 --- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 4ba07df..5c79836 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -126,6 +126,7 @@ private void InitializeComponent() this.groupBoxEnhance = new System.Windows.Forms.GroupBox(); this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); + this.checkBoxSubsStats = new System.Windows.Forms.CheckBox(); this.groupBoxComonSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).BeginInit(); @@ -686,6 +687,7 @@ private void InitializeComponent() // // groupBoxAdvanceSettings // + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxSubsStats); this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxOverwriteUrls); this.groupBoxAdvanceSettings.Controls.Add(this.textBoxSubStorePath); this.groupBoxAdvanceSettings.Controls.Add(this.labelSubstoreParh); @@ -1873,6 +1875,16 @@ private void InitializeComponent() this.checkBoxEhanceTag.Text = "增强位置标签"; this.checkBoxEhanceTag.UseVisualStyleBackColor = true; // + // checkBoxSubsStats + // + this.checkBoxSubsStats.AutoSize = true; + this.checkBoxSubsStats.Location = new System.Drawing.Point(192, 130); + this.checkBoxSubsStats.Name = "checkBoxSubsStats"; + this.checkBoxSubsStats.Size = new System.Drawing.Size(162, 25); + this.checkBoxSubsStats.TabIndex = 43; + this.checkBoxSubsStats.Text = "统计订阅信息"; + this.checkBoxSubsStats.UseVisualStyleBackColor = true; + // // MainGui // this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); @@ -2026,6 +2038,7 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox checkBoxEnableSuccessLimit; private System.Windows.Forms.Label labelSubstoreParh; private System.Windows.Forms.TextBox textBoxSubStorePath; + private System.Windows.Forms.CheckBox checkBoxSubsStats; } } diff --git a/MainGui.cs b/MainGui.cs index b99e4b4..8da5b33 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -796,6 +796,9 @@ private async void ReadConfig()//读取配置文件 if (keepSucced != null && keepSucced == "true") checkBoxKeepSucced.Checked = true; else checkBoxKeepSucced.Checked = false; + string SubsStats = 读取config字符串(config, "sub-urls-stats"); + if (SubsStats != null && SubsStats == "true") checkBoxSubsStats.Checked = true; + else checkBoxSubsStats.Checked = false; int? successlimit = 读取config整数(config, "success-limit"); if (successlimit.HasValue) diff --git a/MainGui.resx b/MainGui.resx index c3120ae..de7e7b4 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 - - 196, 21 - 533, 19 From 6943a717c9c8a4fa708400adcdc8211dd27f9e46 Mon Sep 17 00:00:00 2001 From: sinspired Date: Wed, 19 Nov 2025 21:50:46 +0800 Subject: [PATCH 63/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 4 +++- MoreYAML.resx | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 8da5b33..6718ecd 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -112,7 +112,7 @@ public MainGui() toolTip1.SetToolTip(checkBoxEnableMediaCheck, "是否开启流媒体检测,其中IP欺诈依赖'节点地址查询',内核版本需要 v2.0.8 以上\n\n示例:美国1 | ⬇️ 5.6MB/s |0%|Netflix|Disney|Openai\n风控值:0% (使用ping0.cc标准)\n流媒体解锁:Netflix、Disney、Openai"); toolTip1.SetToolTip(comboBoxSysProxy, "系统代理设置: 适用于拉取代理、消息推送、文件上传等等。"); toolTip1.SetToolTip(comboBoxGithubProxyUrl, "GitHub 代理:代理订阅 GitHub raw 节点池。"); - toolTip1.SetToolTip(comboBoxSpeedtestUrl, "测速地址:注意 并发数*节点速度<最大网速 否则测速结果不准确\n尽量不要使用Speedtest,Cloudflare提供的下载链接,因为很多节点屏蔽测速网站。"); + toolTip1.SetToolTip(comboBoxSpeedtestUrl, "测速地址:注意 并发数*节点速度<最大网速 否则测速结果不准确\n尽量不要使用Speedtest,Cloudflare提供的下载链接,因为很多节点屏蔽测速网站。\n可选择 random 使用随机测速地址\n大部分机场屏蔽测速,建议不测速或设置较低的速度上限,实际使用可能更好"); toolTip1.SetToolTip(textBox7, "将测速结果推送到Worker的地址。"); toolTip1.SetToolTip(textBox6, "Worker令牌。"); toolTip1.SetToolTip(comboBoxSaveMethod, "测速结果的保存方法。"); @@ -130,6 +130,7 @@ public MainGui() toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会在内存中保留成功节点以便下次使用(重启后丢失)\n可在订阅链接中添加以下地址作为替代:\n- http://127.0.0.1:8199/all.yaml#KeepSucced\n"); + toolTip1.SetToolTip(checkBoxSubsStats, "勾选会在 /output/stats 文件夹生成每个订阅链接内的节点数量,可用节点数量以及成功率。"); toolTip1.SetToolTip(checkBoxEnableWebUI, "勾选后启用WebUI管理界面\n建议启用\n建议使用 Cloudflare Tunel隧道 映射主机端口\r\n可使用域名编辑、管理配置,开始、结束检测任务\n本地管理地址: http://127.0.0.1:8199/admin\n"); toolTip1.SetToolTip(textBoxWebUiAPIKey, "Web控制面板的api-key"); // 设置通知图标的上下文菜单 @@ -1149,6 +1150,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["rename-node"] = checkBoxEnableRenameNode.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBoxEnableMediaCheck.Checked;//是否开启流媒体检测 config["keep-success-proxies"] = checkBoxKeepSucced.Checked;//是否保留成功的节点 + config["sub-urls-stats"] = checkBoxSubsStats.Checked;//是否统计节点信息 config["print-progress"] = false;//是否显示进度 config["sub-urls-retry"] = 3;//重试次数(获取订阅失败后重试次数) config["subscheck-version"] = 当前subsCheck版本号;//当前subsCheck版本号 diff --git a/MoreYAML.resx b/MoreYAML.resx index 0da9248..7a121b5 100644 --- a/MoreYAML.resx +++ b/MoreYAML.resx @@ -126,7 +126,8 @@ node-prefix: "" # 按提示部署,建议为 Vercel 项目设置自定义域名(国内访问 Vercel 可能受限)。 # 填写搭建的apprise API server 地址 # 示例:https://notify.xxxx.us.kg/notify -apprise-api-server: "" +# 内置apprise服务,不想搭建仅需填写 recipient-url 即可 +apprise-api-server: "https://apprised.netlib.re/notify" # 通知渠道 # 支持100+ 个通知渠道,详细格式请参照 https://github.com/caronc/apprise # 格式参考: From 6b36f5028d662339e6afbfbfdc6a1a21e750ecf9 Mon Sep 17 00:00:00 2001 From: sinspired Date: Wed, 19 Nov 2025 21:52:14 +0800 Subject: [PATCH 64/92] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 8 ++++---- MainGui.resx | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 5c79836..0b5cdb5 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -216,7 +216,7 @@ private void InitializeComponent() this.numericUpDownMinSpeed.Size = new System.Drawing.Size(106, 31); this.numericUpDownMinSpeed.TabIndex = 13; this.numericUpDownMinSpeed.Value = new decimal(new int[] { - 1024, + 128, 0, 0, 0}); @@ -240,7 +240,7 @@ private void InitializeComponent() this.numericUpDownTimeout.Size = new System.Drawing.Size(106, 31); this.numericUpDownTimeout.TabIndex = 12; this.numericUpDownTimeout.Value = new decimal(new int[] { - 5000, + 6000, 0, 0, 0}); @@ -264,7 +264,7 @@ private void InitializeComponent() this.numericUpDownInterval.Size = new System.Drawing.Size(106, 31); this.numericUpDownInterval.TabIndex = 11; this.numericUpDownInterval.Value = new decimal(new int[] { - 120, + 720, 0, 0, 0}); @@ -332,7 +332,7 @@ private void InitializeComponent() this.textBoxCron.Name = "textBoxCron"; this.textBoxCron.Size = new System.Drawing.Size(214, 31); this.textBoxCron.TabIndex = 21; - this.textBoxCron.Text = "0 */2 * * *"; + this.textBoxCron.Text = "0 4,16 * * *"; this.textBoxCron.Visible = false; this.textBoxCron.DoubleClick += new System.EventHandler(this.切换cron表达式); this.textBoxCron.Leave += new System.EventHandler(this.textBoxCron_Leave); diff --git a/MainGui.resx b/MainGui.resx index de7e7b4..c3120ae 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,6 +3480,9 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 + + 196, 21 + 533, 19 From 8728f40b245bd5fb0b218dca439175eeec92311e Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 03:22:20 +0800 Subject: [PATCH 65/92] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E9=BB=98?= =?UTF-8?q?=E8=AE=A4url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/MainGui.cs b/MainGui.cs index 6718ecd..968ce08 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -749,6 +749,18 @@ private async void ReadConfig()//读取配置文件 } } } + string extraURL01 = "https://raw.githubusercontent.com/officialputuid/KangProxy/KangProxy/xResults/old-data/RAW.txt"; + string extraURL02 = "https://raw.githubusercontent.com/officialputuid/KangProxy/KangProxy/xResults/Proxies.txt"; + if (checkBoxHighConcurrent.Checked) + { + if (filteredUrls.Contains(extraURL01) == false) filteredUrls.Add(extraURL01); + if (filteredUrls.Contains(extraURL02) == false) filteredUrls.Add(extraURL02); + } + else + { + if (filteredUrls.Contains(extraURL01) == true) filteredUrls.Remove(extraURL01); + if (filteredUrls.Contains(extraURL02) == true) filteredUrls.Remove(extraURL02); + } // 将过滤后的列表中的每个URL放在单独的行上 textBoxSubsUrls.Text = string.Join(Environment.NewLine, filteredUrls); @@ -4138,12 +4150,14 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg currentKernel = want; if (!EnableHighConcurrent) { + ReadConfig(); if (comboBoxSpeedtestUrl.Text == "random") comboBoxSpeedtestUrl.Text = "不测速"; comboBoxSpeedtestUrl.Items.Remove("random"); numericUpDownPipeAlive.Value = 0; numericUpDownPipeSpeed.Value = 0; numericUpDownPipeMedia.Value = 0; } else if (!comboBoxSpeedtestUrl.Items.Contains("random")) { + ReadConfig(); // 只有当列表里至少有1个元素时,才能插在第2个位置(索引1) // 否则只能插在第1个位置(索引0) int insertIndex = comboBoxSpeedtestUrl.Items.Count > 0 ? 1 : 0; From 11e6bcb5198f237e2cf1f529556a50389184799d Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 03:32:46 +0800 Subject: [PATCH 66/92] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0tips?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 968ce08..a749493 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -76,7 +76,7 @@ public MainGui() toolTip1.SetToolTip(numericUpDownTimeout, "超时时间(毫秒):节点的最大延迟。"); toolTip1.SetToolTip(numericUpDownMinSpeed, "最低测速结果舍弃(KB/s)。"); - toolTip1.SetToolTip(checkBoxHighConcurrent, "启用流水线分段高并发版本内核。"); + toolTip1.SetToolTip(checkBoxHighConcurrent, "启用流水线分段高并发版本内核。\n将同时开启以下功能:\n1. 测活、测速、媒体检测独立并发设置;\n2. 持久化保存并加载历次成功节点;\n3. 统计订阅信息,包括可用节点数量,成功率;\n4. 增强位置标签;\n5. 全新设计的WebUI,一键进入sub-store"); toolTip1.SetToolTip(checkBoxSwitchArch64, "启用64位版本内核。"); toolTip1.SetToolTip(buttonTriggerCheck, "⏯️开始检测:发送开始检测信号,开始检测;\n⏸️结束检测:发送停止信号,内核保持后台运行。"); @@ -130,8 +130,9 @@ public MainGui() toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会在内存中保留成功节点以便下次使用(重启后丢失)\n可在订阅链接中添加以下地址作为替代:\n- http://127.0.0.1:8199/all.yaml#KeepSucced\n"); - toolTip1.SetToolTip(checkBoxSubsStats, "勾选会在 /output/stats 文件夹生成每个订阅链接内的节点数量,可用节点数量以及成功率。"); - toolTip1.SetToolTip(checkBoxEnableWebUI, "勾选后启用WebUI管理界面\n建议启用\n建议使用 Cloudflare Tunel隧道 映射主机端口\r\n可使用域名编辑、管理配置,开始、结束检测任务\n本地管理地址: http://127.0.0.1:8199/admin\n"); + toolTip1.SetToolTip(checkBoxSubsStats, "仅在 “高并发模式“可用”。\n勾选会在 /output/stats 文件夹生成每个订阅链接内的节点数量,可用节点数量以及成功率。"); + toolTip1.SetToolTip(checkBoxEnableWebUI, "勾选后启用WebUI管理界面\n建议启用\n开启后可一键管理sub-store\n建议使用 Cloudflare Tunel隧道 映射主机端口\r\n可使用域名编辑、管理配置,开始、结束检测任务\n本地管理地址: http://127.0.0.1:8199/admin\n"); + toolTip1.SetToolTip(buttonWebUi, "更方便的subs-check管理面板\n可一键分享订阅\n支持一键进入sub-store\n支持远程管理"); toolTip1.SetToolTip(textBoxWebUiAPIKey, "Web控制面板的api-key"); // 设置通知图标的上下文菜单 SetupNotifyIconContextMenu(); From 4159799d09f72ca7d09b7560e674aa17dddc0b6b Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 03:50:28 +0800 Subject: [PATCH 67/92] =?UTF-8?q?fix:=20=E9=AB=98=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E7=A1=AE=E4=BF=9Dsub-store=E8=B7=AF=E5=BE=84=E8=A2=AB=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 23 ++++++++++++----------- MainGui.cs | 18 ++++++++++++++++-- MainGui.resx | 3 --- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 0b5cdb5..93ee385 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -68,6 +68,7 @@ private void InitializeComponent() this.labelLogNodeInfo = new System.Windows.Forms.Label(); this.richTextBoxAllLog = new System.Windows.Forms.RichTextBox(); this.groupBoxAdvanceSettings = new System.Windows.Forms.GroupBox(); + this.checkBoxSubsStats = new System.Windows.Forms.CheckBox(); this.comboBoxOverwriteUrls = new System.Windows.Forms.ComboBox(); this.textBoxSubStorePath = new System.Windows.Forms.TextBox(); this.labelSubstoreParh = new System.Windows.Forms.Label(); @@ -126,7 +127,6 @@ private void InitializeComponent() this.groupBoxEnhance = new System.Windows.Forms.GroupBox(); this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); - this.checkBoxSubsStats = new System.Windows.Forms.CheckBox(); this.groupBoxComonSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).BeginInit(); @@ -727,6 +727,16 @@ private void InitializeComponent() this.groupBoxAdvanceSettings.Text = "高级设置"; this.groupBoxAdvanceSettings.Visible = false; // + // checkBoxSubsStats + // + this.checkBoxSubsStats.AutoSize = true; + this.checkBoxSubsStats.Location = new System.Drawing.Point(192, 130); + this.checkBoxSubsStats.Name = "checkBoxSubsStats"; + this.checkBoxSubsStats.Size = new System.Drawing.Size(162, 25); + this.checkBoxSubsStats.TabIndex = 43; + this.checkBoxSubsStats.Text = "统计订阅信息"; + this.checkBoxSubsStats.UseVisualStyleBackColor = true; + // // comboBoxOverwriteUrls // this.comboBoxOverwriteUrls.FormattingEnabled = true; @@ -758,6 +768,7 @@ private void InitializeComponent() // // textBoxSubStorePath // + this.textBoxSubStorePath.BackColor = System.Drawing.SystemColors.Window; this.textBoxSubStorePath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.textBoxSubStorePath.ForeColor = System.Drawing.SystemColors.WindowFrame; this.textBoxSubStorePath.Location = new System.Drawing.Point(914, 175); @@ -1875,16 +1886,6 @@ private void InitializeComponent() this.checkBoxEhanceTag.Text = "增强位置标签"; this.checkBoxEhanceTag.UseVisualStyleBackColor = true; // - // checkBoxSubsStats - // - this.checkBoxSubsStats.AutoSize = true; - this.checkBoxSubsStats.Location = new System.Drawing.Point(192, 130); - this.checkBoxSubsStats.Name = "checkBoxSubsStats"; - this.checkBoxSubsStats.Size = new System.Drawing.Size(162, 25); - this.checkBoxSubsStats.TabIndex = 43; - this.checkBoxSubsStats.Text = "统计订阅信息"; - this.checkBoxSubsStats.UseVisualStyleBackColor = true; - // // MainGui // this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); diff --git a/MainGui.cs b/MainGui.cs index a749493..2e4d941 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -76,7 +76,7 @@ public MainGui() toolTip1.SetToolTip(numericUpDownTimeout, "超时时间(毫秒):节点的最大延迟。"); toolTip1.SetToolTip(numericUpDownMinSpeed, "最低测速结果舍弃(KB/s)。"); - toolTip1.SetToolTip(checkBoxHighConcurrent, "启用流水线分段高并发版本内核。\n将同时开启以下功能:\n1. 测活、测速、媒体检测独立并发设置;\n2. 持久化保存并加载历次成功节点;\n3. 统计订阅信息,包括可用节点数量,成功率;\n4. 增强位置标签;\n5. 全新设计的WebUI,一键进入sub-store"); + toolTip1.SetToolTip(checkBoxHighConcurrent, "启用高并发内核。\n将同时开启以下功能:\n1. 测活、测速、媒体检测独立并发设置;\n2. 持久化保存并加载历次成功节点;\n3. 统计订阅信息,包括可用节点数量,成功率;\n4. 增强位置标签;\n5. 全新设计的WebUI,一键进入sub-store"); toolTip1.SetToolTip(checkBoxSwitchArch64, "启用64位版本内核。"); toolTip1.SetToolTip(buttonTriggerCheck, "⏯️开始检测:发送开始检测信号,开始检测;\n⏸️结束检测:发送停止信号,内核保持后台运行。"); @@ -881,8 +881,12 @@ private async void ReadConfig()//读取配置文件 textBoxSubStorePath.Text = substorePath; } + else + { + textBoxSubStorePath.Text = GetComputerNameMD5(); + } - string cronexpression = 读取config字符串(config, "cron-expression"); + string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { textBoxCron.Text = cronexpression; @@ -1032,6 +1036,11 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 // 如果是默认提示文字或仅有 "/",则清空 if (substorePath == "/请输入路径" || substorePath == "/") substorePath = ""; + if (checkBoxHighConcurrent.Checked && substorePath == "") + { + substorePath = GetComputerNameMD5(); + } + config["sub-store-path"] = substorePath; // 保存sub-store-port @@ -1307,6 +1316,11 @@ private async void buttonStartCheck_Click(object sender, EventArgs e) MessageBox.Show("您已启用WebUI,请设置WebUI API密钥!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } + if (checkBoxHighConcurrent.Checked && textBoxSubStorePath.Text == "请输入路径") + { + MessageBox.Show("请设置Sub-Store路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } run = 1; if (buttonCopySubscriptionUrl.Enabled == false) { diff --git a/MainGui.resx b/MainGui.resx index c3120ae..de7e7b4 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,9 +3480,6 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 - - 196, 21 - 533, 19 From b1eaac4c5e4cedbba50fdfe5d191031a379f5040 Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 03:58:24 +0800 Subject: [PATCH 68/92] chore: bump version to v2.6.0.0 --- .github/workflows/publish.yml | 5 +++++ Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fd2762f..fe0ede8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -141,5 +141,10 @@ jobs: 版本: `${{ github.ref_name }}` 项目: `${{ github.repository }}` + 更新说明: + - 支持高并发内核新特性 + - 支持统计订阅链接信息 + - 优化默认参数,提高检测成功率 + - 新内核集成 sub-store 前后端,可通过WebUI一键管理 🔗 [查看详情](https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}) \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 26b7791..2de300f 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.5.0.2")] -[assembly: AssemblyFileVersion("2.5.0.2")] +[assembly: AssemblyVersion("2.6.0.0")] +[assembly: AssemblyFileVersion("2.6.0.0")] From ea05f8ea7ec976c6df6895d09f8f50bc211e863e Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 04:42:45 +0800 Subject: [PATCH 69/92] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 125 +++++++++++++++++++++++++++--------------------------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index fe2240a..52f21da 100644 --- a/README.md +++ b/README.md @@ -1,88 +1,86 @@ # 🚀 SubsCheck-Win-GUI -> 内核新增功能详见:[sinspired/subs-check](https://github.com/sinspired/subs-check) +[![GUI 版本](https://img.shields.io/github/v/release/sinspired/SubsCheck-Win-GUI?logo=github)](https://github.com/sinspired/SubsCheck-Win-GUI/releases) +[![内核](https://img.shields.io/github/v/release/sinspired/subs-check?display_name=release&style=social&logo=github&label=subs-check性能版)](https://github.com/sinspired/subs-check/releases/latest) -> ✨ 修复界面模糊,支持高DPI缩放,增加自适应高并发内核切换,增加`i386/64`位内核切换,优化自动更新,增加了新的参数设置项。 -> 新增:“系统代理”设置,支持系统代理自动检测并设置。 +本项目基于CM的大量工作,已提PR。支持高并发内核切换,支持64位;支持高dpi显示器,解决界面字体模糊等问题;添加下载大小限制,降低节点被测死的概率;新内核支持一键管理 `sub-store` -- **视频教程:[永久免费0门槛!小白也有无限高速代理节点!](https://youtu.be/sS9Tuf1PCyc)** -- **数字签名:[关于项目报毒说明](https://www.youtube.com/watch?v=4906t5zygAE&t=123s)** -- **Telegram交流群:[@CMLiussss](https://t.me/CMLiussss)** +## ✨ 新增功能 -# ⚠️ 免责声明 +- [x] 🖥️ 修复界面模糊,支持 **高 DPI 缩放** +- [x] ⚡ 自动检测并设置系统代理 +- [x] 🔄 增加 **自适应高并发内核切换**,减少无谓的生命浪费 +- [x] 🧩 增加 **i386/64 位内核切换** +- [x] 🔧 新增 **性能版内核参数** +- [x] 🚀 优化 **自动更新机制** +- [x] 🌐 现代化 WebUI,优化移动端访问体验 +- [x] 🛠️ 一键管理 `**sub-store**` +- [x] 📊 统计订阅链接总数、可用节点数量、成功率 +- [ ] 🌙 支持深色模式 -本项目仅供学习、研究与安全测试使用,请勿用于任何非法活动。使用前请确保您已了解并遵守所在地的法律法规。 +> [!TIP] +> 功能更新频繁,请务必查看最新的 [配置文件示例](https://github.com/sinspired/subs-check/blob/main/config/config.example.yaml) 以获取最新功能支持。 -### 📋 使用条款 +- **内核地址**:[subs-check 性能版,支持 Docker 部署](https://github.com/sinspired/subs-check) +- **Telegram 交流群**:[@Sinspired](https://t.me/subs_check_pro) + +## ⚠️ 免责声明 -- **教育与研究用途**:本软件仅可用于网络技术和编程领域的学习、研究和安全测试。 -- **禁止非法使用**:严禁将 **SubsCheck-Win-GUI** 用于任何非法活动或违反使用者所在地区法律法规的行为。 -- **使用时限**:基于学习和研究目的,建议用户在完成研究或学习后,或在安装后的**24小时内,删除本软件及所有相关文件。** -- **免责声明**:**SubsCheck-Win-GUI** 的创建者和贡献者不对因使用或滥用本软件而导致的任何损害或法律问题负责。 -- **用户责任**:**用户对使用本软件的方式以及由此产生的任何后果完全负责。** -- **无技术支持**:本软件的创建者不提供任何技术支持或使用协助。 -- **知情同意**:使用 **SubsCheck-Win-GUI** 即表示您已阅读并理解本免责声明,并同意受其条款的约束。 +本项目仅供 **学习、研究与安全测试** 使用,请勿用于任何非法活动。使用前请确保您已了解并遵守所在地的法律法规。 -> [!WARNING] -> **请记住**:本软件的主要目的是促进学习、研究和安全测试。作者不支持或认可任何其他用途。使用者应当在合法和负责任的前提下使用本工具。 +### 📋 使用条款 ---- +- **教育与研究用途**:仅限学习、研究和安全测试 +- **禁止非法使用**:严禁用于违法行为 +- **使用时限**:建议安装后 **24 小时内删除** +- **免责声明**:作者不对任何损害或法律问题负责 +- **用户责任**:用户需自行承担使用后果 +- **无技术支持**:作者不提供技术支持 +- **知情同意**:使用即表示同意上述条款 -![GUI](./gui.png) +> [!WARNING] +> 本软件的主要目的是促进学习、研究和安全测试。请在合法和负责任的前提下使用。 ## 🖥️ 系统要求 -- **操作系统**: Windows 10/11 (32位/64位) -- **.NET 框架**: .NET Framework 4.7.2 或更高版本 - -> [!CAUTION] -> **系统兼容性说明**: 本软件不支持Windows 7及更早版本。因为核心组件subs-check使用Go语言编译,而Go 1.19及以后版本已正式放弃对Windows 7的支持。 +- **操作系统**: Windows 10/11 (32位/64位) +- **.NET 框架**: .NET Framework 4.7.2 或更高版本 -## 💾 测速结果 保存方法 +> [!CAUTION] +> 不支持 Windows 7 及更早版本(Go 1.19+ 已放弃支持)。 -- **本地**:将结果保存到本地,默认保存到可执行文件目录下的 output 文件夹 -- **r2**:将结果保存到 cloudflare r2 存储桶 [配置方法](https://github.com/beck-8/subs-check/blob/master/doc/r2.md) -- **gist**:将结果保存到 github gist [配置方法](https://github.com/beck-8/subs-check/blob/master/doc/gist.md) -- **webdav**:将结果保存到 webdav 服务器 [配置方法](https://github.com/beck-8/subs-check/blob/master/doc/webdav.md) +## 💾 测速结果保存方式 -## 📦 关于 Github Proxy +- **本地**:保存到 `output` 文件夹 +- **r2**:保存到 Cloudflare R2 存储桶 → [配置方法](https://github.com/sinspired/subs-check/blob/master/doc/r2.md) +- **gist**:保存到 GitHub Gist → [配置方法](https://github.com/sinspired/subs-check/blob/master/doc/gist.md) +- **webdav**:保存到 WebDAV 服务器 → [配置方法](https://github.com/sinspired/subs-check/blob/master/doc/webdav.md) -- **Github Proxy**:本项目使用了 `Github Proxy` 来加速 GUI 必要内容的加载。 +## 📦 Github Proxy -> [!Tip] -> 你也可以通过 项目来搭建自己专属的 **Github Proxy**。 +本项目使用 `Github Proxy` 加速 GUI 必要内容加载。 +你也可以通过 [CF-Workers-GitHub](https://github.com/cmliu/CF-Workers-GitHub) 搭建自己的代理。 -## 📁 GUI 文件结构 +## 📁 文件结构 ```shell -subs-check.win.gui.exe # GUI本体 -subs-check.exe # subs-check x86_32位 内核本体  -subs-check_Windows_i386.zip # subs-check x86_32位 内核压缩包  -# Upgrade.exe # 升级程序(已使用AutoUpdater替换) -# Upgrade.ini # 升级配置文件(已使用AutoUpdater替换) -config - ├─ config.yaml # subs-check 配置文件  - └─ more.yaml # 补充YAML参数配置文件  -output - ├─ ACL4SSR_Online_Full.yaml # ACL4SSR_Online_Full.yaml 覆写配置文件 - ├─ all.yaml # yaml格式 上次成功测试结果 - ├─ history.yaml # yaml格式 历次成功测试结果 - ├─ base64.txt # base64格式 测试结果 - ├─ bdg.yaml # 布丁狗的订阅转换.yaml 覆写配置文件 - ├─ mihomo.yaml # clash订阅文件 带分流规则 - ├─ node.exe # sub-store 服务 - ├─ root.json # sub-store 配置文件 - ├─ sub-store.bundle.js # sub-store js文件 - ├─ sub-store.json # sub-store json文件 +subs-check.win.gui.exe # GUI 主程序 +subs-check.exe # subs-check x86_32 内核 +subs-check_Windows_i386.zip # subs-check 内核压缩包 +config/ + ├─ config.yaml # 主配置文件 + └─ more.yaml # 补充参数配置文件 +output/ + ├─ all.yaml # 上次成功测试结果 + ├─ history.yaml # 历次成功测试结果 + ├─ base64.txt # Base64 格式结果 + ├─ mihomo.yaml # Clash 订阅文件 + ├─ sub-store.* # sub-store 相关文件 └─ sub-store.log # sub-store 日志 -Newtonsoft.Json.dll # 验证版本信息组件 -YamlDotNet.dll # yaml读写组件 -# AutoUpdater 依赖和语言支持 -AutoUpdater.NET.dll -Microsoft.Web.WebView2.Core.dll -Microsoft.Web.WebView2.WinForms.dll -runtimes\ -zh\ # 中文语言包 +AutoUpdater.NET.dll # 自动更新依赖 +Microsoft.Web.WebView2.* # WebView2 组件 +Newtonsoft.Json.dll # JSON 组件 +YamlDotNet.dll # YAML 组件 ``` ## ⭐ Star 星星走起 @@ -92,8 +90,9 @@ zh\ # 中文语言包 ## 💻 已适配客户端 - [v2rayN](https://github.com/2dust/v2rayN) +- [singbox](https://github.com/SagerNet/sing-box) - [mihomo-party](https://github.com/mihomo-party-org/mihomo-party),[FlClash](https://github.com/chen08209/FlClash),[clash-verge-rev](https://github.com/clash-verge-rev/clash-verge-rev),[Clash Nyanpasu](https://github.com/keiko233/clash-nyanpasu) -# 🙏 致谢 +## 🙏 致谢 [beck-8](https://github.com/beck-8/subs-check)、[bestruirui](https://github.com/bestruirui/BestSub)、[Sub-Store](https://github.com/sub-store-org/Sub-Store)、GPT From 82a1f9c35d18337d7deeec33f8af973a7c0b8832 Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 04:44:23 +0800 Subject: [PATCH 70/92] =?UTF-8?q?chore(CI):=20=E6=9B=B4=E6=96=B0release?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fe0ede8..5abd6c1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -143,7 +143,7 @@ jobs: 项目: `${{ github.repository }}` 更新说明: - 支持高并发内核新特性 - - 支持统计订阅链接信息 + - 支持统计订阅链接总数、可用节点数量、成功率 - 优化默认参数,提高检测成功率 - 新内核集成 sub-store 前后端,可通过WebUI一键管理 From f44c726e7d22ce604494a680aed45e89e99da465 Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 18:05:21 +0800 Subject: [PATCH 71/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=B7=BB=E5=8A=A0singbox=E8=AE=A2=E9=98=85=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 2e4d941..1e9f58e 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -559,7 +559,14 @@ private async void ReadConfig()//读取配置文件 if (checkBoxHighConcurrent.Checked) { - comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.11", "Singbox1.12" }); + if (!comboBoxSubscriptionType.Items.Contains("Singbox1.11")) + { + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.11" }); + } + if (!comboBoxSubscriptionType.Items.Contains("Singbox1.12")) + { + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.12" }); + } } // 根据是否启用高并发,调整界面布局 @@ -883,10 +890,10 @@ private async void ReadConfig()//读取配置文件 } else { - textBoxSubStorePath.Text = GetComputerNameMD5(); + textBoxSubStorePath.Text = GetComputerNameMD5(); } - string cronexpression = 读取config字符串(config, "cron-expression"); + string cronexpression = 读取config字符串(config, "cron-expression"); if (cronexpression != null) { textBoxCron.Text = cronexpression; @@ -4152,7 +4159,14 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg } if (checkBoxHighConcurrent.Checked) { - comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.11", "Singbox1.12" }); + if (!comboBoxSubscriptionType.Items.Contains("Singbox1.11")) + { + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.11" }); + } + if (!comboBoxSubscriptionType.Items.Contains("Singbox1.12")) + { + comboBoxSubscriptionType.Items.AddRange(new object[] { "Singbox1.12" }); + } } } From 79a3285aa1e13610f963b7dd499134c0f8afa706 Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 18:06:06 +0800 Subject: [PATCH 72/92] chore: bump version to v2.6.0.1 --- Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 2de300f..7261d1e 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.6.0.0")] -[assembly: AssemblyFileVersion("2.6.0.0")] +[assembly: AssemblyVersion("2.6.0.1")] +[assembly: AssemblyFileVersion("2.6.0.1")] From 72b5b3af1ff464eb094c6ee4852f625e04a4360c Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 20:05:44 +0800 Subject: [PATCH 73/92] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E2=80=9C?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E5=8F=82=E6=95=B0=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoreYAML.resx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/MoreYAML.resx b/MoreYAML.resx index 7a121b5..463f424 100644 --- a/MoreYAML.resx +++ b/MoreYAML.resx @@ -170,16 +170,17 @@ prerelease: false # 请输入整数 update-timeout: 2 -# platforms: -# - iprisk -# - openai -# - gemini -# - tiktok -# - youtube -# - netflix -# - disney -# - x - +# 媒体解锁检测平台 +platforms: + - iprisk + - openai + - gemini + - youtube + # - tiktok + # - netflix + # - disney + # - x + # 只测试指定协议的节点 node-type: # - ss From bced972d0dc07e031704994fd20fffc26b94a069 Mon Sep 17 00:00:00 2001 From: sinspired Date: Thu, 20 Nov 2025 23:28:59 +0800 Subject: [PATCH 74/92] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=82=B9?= =?UTF-8?q?=E9=80=89=E5=AA=92=E4=BD=93=E8=A7=A3=E9=94=81=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 54 ++++++++++++++++++++++++++-- PlatformSelectorForm.Designer.cs | 39 +++++++++++++++++++++ PlatformSelectorForm.cs | 60 ++++++++++++++++++++++++++++++++ subs-check.win.gui.csproj | 6 ++++ 4 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 PlatformSelectorForm.Designer.cs create mode 100644 PlatformSelectorForm.cs diff --git a/MainGui.cs b/MainGui.cs index 1e9f58e..99fa8ca 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -59,6 +59,12 @@ public partial class MainGui : Form private Point _enhanceOriginalLocation; private bool _originalLocationSaved = false; + // 存储媒体解锁平台数组 + private List selectedPlatforms = new List(); + + // 是否需要选择媒体解锁平台 + private bool NeedSelectPlatforms = true; + public MainGui() { InitializeComponent(); @@ -778,6 +784,17 @@ private async void ReadConfig()//读取配置文件 if (renamenode != null && renamenode == "true") checkBoxEnableRenameNode.Checked = true; else checkBoxEnableRenameNode.Checked = false; + List platforms = 读取config列表(config, "platforms"); + if (platforms != null && platforms.Count > 0) + { + selectedPlatforms = platforms; + NeedSelectPlatforms = false; + } + else + { + selectedPlatforms = new List(); + } + string mediacheck = 读取config字符串(config, "media-check"); if (mediacheck != null && mediacheck == "true") checkBoxEnableMediaCheck.Checked = true; else checkBoxEnableMediaCheck.Checked = false; @@ -1178,6 +1195,12 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["rename-node"] = checkBoxEnableRenameNode.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBoxEnableMediaCheck.Checked;//是否开启流媒体检测 + + if (selectedPlatforms != null && selectedPlatforms.Count > 0) + { + config["platforms"] = selectedPlatforms;// 保存平台数组 + } + config["keep-success-proxies"] = checkBoxKeepSucced.Checked;//是否保留成功的节点 config["sub-urls-stats"] = checkBoxSubsStats.Checked;//是否统计节点信息 config["print-progress"] = false;//是否显示进度 @@ -2923,11 +2946,38 @@ private void checkBoxEnableRenameNode_CheckedChanged(object sender, EventArgs e) if (checkBoxEnableRenameNode.Checked == false) checkBoxEnableMediaCheck.Checked = false; } + private void checkBoxEnableMediaCheck_CheckedChanged(object sender, EventArgs e) { - if (checkBoxEnableMediaCheck.Checked == true) checkBoxEnableRenameNode.Checked = true; + if (checkBoxEnableMediaCheck.Checked) + { + // 启用流媒体检测时,自动启用重命名节点 + checkBoxEnableRenameNode.Checked = true; + + if (NeedSelectPlatforms) + { + using (var selector = new PlatformSelectorForm(selectedPlatforms)) + { + if (selector.ShowDialog() == DialogResult.OK) + { + // 只更新变量,不直接写文件 + selectedPlatforms = selector.SelectedPlatforms; + if (selectedPlatforms.Count == 0) + { + checkBoxEnableMediaCheck.Checked = false; + } + } + } + } + else + { + NeedSelectPlatforms = true; + } + } } + + private async void timerRestartSchedule_Tick(object sender, EventArgs e) { if (buttonStartCheck.Text == "⏹️ 停止") @@ -3342,7 +3392,7 @@ private async Task GetApiStatusAsync() resultArray[5] = "N/A"; // 可选:记录错误到日志 - Log($"获取API状态失败: {ex.Message}", GetRichTextBoxAllLog(), true); + // Log($"获取API状态失败: {ex.Message}", GetRichTextBoxAllLog(), true); } return resultArray; diff --git a/PlatformSelectorForm.Designer.cs b/PlatformSelectorForm.Designer.cs new file mode 100644 index 0000000..89e2df3 --- /dev/null +++ b/PlatformSelectorForm.Designer.cs @@ -0,0 +1,39 @@ +namespace subs_check.win.gui +{ + partial class PlatformSelectorForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "PlatformSelectorForm"; + } + + #endregion + } +} \ No newline at end of file diff --git a/PlatformSelectorForm.cs b/PlatformSelectorForm.cs new file mode 100644 index 0000000..c3f8520 --- /dev/null +++ b/PlatformSelectorForm.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace subs_check.win.gui +{ + public partial class PlatformSelectorForm : Form + { + public List SelectedPlatforms { get; private set; } = new List(); + + public PlatformSelectorForm(List preSelected) + { + InitializeComponent(); + + string[] platforms = { "iprisk", "openai", "gemini", "youtube", "tiktok", "netflix", "disney", "x" }; + + int y = 20; + foreach (var p in platforms) + { + var cb = new CheckBox + { + Text = p, + Left = 20, + Top = y, + AutoSize = true, + Checked = preSelected != null && preSelected.Contains(p) + }; + this.Controls.Add(cb); + y += 30; + } + + var btnOk = new Button + { + Text = "确定", + Left = 20, + Top = y, + Width = 80 + }; + btnOk.Click += BtnOk_Click; + this.Controls.Add(btnOk); + + this.Text = "选择平台"; + this.Width = 250; + this.Height = y + 80; + } + private void BtnOk_Click(object sender, EventArgs e) + { + SelectedPlatforms.Clear(); + foreach (var control in this.Controls) + { + if (control is CheckBox cb && cb.Checked) + { + SelectedPlatforms.Add(cb.Text); + } + } + this.DialogResult = DialogResult.OK; + this.Close(); + } + } +} diff --git a/subs-check.win.gui.csproj b/subs-check.win.gui.csproj index b0da823..ac2df30 100644 --- a/subs-check.win.gui.csproj +++ b/subs-check.win.gui.csproj @@ -146,6 +146,12 @@ MoreYAML.cs + + Form + + + PlatformSelectorForm.cs + From 2d7ceb4a72996662c9ee2ff27b6ed17ee4eb024b Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 00:07:12 +0800 Subject: [PATCH 75/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E8=A7=A3=E9=94=81=E7=AA=97=E4=BD=93=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PlatformSelectorForm.cs | 174 +++++++++++++++++++++++++++++++++------- 1 file changed, 146 insertions(+), 28 deletions(-) diff --git a/PlatformSelectorForm.cs b/PlatformSelectorForm.cs index c3f8520..3209264 100644 --- a/PlatformSelectorForm.cs +++ b/PlatformSelectorForm.cs @@ -1,60 +1,178 @@ using System; using System.Collections.Generic; +using System.Drawing; +using System.Linq; using System.Windows.Forms; namespace subs_check.win.gui { public partial class PlatformSelectorForm : Form { + // 公开属性获取结果 public List SelectedPlatforms { get; private set; } = new List(); + // 保存 CheckBox 的引用,避免在 Click 事件中遍历 UI 树 + private List _checkBoxList = new List(); + + private readonly string[] _platforms = + { + "iprisk", "openai", "gemini", "youtube", + "tiktok", "netflix", "disney", "x" + }; + public PlatformSelectorForm(List preSelected) { InitializeComponent(); + InitializeCustomComponents(preSelected); + } + + private void InitializeCustomComponents(List preSelected) + { + // 1. 窗体基础设置 + this.Text = "媒体解锁检测"; + this.Font = new Font("宋体", 9F); + this.FormBorderStyle = FormBorderStyle.FixedDialog; + this.StartPosition = FormStartPosition.CenterParent; + this.MinimizeBox = false; + this.MaximizeBox = false; + this.AutoSize = true; + this.AutoSizeMode = AutoSizeMode.GrowAndShrink; + this.BackColor = Color.WhiteSmoke; - string[] platforms = { "iprisk", "openai", "gemini", "youtube", "tiktok", "netflix", "disney", "x" }; + // 2. 主布局:两列 (左侧列表 | 右侧按钮) + var mainLayout = new TableLayoutPanel + { + Dock = DockStyle.Fill, + AutoSize = true, + AutoSizeMode = AutoSizeMode.GrowAndShrink, + ColumnCount = 2, + RowCount = 1, + Padding = new Padding(0) // 移除外边距,由内部控件控制 + }; - int y = 20; - foreach (var p in platforms) + // 左列自适应,右列固定宽度 + mainLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); + mainLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 140F)); + + // ==================== 左侧:复选框列表区域 ==================== + var listPanel = new FlowLayoutPanel + { + FlowDirection = FlowDirection.TopDown, + AutoSize = true, + AutoSizeMode = AutoSizeMode.GrowAndShrink, + WrapContents = false, + Padding = new Padding(20, 20, 20, 20), + Dock = DockStyle.Fill + }; + + _checkBoxList.Clear(); + foreach (var platform in _platforms) { var cb = new CheckBox { - Text = p, - Left = 20, - Top = y, + Text = GetFriendlyName(platform), + // 虽然窗体设置了宋体,但为了可读性,建议内容控件稍微大一点 + Font = new Font("宋体", 9F), AutoSize = true, - Checked = preSelected != null && preSelected.Contains(p) + Margin = new Padding(5, 8, 5, 8), // 增加垂直间距 + Cursor = Cursors.Hand, + Checked = preSelected != null && preSelected.Contains(platform), + Tag = platform }; - this.Controls.Add(cb); - y += 30; + + _checkBoxList.Add(cb); + listPanel.Controls.Add(cb); } - var btnOk = new Button + // ==================== 右侧:按钮区域 ==================== + var actionPanel = new FlowLayoutPanel { - Text = "确定", - Left = 20, - Top = y, - Width = 80 + FlowDirection = FlowDirection.TopDown, + AutoSize = true, + Dock = DockStyle.Fill, + Padding = new Padding(15, 25, 15, 20), // 上边距加大,与列表对齐 + BackColor = Color.FromArgb(245, 246, 247) // 浅灰背景,区分功能区 }; + + var btnOk = CreateStyledButton("确定", DialogResult.OK, Color.FromArgb(0, 120, 215), Color.White); btnOk.Click += BtnOk_Click; - this.Controls.Add(btnOk); - this.Text = "选择平台"; - this.Width = 250; - this.Height = y + 80; + var btnCancel = CreateStyledButton("取消", DialogResult.Cancel, Color.White, Color.Black); + // 取消按钮加个边框色 + btnCancel.FlatAppearance.BorderColor = Color.FromArgb(200, 200, 200); + btnCancel.FlatAppearance.BorderSize = 1; + + actionPanel.Controls.Add(btnOk); + actionPanel.Controls.Add(btnCancel); + + // ==================== 组装 ==================== + mainLayout.Controls.Add(listPanel, 0, 0); + mainLayout.Controls.Add(actionPanel, 1, 0); + + this.Controls.Add(mainLayout); + + this.AcceptButton = btnOk; + this.CancelButton = btnCancel; } - private void BtnOk_Click(object sender, EventArgs e) + + /// + /// 创建统一风格的按钮 + /// + private Button CreateStyledButton(string text, DialogResult result, Color bg, Color fg) { - SelectedPlatforms.Clear(); - foreach (var control in this.Controls) + var btn = new Button { - if (control is CheckBox cb && cb.Checked) - { - SelectedPlatforms.Add(cb.Text); - } + Text = text, + DialogResult = result, + Size = new Size(100, 36), + Font = new Font("宋体", 10F), // 按钮也使用宋体 + FlatStyle = FlatStyle.Flat, + BackColor = bg, + ForeColor = fg, + Margin = new Padding(0, 0, 0, 15), // 按钮之间的间距 + Cursor = Cursors.Hand + }; + + btn.FlatAppearance.BorderSize = 0; + + // 简单的悬停效果逻辑 + if (bg != Color.White) + { + // 深色按钮变亮 + btn.FlatAppearance.MouseOverBackColor = ControlPaint.Light(bg); + } + else + { + // 浅色按钮变灰 + btn.FlatAppearance.MouseOverBackColor = Color.FromArgb(230, 230, 230); + } + + return btn; + } + + private string GetFriendlyName(string key) + { + switch (key) + { + case "x": return "X(Twitter)"; + case "iprisk": return "IPRisk(风控)"; + case "openai": return "OpenAI/ChatGPT"; + case "gemini": return "Gemini"; + case "youtube": return "YouTube"; + case "tiktok": return "TikTok"; + case "netflix": return "Netflix"; + case "disney": return "Disney+"; + default: return char.ToUpper(key[0]) + key.Substring(1); } - this.DialogResult = DialogResult.OK; - this.Close(); + } + + private void BtnOk_Click(object sender, EventArgs e) + { + // 优化:直接遍历已保存的 List,无需在控件树中查找 + SelectedPlatforms = _checkBoxList + .Where(cb => cb.Checked) + .Select(cb => cb.Tag.ToString()) + .ToList(); } } -} +} \ No newline at end of file From 694d83096836a5b0e414081788305fb69bd76894 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 00:11:52 +0800 Subject: [PATCH 76/92] =?UTF-8?q?chore:=20=E6=B8=85=E7=90=86=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoreYAML.resx | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/MoreYAML.resx b/MoreYAML.resx index 463f424..305f1c0 100644 --- a/MoreYAML.resx +++ b/MoreYAML.resx @@ -146,40 +146,16 @@ notify-title: "🔔 节点状态更新" # 符合条件节点数量的占比,低于此值会将订阅链接打印出来,用于排查质量差的订阅 success-rate: 0 -# 是否显示检测进度 -print-progress: false -# 进度条显示模式: -# "auto": 根据测活-测速-媒体检测的阶段权重自动显示 -# "stage": 每个阶段完成,显示下一阶段剩余任务 -progress-mode: auto - # 是否开启新版本更新 # 支持启动时检查更新及定时更新任务,无缝升级新版本 # 支持apprise API通知渠道 # true: 自动更新; false: 不更新 update: false -# 启动时检查更新版本 -update-on-startup: true # 定时检查更新 # "0 0,9,21 * * *" 默认每天0点,9点,21点检查更新 cron-check-update: "0 0,9,21 * * *" # 使用预发布版本 prerelease: false -# 下载新版本超时时间(分钟)(默认2分钟) -# 如系统代理和github代理不稳定,可适当调大即可 -# 请输入整数 -update-timeout: 2 - -# 媒体解锁检测平台 -platforms: - - iprisk - - openai - - gemini - - youtube - # - tiktok - # - netflix - # - disney - # - x # 只测试指定协议的节点 node-type: @@ -206,12 +182,6 @@ singbox-old: - https://raw.githubusercontent.com/sinspired/sub-store-template/main/1.11.x/sing-box.json js: - https://raw.githubusercontent.com/sinspired/sub-store-template/main/1.11.x/sing-box.js - -ghproxy-group: - - https://ghp.yeye.f5.si/ - - https://git.llvho.com/ - - https://hub.885666.xyz/ - - https://p.jackyu.cn/ - - https://github.cnxiaobai.com/ + \ No newline at end of file From 186639f7de4bf7a6004dbf19ad714cf203066e26 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 00:28:47 +0800 Subject: [PATCH 77/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=B1=80?= =?UTF-8?q?=E5=9F=9F=E7=BD=91ip=E9=80=89=E6=8B=A9=E7=AA=97=E4=BD=93?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 204 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 115 insertions(+), 89 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 99fa8ca..61752b3 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -2177,101 +2177,127 @@ private string GetLocalLANIP() else { // 创建选择窗口 - Form selectForm = new Form(); - selectForm.Text = "选择局域网IP地址"; - selectForm.StartPosition = FormStartPosition.CenterParent; - /* - selectForm.Width = 520; // 保持宽度 - selectForm.Height = 320; // 增加高度以容纳额外的警告标签 - selectForm.FormBorderStyle = FormBorderStyle.FixedDialog; - */ - selectForm.AutoSize = true; // 启用自动大小调整 - selectForm.AutoSizeMode = AutoSizeMode.GrowAndShrink; // 根据内容调整大小 - selectForm.FormBorderStyle = FormBorderStyle.FixedSingle; // 使用固定但可调整的边框 - selectForm.ShowIcon = false; - selectForm.MaximizeBox = false; - selectForm.MinimizeBox = false; - - // 添加说明标签 - Label label = new Label(); - label.Text = "发现多个局域网IP地址:\n\n" + - "· 仅在本机访问:直接点击【取消】,将使用127.0.0.1\n\n" + - "· 局域网内其他设备访问:请在下面列表中选择一个正确的局域网IP"; - label.Location = new Point(15, 10); - label.AutoSize = true; - label.MaximumSize = new Size(380, 0); // 设置最大宽度,允许自动换行 - selectForm.Controls.Add(label); - - // 计算标签高度以正确放置列表框 - int labelHeight = label.Height + 20; - - // 添加IP地址列表框 - ListBox listBox = new ListBox(); - listBox.Location = new Point(15, labelHeight); - listBox.Width = 380; - listBox.Height = 130; // 保持列表框高度 - foreach (string ip in lanIPs) - { - listBox.Items.Add(ip); - } - // 查找非".1"结尾的IP地址,如果所有IP都以".1"结尾,则使用第一个IP - int selectedIndex = 0; - for (int i = 0; i < lanIPs.Count; i++) + using (Form selectForm = new Form()) // 使用 using 确保资源释放 { - if (!lanIPs[i].EndsWith(".1")) + selectForm.Text = "选择局域网IP地址"; + selectForm.Font = new Font("宋体", 9F); // 统一字体 + selectForm.FormBorderStyle = FormBorderStyle.FixedDialog; + selectForm.StartPosition = FormStartPosition.CenterParent; + selectForm.MaximizeBox = false; + selectForm.MinimizeBox = false; + selectForm.AutoSize = true; + selectForm.AutoSizeMode = AutoSizeMode.GrowAndShrink; + selectForm.Padding = new Padding(15); // 窗体边缘留白 + + // 主布局容器:垂直排列所有元素 + var mainLayout = new TableLayoutPanel { - selectedIndex = i; - break; + Dock = DockStyle.Fill, + AutoSize = true, + AutoSizeMode = AutoSizeMode.GrowAndShrink, + ColumnCount = 1, + RowCount = 4, // 说明文本、列表、警告、按钮组 + Padding = new Padding(0) + }; + + // 1. 说明标签 + Label label = new Label(); + label.Text = "发现多个局域网IP地址:\n\n" + + "- 仅在本机访问:直接点击【取消】,将使用127.0.0.1\n" + + "- 局域网内其他设备访问:请在下面列表中选择一个正确的局域网IP"; + label.AutoSize = true; + label.MaximumSize = new Size(550, 0); // 限制最大宽度,自动换行 + label.Margin = new Padding(0, 0, 0, 20); // 下边距 + + // 2. IP列表框 + ListBox listBox = new ListBox(); + listBox.Width = 550; // 稍微加宽 + listBox.Height = 160; + listBox.Font = new Font("Verdana", 10F); // IP地址用英文字体显示更清晰 + foreach (string ip in lanIPs) + { + listBox.Items.Add(ip); } - } - // 设置选中的索引 - listBox.SelectedIndex = selectedIndex; - selectForm.Controls.Add(listBox); - - // 添加警告标签(放在列表框下方) - Label warningLabel = new Label(); - warningLabel.Text = "注意:选择错误的IP会导致局域网内其他设备无法访问。\n\n   推荐您可以先尝试使用非“.1”结尾的IP!"; - warningLabel.Location = new Point(15, labelHeight + listBox.Height + 10); - warningLabel.AutoSize = true; - warningLabel.ForeColor = Color.Red; // 警告文本使用红色 - selectForm.Controls.Add(warningLabel); - - // 计算按钮位置(居中排布) - int buttonY = labelHeight + listBox.Height + warningLabel.Height + 20; - int buttonTotalWidth = 75 * 2 + 15; // 两个按钮的宽度加间距 - int buttonStartX = (selectForm.ClientSize.Width - buttonTotalWidth) / 2; - - // 添加确定按钮 - Button okButton = new Button(); - okButton.Text = "确定"; - okButton.DialogResult = DialogResult.OK; - okButton.Location = new Point(buttonStartX, buttonY); - okButton.Width = 75; - selectForm.Controls.Add(okButton); - selectForm.AcceptButton = okButton; - - // 添加取消按钮 - Button cancelButton = new Button(); - cancelButton.Text = "取消"; - cancelButton.DialogResult = DialogResult.Cancel; - cancelButton.Location = new Point(buttonStartX + 90, buttonY); - cancelButton.Width = 75; - selectForm.Controls.Add(cancelButton); - selectForm.CancelButton = cancelButton; - - // 显示选择窗口 - if (selectForm.ShowDialog() == DialogResult.OK) - { - return listBox.SelectedItem.ToString(); - } - else - { - return "127.0.0.1"; // 如果用户取消,返回本地回环地址 + // 智能选择逻辑:优先选非 .1 结尾的 + int selectedIndex = 0; + for (int i = 0; i < lanIPs.Count; i++) + { + if (!lanIPs[i].EndsWith(".1")) + { + selectedIndex = i; + break; + } + } + if (listBox.Items.Count > 0) + listBox.SelectedIndex = selectedIndex; + + // 3. 警告标签 + Label warningLabel = new Label(); + warningLabel.Text = "注意:\n\n选择错误的IP会导致局域网内其他设备无法访问。\n推荐您可以先尝试使用非“.1”结尾的IP!"; + warningLabel.AutoSize = true; + warningLabel.ForeColor = Color.Red; + warningLabel.MaximumSize = new Size(550, 0); + warningLabel.Margin = new Padding(0, 20, 0, 25); // 上下边距 + + // 4. 按钮区域 (使用 FlowLayoutPanel 居中对齐) + FlowLayoutPanel buttonPanel = new FlowLayoutPanel + { + AutoSize = true, + FlowDirection = FlowDirection.LeftToRight, + Anchor = AnchorStyles.Top | AnchorStyles.Bottom, // 在单元格内居中需要配合父级设置 + Dock = DockStyle.Fill, + Padding = new Padding(0), + Margin = new Padding(0) + }; + // 让 FlowLayoutPanel 内容居中比较特殊,这里用 Margin 手动推 或者将 Panel 居中 + // 简单做法:直接让 mainLayout 的这一行居中 + + Button okButton = new Button(); + okButton.Text = "确定"; + okButton.DialogResult = DialogResult.OK; + okButton.Size = new Size(100, 32); // 【关键修改】增加宽度和高度 + okButton.Cursor = Cursors.Hand; + + Button cancelButton = new Button(); + cancelButton.Text = "取消"; + cancelButton.DialogResult = DialogResult.Cancel; + cancelButton.Size = new Size(100, 32); // 增加宽度和高度 + cancelButton.Margin = new Padding(20, 0, 0, 0); // 按钮间距 + cancelButton.Cursor = Cursors.Hand; + + buttonPanel.Controls.Add(okButton); + buttonPanel.Controls.Add(cancelButton); + + // 将按钮面板放入主布局,并设置居中 + mainLayout.Controls.Add(label, 0, 0); + mainLayout.Controls.Add(listBox, 0, 1); + mainLayout.Controls.Add(warningLabel, 0, 2); + mainLayout.Controls.Add(buttonPanel, 0, 3); + + // 设置按钮面板在单元格内居中 + mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + // 这种写法是为了让 buttonPanel 在 TableLayout 的单元格里居中 + buttonPanel.Anchor = AnchorStyles.None; + + selectForm.Controls.Add(mainLayout); + selectForm.AcceptButton = okButton; + selectForm.CancelButton = cancelButton; + + // 显示逻辑 + if (selectForm.ShowDialog() == DialogResult.OK && listBox.SelectedItem != null) + { + return listBox.SelectedItem.ToString(); + } + else + { + return "127.0.0.1"; + } } } - - } catch (Exception ex) { From e6649e582b59287ba075900b2fabb033307f1233 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 00:39:05 +0800 Subject: [PATCH 78/92] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E9=93=BE=E6=8E=A5=E7=BB=9F=E8=AE=A1=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=A1=86=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 1 + MainGui.cs | 18 ++++++++++++++++++ MainGui.resx | 3 +++ 3 files changed, 22 insertions(+) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 93ee385..44bdc1e 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -736,6 +736,7 @@ private void InitializeComponent() this.checkBoxSubsStats.TabIndex = 43; this.checkBoxSubsStats.Text = "统计订阅信息"; this.checkBoxSubsStats.UseVisualStyleBackColor = true; + this.checkBoxSubsStats.CheckedChanged += new System.EventHandler(this.checkBoxSubsStats_CheckedChanged); // // comboBoxOverwriteUrls // diff --git a/MainGui.cs b/MainGui.cs index 61752b3..2075a84 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -4476,5 +4476,23 @@ public static Color HexToRgbColor(String hexColour) } return colour; } + + private void checkBoxSubsStats_CheckedChanged(object sender, EventArgs e) + { + if (checkBoxHighConcurrent.Checked) + { + Log("开启订阅链接统计,将在 ./output/stats 下生成订阅数量、可用节点数量、成功率等文件", GetRichTextBoxAllLog()); + } + else + { + Log("当前内核不支持订阅链接统计,请切换 Subs-Check性能版!", GetRichTextBoxAllLog()); + MessageBox.Show( + this, // 如果你在 Form 类里可以直接传 this,让弹窗属于当前窗口 + "当前内核不支持订阅链接统计功能!\r\n\r\n请勾选 “高并发模式”\n切换到 【Subs-Check 性能版】", + "温馨提示", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } } } \ No newline at end of file diff --git a/MainGui.resx b/MainGui.resx index de7e7b4..c3120ae 100644 --- a/MainGui.resx +++ b/MainGui.resx @@ -3480,6 +3480,9 @@ https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt< 822, 19 + + 196, 21 + 533, 19 From 7a171048d66f87d04b98c557c7a1aa63dbddaf64 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 00:45:10 +0800 Subject: [PATCH 79/92] chore: bump version to v2.7.0.0 --- Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 7261d1e..ce510f8 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.6.0.1")] -[assembly: AssemblyFileVersion("2.6.0.1")] +[assembly: AssemblyVersion("2.7.0.0")] +[assembly: AssemblyFileVersion("2.7.0.0")] From 6a61e32db61ea5ab5812decd04538b622222f051 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 00:48:00 +0800 Subject: [PATCH 80/92] =?UTF-8?q?chore(CI):=20=E6=9B=B4=E6=96=B0release?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5abd6c1..255ecab 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -146,5 +146,6 @@ jobs: - 支持统计订阅链接总数、可用节点数量、成功率 - 优化默认参数,提高检测成功率 - 新内核集成 sub-store 前后端,可通过WebUI一键管理 + - 添加媒体解锁平台 多选窗口 🔗 [查看详情](https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}) \ No newline at end of file From c84bc25bec64727ba17524b7c448bb8634c90ac8 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 00:51:37 +0800 Subject: [PATCH 81/92] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 52f21da..68fd876 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ - [x] 🌐 现代化 WebUI,优化移动端访问体验 - [x] 🛠️ 一键管理 `**sub-store**` - [x] 📊 统计订阅链接总数、可用节点数量、成功率 +- [x] ✅ 添加媒体解锁平台 多选窗口 - [ ] 🌙 支持深色模式 > [!TIP] From 8f24019e6637ab721f184cbbf9d46a0be2b80c30 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 01:26:31 +0800 Subject: [PATCH 82/92] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DWebUI=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=9C=A8=E6=A3=80=E6=B5=8B=E6=9C=9F=E9=97=B4=E8=A2=AB?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/MainGui.cs b/MainGui.cs index 2075a84..360e476 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -1880,6 +1880,15 @@ private async void StartSubsCheckProcess() Log($"subs-check.exe {当前subsCheck版本号} 已启动...", GetRichTextBoxAllLog()); timerRefresh.Enabled = true; + + // 启动进程后就可以使用WebUI + buttonWebUi.Enabled = true; + + // 如果使用cron表达式,启用手动检测按钮 + if (textBoxCron.Visible == true) + { + buttonTriggerCheck.Enabled = true; + } } catch (Exception ex) { @@ -1913,6 +1922,8 @@ private void StopSubsCheckProcess() { subsCheckProcess.Dispose(); subsCheckProcess = null; + // 结束进程后禁用WebUI + buttonWebUi.Enabled = false; } } } From aa0a58621d2872d874cabf38f965793727872253 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 02:29:02 +0800 Subject: [PATCH 83/92] =?UTF-8?q?feat:=20=E5=90=AF=E5=8A=A8=E6=97=B6?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=86=85=E6=A0=B8=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 151 +++++++++++++++++++++++++++++-------- Properties/AssemblyInfo.cs | 4 +- 2 files changed, 123 insertions(+), 32 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 360e476..1c816fa 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -35,11 +35,13 @@ public partial class MainGui : Form string githubProxyURL = ""; string sysProxyURL = ""; int run = 0; - string 当前subsCheck版本号 = "未知版本"; + string currentKernel = "原版内核"; string currentArch = "i386"; string 当前GUI版本号 = "未知版本"; string 最新GUI版本号 = "未知版本"; + string 当前subsCheck版本号 = "未知版本"; + string 最新内核版本号 = "未知版本"; private string nextCheckTime = null;// 用于存储下次检查时间 string WebUIapiKey = "CMLiussss"; int downloading = 0; @@ -414,51 +416,107 @@ private async Task CheckGitHubVersionAsync() { try { - // 首先检查是否有网络连接 + // 首先检查网络(你已有 IsNetworkAvailable() 方法) if (!IsNetworkAvailable()) + return; + + // 并行获取 GUI 和 Kernel 的最新版本(更快) + var taskGui = 获取版本号("https://api.github.com/repos/sinspired/SubsCheck-Win-GUI/releases/latest"); + + // 动态决定使用哪个仓库(checkBoxHighConcurrent 为 true 时使用 sinspired,否则使用 beck-8) + string repoOwner = checkBoxHighConcurrent.Checked ? "sinspired" : "beck-8"; + string apiUrl = $"https://api.github.com/repos/{repoOwner}/subs-check/releases/latest"; + var taskKernel = 获取版本号(apiUrl); + + await Task.WhenAll(taskGui, taskKernel); + + string latestGui = taskGui.Result.Item1; + string latestKernel = taskKernel.Result.Item1; + + bool hasNewGui = false; + bool hasNewKernel = false; + string newTitle = $"SubsCheck Win GUI {当前GUI版本号}"; + + // ========= 检查 GUI 更新 ========= + if (latestGui != "未知版本" && !string.Equals(latestGui, 当前GUI版本号, StringComparison.OrdinalIgnoreCase)) { - return; // 静默返回,不显示错误 + // 尝试用 Version 类精确比较 + if (TryParseVersion(latestGui, out Version vLatest) && + TryParseVersion(当前GUI版本号, out Version vCurrent) && + vLatest > vCurrent) + { + hasNewGui = true; + 最新GUI版本号 = latestGui; + } + else if (string.Compare(latestGui.TrimStart('v'), 当前GUI版本号.TrimStart('v'), StringComparison.OrdinalIgnoreCase) > 0) + { + // 回退到字符串比较(带 v 或不带 v 都支持) + hasNewGui = true; + 最新GUI版本号 = latestGui; + } } - var result = await 获取版本号("https://api.github.com/repos/sinspired/SubsCheck-Win-GUI/releases/latest"); - if (result.Item1 != "未知版本") + // ========= 检查 Kernel 更新 ========= + if (latestKernel != "未知版本" && !string.Equals(latestKernel, 当前subsCheck版本号, StringComparison.OrdinalIgnoreCase)) { - string latestVersionStr = result.Item1; - try + if (TryParseVersion(latestKernel, out Version vLatestK) && + TryParseVersion(当前subsCheck版本号, out Version vCurrentK) && + vLatestK > vCurrentK) { - // 移除版本号前的 'v' 前缀以便正确解析 - string latestVersionToParse = latestVersionStr.StartsWith("v") ? latestVersionStr.Substring(1) : latestVersionStr; - string currentVersionToParse = 当前GUI版本号.StartsWith("v") ? 当前GUI版本号.Substring(1) : 当前GUI版本号; - - Version latestVersion = new Version(latestVersionToParse); - Version currentVersion = new Version(currentVersionToParse); - - if (latestVersion > currentVersion) - { - 最新GUI版本号 = latestVersionStr; - 标题 = "SubsCheck Win GUI " + 当前GUI版本号 + $" 发现新版本: {最新GUI版本号} 请及时更新!"; - this.Text = 标题; - } + hasNewKernel = true; + 最新内核版本号 = latestKernel; // 假设你有这个字段,没有就新建一个 string 最新内核版本号; } - catch (Exception) + else if (string.Compare(latestKernel.TrimStart('v'), 当前subsCheck版本号.TrimStart('v'), StringComparison.OrdinalIgnoreCase) > 0) { - // 版本号格式解析失败,回退到原始的字符串比较 - if (latestVersionStr != 当前GUI版本号) - { - 最新GUI版本号 = latestVersionStr; - 标题 = "SubsCheck Win GUI " + 当前GUI版本号 + $" 发现新版本: {最新GUI版本号} 请及时更新!"; - this.Text = 标题; - } + hasNewKernel = true; + 最新内核版本号 = latestKernel; } } + + // ========= 生成标题提示 ========= + if (hasNewGui && hasNewKernel) + { + newTitle += $" 有新版本!GUI → {最新GUI版本号} 内核 → {最新内核版本号}"; + } + else if (hasNewGui) + { + newTitle += $" 发现新GUI版本: {最新GUI版本号} 请及时更新!"; + } + else if (hasNewKernel) + { + newTitle += $" 发现新内核版本: {最新内核版本号} 请更新内核!"; + } + + if (hasNewGui || hasNewKernel) + { + // 检查更新按钮颜色 + buttonCheckUpdate.ForeColor = Color.LimeGreen; + + 标题 = newTitle; + this.Text = 标题; // 更新窗口标题 + // 可选:这里再弹个小气泡提示更友好 + notifyIcon1.ShowBalloonTip(8000, "SubsCheck 更新提醒", + hasNewGui && hasNewKernel ? $"GUI 和内核均有新版本!\nGUI: {最新GUI版本号}\n内核: {最新内核版本号}" + : hasNewGui ? $"GUI 有新版本:{最新GUI版本号}" + : $"内核有新版本:{最新内核版本号}", ToolTipIcon.Info); + } } catch { - // 静默处理任何其他异常 - return; + // 所有异常静默处理,不打扰用户 } } + // 辅助方法:安全解析版本号(自动去掉 v 前缀) + private bool TryParseVersion(string input, out Version version) + { + version = null; + if (string.IsNullOrWhiteSpace(input)) return false; + + string clean = input.TrimStart('v', 'V'); + return Version.TryParse(clean, out version); + } + // 添加检查网络连接的辅助方法 private bool IsNetworkAvailable() { @@ -3435,6 +3493,39 @@ private async Task GetApiStatusAsync() return resultArray; } + /// + /// 获取内核当前版本和最新版本 + /// + private async Task GetKernelVersionAsync() + { + if (numericUpDownWebUIPort.Value <= 0 || numericUpDownWebUIPort.Value > 65535) + return new string[] { null, null }; + + var url = $"http://127.0.0.1:{numericUpDownWebUIPort.Value:D}/admin/version"; + + try + { + using (var client = new HttpClient { Timeout = TimeSpan.FromSeconds(8) }) + { + client.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0"); + + string json = await client.GetStringAsync(url).ConfigureAwait(false); + + var data = JObject.Parse(json); + + return new string[] // ← 这里显式指定 string[] + { + data["version"]?.Value()?.Trim(), + data["latest_version"]?.Value()?.Trim() + }; + } + } + catch + { + return new string[] { null, null }; + } + } + private async void timerRefresh_Tick(object sender, EventArgs e) { //if (!button7.Enabled) button7.Enabled = true; diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index ce510f8..f88f1e1 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.3.0.0")] +[assembly: AssemblyFileVersion("2.3.0.0")] From 5c1062f8c7139b6a378a361b80bb351e227ca8eb Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 03:22:51 +0800 Subject: [PATCH 84/92] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=86=85?= =?UTF-8?q?=E6=A0=B8=E6=A3=80=E6=9F=A5=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 65 +++++++++++++++++++++++++++++++++++--- Properties/AssemblyInfo.cs | 4 +-- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 1c816fa..4616a0f 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -491,6 +491,7 @@ private async Task CheckGitHubVersionAsync() { // 检查更新按钮颜色 buttonCheckUpdate.ForeColor = Color.LimeGreen; + buttonCheckUpdate.Text = "有新版本"; 标题 = newTitle; this.Text = 标题; // 更新窗口标题 @@ -1673,6 +1674,12 @@ public async Task DownloadSubsCheckEXE() Log($"{currentKernel}({currentArch}): subs-check.exe {当前subsCheck版本号} 已就绪!", GetRichTextBoxAllLog()); + buttonCheckUpdate.ForeColor = Color.Black; + buttonCheckUpdate.Text = "检查更新"; + string defaultTitle = $"SubsCheck Win GUI {当前GUI版本号}"; + 标题 = defaultTitle; + this.Text = 标题; + await SaveConfig(false); // 可选:删除 zip 文件(注释状态保留原样) @@ -3498,10 +3505,13 @@ private async Task GetApiStatusAsync() /// private async Task GetKernelVersionAsync() { + // 1. 类型转换检查 if (numericUpDownWebUIPort.Value <= 0 || numericUpDownWebUIPort.Value > 65535) return new string[] { null, null }; - var url = $"http://127.0.0.1:{numericUpDownWebUIPort.Value:D}/admin/version"; + // 2. 【关键修改】将 decimal 强转为 int + int port = (int)numericUpDownWebUIPort.Value; + var url = $"http://127.0.0.1:{port}/admin/version"; try { @@ -3509,14 +3519,16 @@ private async Task GetKernelVersionAsync() { client.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0"); + // 3. 异步请求 string json = await client.GetStringAsync(url).ConfigureAwait(false); + // 4. 解析 JSON (确保已引用 Newtonsoft.Json) var data = JObject.Parse(json); - return new string[] // ← 这里显式指定 string[] + return new string[] { - data["version"]?.Value()?.Trim(), - data["latest_version"]?.Value()?.Trim() + data["version"]?.Value()?.Trim(), + data["latest_version"]?.Value()?.Trim() }; } } @@ -3530,14 +3542,57 @@ private async void timerRefresh_Tick(object sender, EventArgs e) { //if (!button7.Enabled) button7.Enabled = true; string[] subscheck状态 = await GetApiStatusAsync(); + string 状态类型 = subscheck状态[0]; string 状态图标类别 = subscheck状态[1]; string 状态文本 = subscheck状态[2]; string 节点总数 = subscheck状态[3]; string 进度百分比 = subscheck状态[4]; string 可用节点数量 = subscheck状态[5]; - // 更新状态文本 + string[] kernelVersion = await GetKernelVersionAsync(); + string currentKernelVersion = kernelVersion[0]; + string latestKernelVersion = kernelVersion[1]; + + string defaultTitle = $"SubsCheck Win GUI {当前GUI版本号}"; + if (currentKernelVersion != null && latestKernelVersion != null) + { + if (TryParseVersion(latestKernelVersion, out Version vLatestK) && + TryParseVersion(currentKernelVersion, out Version vCurrentK) && + vLatestK > vCurrentK) + { + // 内核有新版 + string newTitle = defaultTitle; + newTitle += $" 发现新内核版本: {vLatestK} 请更新内核!"; + + // 检查更新按钮颜色 + buttonCheckUpdate.Enabled = true; + buttonCheckUpdate.ForeColor = Color.LimeGreen; + buttonCheckUpdate.Text = "有新版本"; + + 标题 = newTitle; + this.Text = 标题; // 更新窗口标题 + } + else + { + // 检查更新按钮颜色 + buttonCheckUpdate.ForeColor = Color.Black; + buttonCheckUpdate.Text = "检查更新"; + 标题 = defaultTitle; + this.Text = 标题; // 更新窗口标题 + } + } + else + { + // 检查更新按钮颜色 + buttonCheckUpdate.ForeColor = Color.Black; + buttonCheckUpdate.Text = "检查更新"; + 标题 = defaultTitle; + this.Text = 标题; // 更新窗口标题 + } + + + // 更新状态文本 if (状态类型 == "checking") { buttonTriggerCheck.Text = buttonTriggerCheck.Text == "⌛获取订阅" ? buttonTriggerCheck.Text : "⌛获取订阅"; diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index f88f1e1..ce510f8 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.3.0.0")] -[assembly: AssemblyFileVersion("2.3.0.0")] +[assembly: AssemblyVersion("2.7.0.0")] +[assembly: AssemblyFileVersion("2.7.0.0")] From bbe6049d3f8b49abd9ea16fe8ff90339d10999ec Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 14:23:08 +0800 Subject: [PATCH 85/92] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E8=BD=AF?= =?UTF-8?q?=E4=BB=B6=E8=BF=90=E8=A1=8C=E6=88=AA=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ gui.png | Bin 306318 -> 170479 bytes 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 68fd876..f7a0107 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,8 @@ > [!WARNING] > 本软件的主要目的是促进学习、研究和安全测试。请在合法和负责任的前提下使用。 +![GUI](./gui.png) + ## 🖥️ 系统要求 - **操作系统**: Windows 10/11 (32位/64位) diff --git a/gui.png b/gui.png index 42c015b970f9521e2ae8225747b03e6b93864581..2df2b8635e2a61cf05761f9ac6a2d9f1dcfe897b 100644 GIT binary patch literal 170479 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›)i_`BCm3UxswpW|*? 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 QwQiE9R$_m+NO>f!5Lg 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%0DaAyXdd{-tEWW=(=5?LN4x1M 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

=Rp7T!_ti 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 Cil8|F From 984ce2dadf0b09fc9cfe9fa5401e6bef16a02494 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 21 Nov 2025 14:35:55 +0800 Subject: [PATCH 86/92] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E8=BD=AF?= =?UTF-8?q?=E4=BB=B6=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 6 ------ CHANGELOG.md | 23 ++++++++++++++++++----- update.xml | 4 ++-- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 255ecab..fd2762f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -141,11 +141,5 @@ jobs: 版本: `${{ github.ref_name }}` 项目: `${{ github.repository }}` - 更新说明: - - 支持高并发内核新特性 - - 支持统计订阅链接总数、可用节点数量、成功率 - - 优化默认参数,提高检测成功率 - - 新内核集成 sub-store 前后端,可通过WebUI一键管理 - - 添加媒体解锁平台 多选窗口 🔗 [查看详情](https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}) \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f385cc1..7dbe79d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,29 @@ # 📝 Changelog -[2.5.0.1] - 2025-11-03 +[2.7.0.0] - 2025-11-20 + +🚀 Features + +- 支持点选媒体解锁检测平台 +- 启动时检查内核更新 🐛 Bug Fixes -- 自动检测系统代理并设置,提高了兼容性 +- 修复重复添加singbox订阅选项 +- 更新“更多参数” +- 修复WebUI按钮在检测期间被禁用的错误 ⚡ Performance -- 优化代理检测和设置 -- 优化版本检测 +- 优化媒体解锁窗体显示效果 +- 优化局域网ip选择窗体显示 +- 优化内核检查更新逻辑 ⚙️ Miscellaneous Tasks -- 更新Newtonsoft.Json +- Bump version to v2.6.0.1 +- 清理补充参数 +- 添加订阅链接统计单选框提示 +- Bump version to v2.7.0.0 +- *(CI)* 更新release信息 +- 更新readme diff --git a/update.xml b/update.xml index d7a88c9..c0c151b 100644 --- a/update.xml +++ b/update.xml @@ -1,7 +1,7 @@ - 2.5.0.1 - https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.5.0.1/subs-check-win.zip + 2.7.0.0 + https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.7.0.0/subs-check-win.zip https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md true subs-check.win.gui.exe From 34000b7583be3ff0a8df76538532da0a851dbe1e Mon Sep 17 00:00:00 2001 From: sinspired Date: Sat, 22 Nov 2025 02:13:35 +0800 Subject: [PATCH 87/92] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MainGui.cs b/MainGui.cs index 4616a0f..3afa483 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -110,8 +110,8 @@ public MainGui() toolTip1.SetToolTip(buttonCheckUpdate, "检查GUI和内核版本更新"); toolTip1.SetToolTip(numericUpDownDLTimehot, "下载测试时间(s):与下载链接大小相关,默认最大测试10s。"); - toolTip1.SetToolTip(numericUpDownWebUIPort, "本地监听端口:用于直接返回测速结果的节点信息,方便 Sub-Store 实现订阅转换。"); - toolTip1.SetToolTip(numericUpDownSubStorePort, "Sub-Store监听端口:用于订阅订阅转换。\n注意:除非你知道你在干什么,否则不要将你的 Sub-Store 暴露到公网,否则可能会被滥用"); + toolTip1.SetToolTip(numericUpDownWebUIPort, "本地监听端口:用于WebUi,返回软件运行信息等。"); + toolTip1.SetToolTip(numericUpDownSubStorePort, "Sub-Store监听端口:用于订阅转换。\n注意:\n请设置sub-store-path以防止被扫描主机"); toolTip1.SetToolTip(textBoxSubStorePath, "Sub-Store自定义路径\n设置path之后,可以安全暴露到公网,开启订阅分享功能。\r\n# 订阅示例:http://127.0.0.1:8299/{sub-store-path}/api/file/mihomo\r\n# WebUI 支持分享订阅,直接复制订阅链接"); toolTip1.SetToolTip(numericUpDownDownloadMb, "下载测试限制(MB):当达到下载数据大小时,停止下载,可节省测速流量,减少测速测死的概率"); @@ -137,7 +137,7 @@ public MainGui() toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); - toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会在内存中保留成功节点以便下次使用(重启后丢失)\n可在订阅链接中添加以下地址作为替代:\n- http://127.0.0.1:8199/all.yaml#KeepSucced\n"); + toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会保留成功节点以便下次使用(持久化存储)\n1. 将加载上次成功节点;\n2. 将加载历次检测成功节点。"); toolTip1.SetToolTip(checkBoxSubsStats, "仅在 “高并发模式“可用”。\n勾选会在 /output/stats 文件夹生成每个订阅链接内的节点数量,可用节点数量以及成功率。"); toolTip1.SetToolTip(checkBoxEnableWebUI, "勾选后启用WebUI管理界面\n建议启用\n开启后可一键管理sub-store\n建议使用 Cloudflare Tunel隧道 映射主机端口\r\n可使用域名编辑、管理配置,开始、结束检测任务\n本地管理地址: http://127.0.0.1:8199/admin\n"); toolTip1.SetToolTip(buttonWebUi, "更方便的subs-check管理面板\n可一键分享订阅\n支持一键进入sub-store\n支持远程管理"); From 05b02190264090ee15439a8cb0148c2f0beed6e4 Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 2 Jan 2026 17:09:30 +0800 Subject: [PATCH 88/92] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20isp=20?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=A3=80=E6=B5=8B=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 18 ++++++++++++++++-- MainGui.cs | 25 +++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 44bdc1e..3ec31a0 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -127,6 +127,7 @@ private void InitializeComponent() this.groupBoxEnhance = new System.Windows.Forms.GroupBox(); this.checkBoxDropBadCFNodes = new System.Windows.Forms.CheckBox(); this.checkBoxEhanceTag = new System.Windows.Forms.CheckBox(); + this.checkBoxIspCheck = new System.Windows.Forms.CheckBox(); this.groupBoxComonSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinSpeed)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeout)).BeginInit(); @@ -687,6 +688,7 @@ private void InitializeComponent() // // groupBoxAdvanceSettings // + this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxIspCheck); this.groupBoxAdvanceSettings.Controls.Add(this.checkBoxSubsStats); this.groupBoxAdvanceSettings.Controls.Add(this.comboBoxOverwriteUrls); this.groupBoxAdvanceSettings.Controls.Add(this.textBoxSubStorePath); @@ -732,9 +734,9 @@ private void InitializeComponent() this.checkBoxSubsStats.AutoSize = true; this.checkBoxSubsStats.Location = new System.Drawing.Point(192, 130); this.checkBoxSubsStats.Name = "checkBoxSubsStats"; - this.checkBoxSubsStats.Size = new System.Drawing.Size(162, 25); + this.checkBoxSubsStats.Size = new System.Drawing.Size(120, 25); this.checkBoxSubsStats.TabIndex = 43; - this.checkBoxSubsStats.Text = "统计订阅信息"; + this.checkBoxSubsStats.Text = "统计订阅"; this.checkBoxSubsStats.UseVisualStyleBackColor = true; this.checkBoxSubsStats.CheckedChanged += new System.EventHandler(this.checkBoxSubsStats_CheckedChanged); // @@ -1887,6 +1889,17 @@ private void InitializeComponent() this.checkBoxEhanceTag.Text = "增强位置标签"; this.checkBoxEhanceTag.UseVisualStyleBackColor = true; // + // checkBoxIspCheck + // + this.checkBoxIspCheck.AutoSize = true; + this.checkBoxIspCheck.Location = new System.Drawing.Point(346, 130); + this.checkBoxIspCheck.Name = "checkBoxIspCheck"; + this.checkBoxIspCheck.Size = new System.Drawing.Size(111, 25); + this.checkBoxIspCheck.TabIndex = 44; + this.checkBoxIspCheck.Text = "ISP类型"; + this.checkBoxIspCheck.UseVisualStyleBackColor = true; + this.checkBoxIspCheck.CheckedChanged += new System.EventHandler(this.checkBoxIspCheck_CheckedChanged); + // // MainGui // this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 21F); @@ -2041,6 +2054,7 @@ private void InitializeComponent() private System.Windows.Forms.Label labelSubstoreParh; private System.Windows.Forms.TextBox textBoxSubStorePath; private System.Windows.Forms.CheckBox checkBoxSubsStats; + private System.Windows.Forms.CheckBox checkBoxIspCheck; } } diff --git a/MainGui.cs b/MainGui.cs index 3afa483..cdc62bf 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -139,6 +139,8 @@ public MainGui() toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会保留成功节点以便下次使用(持久化存储)\n1. 将加载上次成功节点;\n2. 将加载历次检测成功节点。"); toolTip1.SetToolTip(checkBoxSubsStats, "仅在 “高并发模式“可用”。\n勾选会在 /output/stats 文件夹生成每个订阅链接内的节点数量,可用节点数量以及成功率。"); + toolTip1.SetToolTip(checkBoxIspCheck, "是否执行 isp 类型检测\n检测是否 原生/广播IP,以及住宅、机房等类型\n将为节点添加类似 [原生|机房]的标签"); + toolTip1.SetToolTip(checkBoxEnableWebUI, "勾选后启用WebUI管理界面\n建议启用\n开启后可一键管理sub-store\n建议使用 Cloudflare Tunel隧道 映射主机端口\r\n可使用域名编辑、管理配置,开始、结束检测任务\n本地管理地址: http://127.0.0.1:8199/admin\n"); toolTip1.SetToolTip(buttonWebUi, "更方便的subs-check管理面板\n可一键分享订阅\n支持一键进入sub-store\n支持远程管理"); toolTip1.SetToolTip(textBoxWebUiAPIKey, "Web控制面板的api-key"); @@ -897,6 +899,10 @@ private async void ReadConfig()//读取配置文件 if (SubsStats != null && SubsStats == "true") checkBoxSubsStats.Checked = true; else checkBoxSubsStats.Checked = false; + string ispCheck = 读取config字符串(config, "isp-check"); + if (ispCheck != null && ispCheck == "true") checkBoxIspCheck.Checked = true; + else checkBoxIspCheck.Checked = false; + int? successlimit = 读取config整数(config, "success-limit"); if (successlimit.HasValue) { @@ -1262,6 +1268,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 config["keep-success-proxies"] = checkBoxKeepSucced.Checked;//是否保留成功的节点 config["sub-urls-stats"] = checkBoxSubsStats.Checked;//是否统计节点信息 + config["isp-check"] = checkBoxIspCheck.Checked;//是否启用ISP检测 config["print-progress"] = false;//是否显示进度 config["sub-urls-retry"] = 3;//重试次数(获取订阅失败后重试次数) config["subscheck-version"] = 当前subsCheck版本号;//当前subsCheck版本号 @@ -4651,5 +4658,23 @@ private void checkBoxSubsStats_CheckedChanged(object sender, EventArgs e) MessageBoxIcon.Information); } } + + private void checkBoxIspCheck_CheckedChanged(object sender, EventArgs e) + { + if (checkBoxHighConcurrent.Checked) + { + Log("开启 isp 类型检测,检测是否原生/广播IP,以及住宅、机房等类型;将为节点添加类似 [原生|机房] 的标签", GetRichTextBoxAllLog()); + } + else + { + Log("当前内核不支持 isp 类型检测,请切换 Subs-Check性能版!", GetRichTextBoxAllLog()); + MessageBox.Show( + this, // 如果你在 Form 类里可以直接传 this,让弹窗属于当前窗口 + "当前内核不支持 isp 类型检测!\r\n\r\n请勾选 “高并发模式”\n切换到 【Subs-Check 性能版】", + "温馨提示", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } } } \ No newline at end of file From ef38ac0f640a33fcc896551b302b37eae92a750b Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 2 Jan 2026 17:16:04 +0800 Subject: [PATCH 89/92] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainGui.Designer.cs | 2 +- MainGui.cs | 30 +++++++++++++++--------------- Properties/AssemblyInfo.cs | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/MainGui.Designer.cs b/MainGui.Designer.cs index 3ec31a0..66196b6 100644 --- a/MainGui.Designer.cs +++ b/MainGui.Designer.cs @@ -396,7 +396,7 @@ private void InitializeComponent() this.checkBoxHighConcurrent.Name = "checkBoxHighConcurrent"; this.checkBoxHighConcurrent.Size = new System.Drawing.Size(141, 25); this.checkBoxHighConcurrent.TabIndex = 39; - this.checkBoxHighConcurrent.Text = "高并发模式"; + this.checkBoxHighConcurrent.Text = "高性能模式"; this.checkBoxHighConcurrent.UseVisualStyleBackColor = true; this.checkBoxHighConcurrent.CheckedChanged += new System.EventHandler(this.checkBoxHighConcurrent_CheckedChanged); // diff --git a/MainGui.cs b/MainGui.cs index cdc62bf..ed23342 100644 --- a/MainGui.cs +++ b/MainGui.cs @@ -76,7 +76,7 @@ public MainGui() originalNotifyIcon = notifyIcon1.Icon; // 设置提示信息 - toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。\n\n如启用高并发而未单独设置分段并发数,将使用该值计算自适应并发数.\n启用高并发后,此值可安全设置,下载速度会被限制在一个较小的值,同时加快检测速度"); + toolTip1.SetToolTip(numericUpDownConcurrent, "并发线程数:推荐 宽带峰值/50M。\n\n如启用高性能模式而未单独设置分段并发数,将使用该值计算自适应并发数.\n启用高性能模式后,此值可安全设置,下载速度会被限制在一个较小的值,同时加快检测速度"); toolTip1.SetToolTip(numericUpDownInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); toolTip1.SetToolTip(labelInterval, "检查间隔时间(分钟):放置后台的时候,下次自动测速的间隔时间。\n\n 双击切换 使用「cron表达式」"); toolTip1.SetToolTip(labelCron, "双击切换 使用「分钟倒计时」"); @@ -84,7 +84,7 @@ public MainGui() toolTip1.SetToolTip(numericUpDownTimeout, "超时时间(毫秒):节点的最大延迟。"); toolTip1.SetToolTip(numericUpDownMinSpeed, "最低测速结果舍弃(KB/s)。"); - toolTip1.SetToolTip(checkBoxHighConcurrent, "启用高并发内核。\n将同时开启以下功能:\n1. 测活、测速、媒体检测独立并发设置;\n2. 持久化保存并加载历次成功节点;\n3. 统计订阅信息,包括可用节点数量,成功率;\n4. 增强位置标签;\n5. 全新设计的WebUI,一键进入sub-store"); + toolTip1.SetToolTip(checkBoxHighConcurrent, "启用高性能内核。\n将同时开启以下功能:\n1. 测活、测速、媒体检测独立并发设置;\n2. 持久化保存并加载历次成功节点;\n3. 统计订阅信息,包括可用节点数量,成功率;\n4. 增强位置标签;\n5. 全新设计的WebUI,一键进入sub-store"); toolTip1.SetToolTip(checkBoxSwitchArch64, "启用64位版本内核。"); toolTip1.SetToolTip(buttonTriggerCheck, "⏯️开始检测:发送开始检测信号,开始检测;\n⏸️结束检测:发送停止信号,内核保持后台运行。"); @@ -138,7 +138,7 @@ public MainGui() toolTip1.SetToolTip(textBoxCron, "支持标准cron表达式,如:\n 0 */2 * * * 表示每2小时的整点执行\n 0 0 */2 * * 表示每2天的0点执行\n 0 0 1 * * 表示每月1日0点执行\n */30 * * * * 表示每30分钟执行一次\n\n 双击切换 使用「分钟倒计时」"); toolTip1.SetToolTip(checkBoxKeepSucced, "勾选会保留成功节点以便下次使用(持久化存储)\n1. 将加载上次成功节点;\n2. 将加载历次检测成功节点。"); - toolTip1.SetToolTip(checkBoxSubsStats, "仅在 “高并发模式“可用”。\n勾选会在 /output/stats 文件夹生成每个订阅链接内的节点数量,可用节点数量以及成功率。"); + toolTip1.SetToolTip(checkBoxSubsStats, "仅在 “高性能模式“可用”。\n勾选会在 /output/stats 文件夹生成每个订阅链接内的节点数量,可用节点数量以及成功率。"); toolTip1.SetToolTip(checkBoxIspCheck, "是否执行 isp 类型检测\n检测是否 原生/广播IP,以及住宅、机房等类型\n将为节点添加类似 [原生|机房]的标签"); toolTip1.SetToolTip(checkBoxEnableWebUI, "勾选后启用WebUI管理界面\n建议启用\n开启后可一键管理sub-store\n建议使用 Cloudflare Tunel隧道 映射主机端口\r\n可使用域名编辑、管理配置,开始、结束检测任务\n本地管理地址: http://127.0.0.1:8199/admin\n"); @@ -582,7 +582,7 @@ private async void ReadConfig()//读取配置文件 int? mediaConcurrentValue = 读取config整数(config, "media-concurrent"); if (mediaConcurrentValue.HasValue) numericUpDownPipeMedia.Value = mediaConcurrentValue.Value; - // 根据各阶段并发数切换设置项, 如果任一为0, 则启用自适应高并发 + // 根据各阶段并发数切换设置项, 如果任一为0, 则启用自适应高性能 switchPipeAutoConcurrent(); // 现在控件已被赋值,函数可以安全读取 numericUpDown 的值 // 重新启用事件 @@ -616,7 +616,7 @@ private async void ReadConfig()//读取配置文件 bool.TryParse(enableHighConcurrentRaw.Trim(), out enableHighConcurrentFlag); } - // 决定是否启用高并发:只要显式开启 或 drop/enhance 为 true 或 三阶段并发均 > 0 + // 决定是否启用高性能:只要显式开启 或 drop/enhance 为 true 或 三阶段并发均 > 0 bool needHighConcurrent = enableHighConcurrentFlag || dropBadCFFlag || enhanceTagFlag @@ -636,7 +636,7 @@ private async void ReadConfig()//读取配置文件 } } - // 根据是否启用高并发,调整界面布局 + // 根据是否启用高性能,调整界面布局 string sysproxy; if (!checkBoxHighConcurrent.Checked) { @@ -1256,7 +1256,7 @@ private async Task SaveConfig(bool githubProxyCheck = true)//保存配置文件 else if (comboBoxOverwriteUrls.Text.StartsWith(githubRawPrefix)) config["mihomo-overwrite-url"] = githubProxyURL + comboBoxOverwriteUrls.Text; else config["mihomo-overwrite-url"] = comboBoxOverwriteUrls.Text != "" ? comboBoxOverwriteUrls.Text : $"http://127.0.0.1:{numericUpDownWebUIPort.Value}/ACL4SSR_Online_Full.yaml"; - config["enable-high-concurrent"] = checkBoxHighConcurrent.Checked;//使用自适应高并发版本 + config["enable-high-concurrent"] = checkBoxHighConcurrent.Checked;//使用自适应高性能版本 config["switch-x64"] = checkBoxSwitchArch64.Checked;//是否使用x64内核 config["rename-node"] = checkBoxEnableRenameNode.Checked;//以节点IP查询位置重命名节点 config["media-check"] = checkBoxEnableMediaCheck.Checked;//是否开启流媒体检测 @@ -1544,7 +1544,7 @@ public async Task DownloadSubsCheckEXE() string releasesPageUrl = $"https://github.com/{repoOwner}/subs-check/releases"; // 决定目标资源名称:64位优先 (amd64),否则 i386 string desiredArchToken = checkBoxSwitchArch64.Checked ? "x86_64" : "i386"; - string desiredKernel = checkBoxHighConcurrent.Checked ? "高并发内核" : "原版内核"; + string desiredKernel = checkBoxHighConcurrent.Checked ? "高性能内核" : "原版内核"; string desiredAssetName = $"subs-check_Windows_{desiredArchToken}.zip"; // 首先检查是否有网络连接 @@ -3363,7 +3363,7 @@ private void numericUpDownConcurrent_ValueChanged(object sender, EventArgs e) { if (checkBoxHighConcurrent.Checked) { - Log("已启用流水线高并发模式✨\n- 此值将作为计算测活-测速-流媒体检测各阶段并发数的基准.\n- 内核已启用衰减算法,可放心设置", GetRichTextBoxAllLog()); + Log("已启用流水线高性能模式✨\n- 此值将作为计算测活-测速-流媒体检测各阶段并发数的基准.\n- 内核已启用衰减算法,可放心设置", GetRichTextBoxAllLog()); } else { @@ -4321,7 +4321,7 @@ public async Task GetGithubProxyUrlAsync() return _lastGithubProxyUrl; } - // 切换高并发内核和原版内核设置项 + // 切换高性能内核和原版内核设置项 private void SwitchHighConcurrentLayout(bool EnableHighConcurrent) { bool collapsed = buttonAdvanceSettings.Text == "高级设置∨"; @@ -4368,7 +4368,7 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg SwitchHighConcurrentLayout(EnableHighConcurrent); // 判断是否需要下载新内核 - string want = EnableHighConcurrent ? "高并发内核" : "原版内核"; + string want = EnableHighConcurrent ? "高性能内核" : "原版内核"; if (currentKernel != want) { if (EnableHighConcurrent && !checkBoxSwitchArch64.Checked) @@ -4414,7 +4414,7 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg checkBoxHighConcurrent.Enabled = false; buttonCheckUpdate.Enabled = false; - Log(EnableHighConcurrent ? "切换为 高并发 内核,可单独设置测活-测速-媒体检测各阶段并发数,大幅提高性能" : "切换为 原版 内核", GetRichTextBoxAllLog()); + Log(EnableHighConcurrent ? "切换为 高性能 内核,可单独设置测活-测速-媒体检测各阶段并发数,大幅提高性能" : "切换为 原版 内核", GetRichTextBoxAllLog()); await DownloadSubsCheckEXE();// 若要后台并行改为 _ = DownloadSubsCheckEXE(); currentKernel = want; if (!EnableHighConcurrent) @@ -4438,7 +4438,7 @@ private async void checkBoxHighConcurrent_CheckedChanged(object sender, EventArg checkBoxHighConcurrent.Enabled = true; buttonCheckUpdate.Enabled = true; } - Log(EnableHighConcurrent ? "已切换高并发内核,测活-测速-媒体检测 流水线式并发运行。" : "使用原版内核。", GetRichTextBoxAllLog()); + Log(EnableHighConcurrent ? "已切换高性能内核,测活-测速-媒体检测 流水线式并发运行。" : "使用原版内核。", GetRichTextBoxAllLog()); } // x64 按钮切换事件 @@ -4652,7 +4652,7 @@ private void checkBoxSubsStats_CheckedChanged(object sender, EventArgs e) Log("当前内核不支持订阅链接统计,请切换 Subs-Check性能版!", GetRichTextBoxAllLog()); MessageBox.Show( this, // 如果你在 Form 类里可以直接传 this,让弹窗属于当前窗口 - "当前内核不支持订阅链接统计功能!\r\n\r\n请勾选 “高并发模式”\n切换到 【Subs-Check 性能版】", + "当前内核不支持订阅链接统计功能!\r\n\r\n请勾选 “高性能模式”\n切换到 【Subs-Check 性能版】", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information); @@ -4670,7 +4670,7 @@ private void checkBoxIspCheck_CheckedChanged(object sender, EventArgs e) Log("当前内核不支持 isp 类型检测,请切换 Subs-Check性能版!", GetRichTextBoxAllLog()); MessageBox.Show( this, // 如果你在 Form 类里可以直接传 this,让弹窗属于当前窗口 - "当前内核不支持 isp 类型检测!\r\n\r\n请勾选 “高并发模式”\n切换到 【Subs-Check 性能版】", + "当前内核不支持 isp 类型检测!\r\n\r\n请勾选 “高性能模式”\n切换到 【Subs-Check 性能版】", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index ce510f8..866ddcc 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -6,7 +6,7 @@ // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("SubsCheck Win GUI")] -[assembly: AssemblyDescription("SubsCheck 为 Windows 用户设计的 GUI 程序界面。修复字体模糊,兼容新旧dpi设备,新增高并发、64位内核,新增历次检测可用节点,添加新内核特性。")] +[assembly: AssemblyDescription("SubsCheck 为 Windows 用户设计的 GUI 程序界面。修复字体模糊,兼容新旧dpi设备,新增高性能、64位内核,新增历次检测可用节点,添加新内核特性。")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("TG:sinspired")] [assembly: AssemblyProduct("SubsCheck Win GUI")] From f77e0ec7071ccd27ed89cc8707af158d59dd66ab Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 2 Jan 2026 17:21:05 +0800 Subject: [PATCH 90/92] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f7a0107..c7eed2c 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ - [x] 🛠️ 一键管理 `**sub-store**` - [x] 📊 统计订阅链接总数、可用节点数量、成功率 - [x] ✅ 添加媒体解锁平台 多选窗口 +- [x] 📡 支持检测 isp 类型,原生/广播IP,住宅/机房等,节点添加类似 `[原生|住宅]` 的标签 - [ ] 🌙 支持深色模式 > [!TIP] From 03c3a7ebf46a8ef040d000192895a7a7ad9e0a0b Mon Sep 17 00:00:00 2001 From: sinspired Date: Fri, 2 Jan 2026 17:22:35 +0800 Subject: [PATCH 91/92] chore: bump version to 2.7.0.1 --- .github/workflows/publish.yml | 2 +- .gitignore | 2 ++ Properties/AssemblyInfo.cs | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fd2762f..dd9d14d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -137,7 +137,7 @@ jobs: token: ${{ secrets.TELEGRAM_BOT_TOKEN }} # Bot Token format: markdown message: | - 💻 *subs-check_GUI 更新(推荐)* + 💻 *subs-check_GUI for Windows 更新* 版本: `${{ github.ref_name }}` 项目: `${{ github.repository }}` diff --git a/.gitignore b/.gitignore index 026af72..dcd0354 100644 --- a/.gitignore +++ b/.gitignore @@ -364,3 +364,5 @@ MigrationBackup/ FodyWeavers.xsd *.ini + +.wiki/ diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 866ddcc..60aed19 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // 生成号 // 修订号 // -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.0.1")] +[assembly: AssemblyFileVersion("2.7.0.1")] From c0e56468f5dedaa2eff1df782c8a3a7124aad1b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Jan 2026 09:24:21 +0000 Subject: [PATCH 92/92] chore(release): update CHANGELOG.md and update.xml for v2.7.0.1 --- CHANGELOG.md | 28 +++++++++------------------- update.xml | 4 ++-- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dbe79d..80811f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,29 +1,19 @@ # 📝 Changelog -[2.7.0.0] - 2025-11-20 +[2.7.0.1] - 2026-01-02 🚀 Features -- 支持点选媒体解锁检测平台 -- 启动时检查内核更新 +- 添加 isp 类型检测选项 -🐛 Bug Fixes +📚 Documentation -- 修复重复添加singbox订阅选项 -- 更新“更多参数” -- 修复WebUI按钮在检测期间被禁用的错误 - -⚡ Performance - -- 优化媒体解锁窗体显示效果 -- 优化局域网ip选择窗体显示 -- 优化内核检查更新逻辑 +- 更新软件运行截图 +- 更新 README ⚙️ Miscellaneous Tasks -- Bump version to v2.6.0.1 -- 清理补充参数 -- 添加订阅链接统计单选框提示 -- Bump version to v2.7.0.0 -- *(CI)* 更新release信息 -- 更新readme +- 更新软件信息 +- 更新控件提示 +- 修改部分文案 +- Bump version to 2.7.0.1 diff --git a/update.xml b/update.xml index c0c151b..f7c57b4 100644 --- a/update.xml +++ b/update.xml @@ -1,7 +1,7 @@ - 2.7.0.0 - https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.7.0.0/subs-check-win.zip + 2.7.0.1 + https://gh.39.al/https://github.com/sinspired/SubsCheck-Win-GUI/releases/download/v2.7.0.1/subs-check-win.zip https://gh.39.al/https://raw.githubusercontent.com/sinspired/SubsCheck-Win-GUI/master/CHANGELOG.md true subs-check.win.gui.exe