mirror of
https://github.com/zs-yg/kortapp-z.git
synced 2025-12-07 00:20:43 +08:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee65689048 | ||
|
|
4ef8099054 | ||
|
|
6dd8819f22 | ||
|
|
59900081da | ||
|
|
2c60d0b970 | ||
|
|
815ba41bdc | ||
|
|
459c0bc9d7 | ||
|
|
7c78a118a9 | ||
|
|
d5f944280e | ||
|
|
1cd722bf89 | ||
|
|
e34a954777 | ||
|
|
125bf6b0d4 | ||
|
|
983a0d5bf4 | ||
|
|
259b075541 | ||
|
|
d454ac0fdc | ||
|
|
d5c83d854c | ||
|
|
1c2bc713be | ||
|
|
1539c665f0 | ||
|
|
074e55fbbc | ||
|
|
334fa56070 |
115
.github/workflows/dotnet-desktop.yml
vendored
Normal file
115
.github/workflows/dotnet-desktop.yml
vendored
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
# This workflow uses actions that are not certified by GitHub.
|
||||||
|
# They are provided by a third-party and are governed by
|
||||||
|
# separate terms of service, privacy policy, and support
|
||||||
|
# documentation.
|
||||||
|
|
||||||
|
# This workflow will build, test, sign and package a WPF or Windows Forms desktop application
|
||||||
|
# built on .NET Core.
|
||||||
|
# To learn how to migrate your existing application to .NET Core,
|
||||||
|
# refer to https://docs.microsoft.com/en-us/dotnet/desktop-wpf/migration/convert-project-from-net-framework
|
||||||
|
#
|
||||||
|
# To configure this workflow:
|
||||||
|
#
|
||||||
|
# 1. Configure environment variables
|
||||||
|
# GitHub sets default environment variables for every workflow run.
|
||||||
|
# Replace the variables relative to your project in the "env" section below.
|
||||||
|
#
|
||||||
|
# 2. Signing
|
||||||
|
# Generate a signing certificate in the Windows Application
|
||||||
|
# Packaging Project or add an existing signing certificate to the project.
|
||||||
|
# Next, use PowerShell to encode the .pfx file using Base64 encoding
|
||||||
|
# by running the following Powershell script to generate the output string:
|
||||||
|
#
|
||||||
|
# $pfx_cert = Get-Content '.\SigningCertificate.pfx' -Encoding Byte
|
||||||
|
# [System.Convert]::ToBase64String($pfx_cert) | Out-File 'SigningCertificate_Encoded.txt'
|
||||||
|
#
|
||||||
|
# Open the output file, SigningCertificate_Encoded.txt, and copy the
|
||||||
|
# string inside. Then, add the string to the repo as a GitHub secret
|
||||||
|
# and name it "Base64_Encoded_Pfx."
|
||||||
|
# For more information on how to configure your signing certificate for
|
||||||
|
# this workflow, refer to https://github.com/microsoft/github-actions-for-desktop-apps#signing
|
||||||
|
#
|
||||||
|
# Finally, add the signing certificate password to the repo as a secret and name it "Pfx_Key".
|
||||||
|
# See "Build the Windows Application Packaging project" below to see how the secret is used.
|
||||||
|
#
|
||||||
|
# For more information on GitHub Actions, refer to https://github.com/features/actions
|
||||||
|
# For a complete CI/CD sample to get started with GitHub Action workflows for Desktop Applications,
|
||||||
|
# refer to https://github.com/microsoft/github-actions-for-desktop-apps
|
||||||
|
|
||||||
|
name: .NET Core Desktop
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
分支: [ "main" ]
|
||||||
|
pull_request:
|
||||||
|
分支: [ "main" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
build:
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
configuration: [Debug, Release]
|
||||||
|
|
||||||
|
runs-on: windows-latest # For a list of available runner types, refer to
|
||||||
|
# https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on
|
||||||
|
|
||||||
|
env:
|
||||||
|
Solution_Name: your-solution-name # Replace with your solution name, i.e. MyWpfApp.sln.
|
||||||
|
Test_Project_Path: your-test-project-path # Replace with the path to your test project, i.e. MyWpfApp.Tests\MyWpfApp.Tests.csproj.
|
||||||
|
Wap_Project_Directory: your-wap-project-directory-name # Replace with the Wap project directory relative to the solution, i.e. MyWpfApp.Package.
|
||||||
|
Wap_Project_Path: your-wap-project-path # Replace with the path to your Wap project, i.e. MyWpf.App.Package\MyWpfApp.Package.wapproj.
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
# Install the .NET Core workload
|
||||||
|
- name: Install .NET Core
|
||||||
|
uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
dotnet-version: 8.0.x
|
||||||
|
|
||||||
|
# Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
|
||||||
|
- name: Setup MSBuild.exe
|
||||||
|
uses: microsoft/setup-msbuild@v2
|
||||||
|
|
||||||
|
# Execute all unit tests in the solution
|
||||||
|
- name: Execute unit tests
|
||||||
|
run: dotnet test
|
||||||
|
|
||||||
|
# Restore the application to populate the obj folder with RuntimeIdentifiers
|
||||||
|
- name: Restore the application
|
||||||
|
run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration
|
||||||
|
env:
|
||||||
|
Configuration: ${{ matrix.configuration }}
|
||||||
|
|
||||||
|
# Decode the base 64 encoded pfx and save the Signing_Certificate
|
||||||
|
- name: Decode the pfx
|
||||||
|
run: |
|
||||||
|
$pfx_cert_byte = [System.Convert]::FromBase64String("${{ secrets.Base64_Encoded_Pfx }}")
|
||||||
|
$certificatePath = Join-Path -Path $env:Wap_Project_Directory -ChildPath GitHubActionsWorkflow.pfx
|
||||||
|
[IO.File]::WriteAllBytes("$certificatePath", $pfx_cert_byte)
|
||||||
|
|
||||||
|
# Create the app package by building and packaging the Windows Application Packaging project
|
||||||
|
- name: Create the app package
|
||||||
|
run: msbuild $env:Wap_Project_Path /p:Configuration=$env:Configuration /p:UapAppxPackageBuildMode=$env:Appx_Package_Build_Mode /p:AppxBundle=$env:Appx_Bundle /p:PackageCertificateKeyFile=GitHubActionsWorkflow.pfx /p:PackageCertificatePassword=${{ secrets.Pfx_Key }}
|
||||||
|
env:
|
||||||
|
Appx_Bundle: Always
|
||||||
|
Appx_Bundle_Platforms: x86|x64
|
||||||
|
Appx_Package_Build_Mode: StoreUpload
|
||||||
|
Configuration: ${{ matrix.configuration }}
|
||||||
|
|
||||||
|
# Remove the pfx
|
||||||
|
- name: Remove the pfx
|
||||||
|
run: Remove-Item -path $env:Wap_Project_Directory\GitHubActionsWorkflow.pfx
|
||||||
|
|
||||||
|
# Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact
|
||||||
|
- name: Upload build artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: MSIX Package
|
||||||
|
path: ${{ env.Wap_Project_Directory }}\AppPackages
|
||||||
28
.github/workflows/dotnet.yml
vendored
Normal file
28
.github/workflows/dotnet.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# This workflow will build a .NET project
|
||||||
|
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
|
||||||
|
|
||||||
|
name: .NET
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
分支: [ "main" ]
|
||||||
|
pull_request:
|
||||||
|
分支: [ "main" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
dotnet-version: 8.0.x
|
||||||
|
- name: Restore dependencies
|
||||||
|
run: dotnet restore
|
||||||
|
- name: Build
|
||||||
|
run: dotnet build --no-restore
|
||||||
|
- name: Test
|
||||||
|
run: dotnet test --no-build --verbosity normal
|
||||||
294
AboutForm.cs
294
AboutForm.cs
@@ -1,144 +1,150 @@
|
|||||||
using System;
|
// _ _
|
||||||
using System.Drawing;
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
using System.Windows.Forms;
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
namespace AppStore
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
{
|
// |_| |_|
|
||||||
public class AboutUserControl : UserControl
|
using System;
|
||||||
{
|
using System.Drawing;
|
||||||
private PictureBox logo = null!;
|
using System.Windows.Forms;
|
||||||
private Label infoLabel = null!;
|
|
||||||
|
namespace AppStore
|
||||||
public AboutUserControl()
|
{
|
||||||
{
|
public class AboutUserControl : UserControl
|
||||||
InitializeComponent();
|
{
|
||||||
}
|
private PictureBox logo = null!;
|
||||||
|
private Label infoLabel = null!;
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
public AboutUserControl()
|
||||||
this.Dock = DockStyle.Fill;
|
{
|
||||||
this.BackColor = ThemeManager.BackgroundColor;
|
InitializeComponent();
|
||||||
this.Padding = new Padding(20);
|
}
|
||||||
|
|
||||||
// 创建主布局面板
|
private void InitializeComponent()
|
||||||
TableLayoutPanel mainLayout = new TableLayoutPanel();
|
{
|
||||||
mainLayout.Dock = DockStyle.Fill;
|
this.Dock = DockStyle.Fill;
|
||||||
mainLayout.BackColor = ThemeManager.BackgroundColor;
|
this.BackColor = ThemeManager.BackgroundColor;
|
||||||
mainLayout.ColumnCount = 1;
|
this.Padding = new Padding(20);
|
||||||
mainLayout.RowCount = 2;
|
|
||||||
mainLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
// 创建主布局面板
|
||||||
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
TableLayoutPanel mainLayout = new TableLayoutPanel();
|
||||||
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
mainLayout.Dock = DockStyle.Fill;
|
||||||
mainLayout.Padding = new Padding(0, 20, 0, 20);
|
mainLayout.BackColor = ThemeManager.BackgroundColor;
|
||||||
|
mainLayout.ColumnCount = 1;
|
||||||
// 初始化并添加应用图标
|
mainLayout.RowCount = 2;
|
||||||
logo = new PictureBox();
|
mainLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
||||||
try
|
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
||||||
{
|
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
||||||
logo.Image = Image.FromFile("img/png/kortapp-z.png");
|
mainLayout.Padding = new Padding(0, 20, 0, 20);
|
||||||
}
|
|
||||||
catch (Exception ex)
|
// 初始化并添加应用图标
|
||||||
{
|
logo = new PictureBox();
|
||||||
Logger.LogError($"无法加载应用图标: {ex.Message}");
|
try
|
||||||
logo.Image = SystemIcons.Application.ToBitmap();
|
{
|
||||||
}
|
logo.Image = Image.FromFile("img/png/kortapp-z.png");
|
||||||
logo.SizeMode = PictureBoxSizeMode.Zoom;
|
}
|
||||||
logo.Width = 200;
|
catch (Exception ex)
|
||||||
logo.Height = 200;
|
{
|
||||||
logo.Anchor = AnchorStyles.None;
|
Logger.LogError($"无法加载应用图标: {ex.Message}");
|
||||||
logo.Margin = new Padding(0, 0, 0, 20);
|
logo.Image = SystemIcons.Application.ToBitmap();
|
||||||
mainLayout.Controls.Add(logo, 0, 0);
|
}
|
||||||
|
logo.SizeMode = PictureBoxSizeMode.Zoom;
|
||||||
// 初始化并添加应用信息
|
logo.Width = 200;
|
||||||
infoLabel = new Label();
|
logo.Height = 200;
|
||||||
infoLabel.Text = "kortapp-z\n版本: 1.1.1\n作者: zs-yg\n一个简单、开源的应用商店\nkortapp-z是完全免费\n基于.NET8和C/C++的软件";
|
logo.Anchor = AnchorStyles.None;
|
||||||
infoLabel.Font = new Font("Microsoft YaHei", 12);
|
logo.Margin = new Padding(0, 0, 0, 20);
|
||||||
infoLabel.AutoSize = false;
|
mainLayout.Controls.Add(logo, 0, 0);
|
||||||
infoLabel.Width = 300;
|
|
||||||
infoLabel.Height = 130; // 增加高度确保文字完整显示
|
// 初始化并添加应用信息
|
||||||
infoLabel.TextAlign = ContentAlignment.MiddleCenter;
|
infoLabel = new Label();
|
||||||
infoLabel.Anchor = AnchorStyles.None;
|
infoLabel.Text = "kortapp-z\n版本: 1.1.4\n作者: zs-yg\n一个简单、开源的应用商店\nkortapp-z是完全免费\n基于.NET8和C/C++的软件";
|
||||||
mainLayout.Controls.Add(infoLabel, 0, 1);
|
infoLabel.Font = new Font("Microsoft YaHei", 12);
|
||||||
|
infoLabel.AutoSize = false;
|
||||||
// 调整主布局为3行
|
infoLabel.Width = 300;
|
||||||
mainLayout.RowCount = 3;
|
infoLabel.Height = 130; // 增加高度确保文字完整显示
|
||||||
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
infoLabel.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
infoLabel.Anchor = AnchorStyles.None;
|
||||||
mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
|
mainLayout.Controls.Add(infoLabel, 0, 1);
|
||||||
|
|
||||||
// 在底部添加GitHub链接区域
|
// 调整主布局为3行
|
||||||
TableLayoutPanel githubPanel = new TableLayoutPanel();
|
mainLayout.RowCount = 3;
|
||||||
githubPanel.Dock = DockStyle.Bottom;
|
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
||||||
githubPanel.BackColor = ThemeManager.BackgroundColor;
|
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
||||||
githubPanel.Height = 60;
|
mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
|
||||||
githubPanel.ColumnCount = 3;
|
|
||||||
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
// 在底部添加GitHub链接区域
|
||||||
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
|
TableLayoutPanel githubPanel = new TableLayoutPanel();
|
||||||
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
githubPanel.Dock = DockStyle.Bottom;
|
||||||
githubPanel.RowCount = 1;
|
githubPanel.BackColor = ThemeManager.BackgroundColor;
|
||||||
githubPanel.Padding = new Padding(10);
|
githubPanel.Height = 60;
|
||||||
|
githubPanel.ColumnCount = 3;
|
||||||
// 添加GitHub图标
|
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||||
PictureBox githubIcon = new PictureBox();
|
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
|
||||||
try
|
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||||
{
|
githubPanel.RowCount = 1;
|
||||||
githubIcon.Image = Image.FromFile("img/jpg/github.jpg");
|
githubPanel.Padding = new Padding(10);
|
||||||
}
|
|
||||||
catch (Exception ex)
|
// 添加GitHub图标
|
||||||
{
|
PictureBox githubIcon = new PictureBox();
|
||||||
Logger.LogError($"无法加载GitHub图标: {ex.Message}");
|
try
|
||||||
githubIcon.Image = SystemIcons.Application.ToBitmap();
|
{
|
||||||
}
|
githubIcon.Image = Image.FromFile("img/jpg/github.jpg");
|
||||||
githubIcon.SizeMode = PictureBoxSizeMode.Zoom;
|
}
|
||||||
githubIcon.Width = 30;
|
catch (Exception ex)
|
||||||
githubIcon.Height = 30;
|
{
|
||||||
githubIcon.Cursor = Cursors.Hand;
|
Logger.LogError($"无法加载GitHub图标: {ex.Message}");
|
||||||
githubIcon.Click += (s, e) => {
|
githubIcon.Image = SystemIcons.Application.ToBitmap();
|
||||||
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
|
}
|
||||||
{
|
githubIcon.SizeMode = PictureBoxSizeMode.Zoom;
|
||||||
FileName = "https://github.com/zs-yg/kortapp-z",
|
githubIcon.Width = 30;
|
||||||
UseShellExecute = true
|
githubIcon.Height = 30;
|
||||||
});
|
githubIcon.Cursor = Cursors.Hand;
|
||||||
};
|
githubIcon.Click += (s, e) => {
|
||||||
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
|
||||||
// 添加文字说明
|
{
|
||||||
Label githubLabel = new Label();
|
FileName = "https://github.com/zs-yg/kortapp-z",
|
||||||
githubLabel.Text = "🤗🤗🤗开源地址 🌟 欢迎点star和提交pr 🚀";
|
UseShellExecute = true
|
||||||
githubLabel.Font = new Font("Microsoft YaHei", 10);
|
});
|
||||||
githubLabel.AutoSize = true;
|
};
|
||||||
githubLabel.Margin = new Padding(10, 0, 0, 0);
|
|
||||||
|
// 添加文字说明
|
||||||
// 创建包含图标和文字的面板
|
Label githubLabel = new Label();
|
||||||
Panel linkPanel = new Panel();
|
githubLabel.Text = "🤗🤗🤗开源地址 🌟 欢迎点star和提交pr 🚀";
|
||||||
linkPanel.AutoSize = true;
|
githubLabel.Font = new Font("Microsoft YaHei", 10);
|
||||||
linkPanel.BackColor = ThemeManager.BackgroundColor;
|
githubLabel.AutoSize = true;
|
||||||
linkPanel.Controls.Add(githubIcon);
|
githubLabel.Margin = new Padding(10, 0, 0, 0);
|
||||||
linkPanel.Controls.Add(githubLabel);
|
|
||||||
githubIcon.Location = new Point(0, 0);
|
// 创建包含图标和文字的面板
|
||||||
githubLabel.Location = new Point(githubIcon.Width + 10, 5);
|
Panel linkPanel = new Panel();
|
||||||
|
linkPanel.AutoSize = true;
|
||||||
// 将链接面板添加到中间列
|
linkPanel.BackColor = ThemeManager.BackgroundColor;
|
||||||
githubPanel.Controls.Add(linkPanel, 1, 0);
|
linkPanel.Controls.Add(githubIcon);
|
||||||
|
linkPanel.Controls.Add(githubLabel);
|
||||||
this.Controls.Add(mainLayout);
|
githubIcon.Location = new Point(0, 0);
|
||||||
this.Controls.Add(githubPanel);
|
githubLabel.Location = new Point(githubIcon.Width + 10, 5);
|
||||||
}
|
|
||||||
}
|
// 将链接面板添加到中间列
|
||||||
|
githubPanel.Controls.Add(linkPanel, 1, 0);
|
||||||
// 保留原AboutForm作为容器(可选)
|
|
||||||
public class AboutForm : Form
|
this.Controls.Add(mainLayout);
|
||||||
{
|
this.Controls.Add(githubPanel);
|
||||||
public AboutForm()
|
}
|
||||||
{
|
}
|
||||||
this.Text = "关于 kortapp-z";
|
|
||||||
this.Size = new Size(500, 400);
|
// 保留原AboutForm作为容器(可选)
|
||||||
this.StartPosition = FormStartPosition.CenterScreen;
|
public class AboutForm : Form
|
||||||
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
{
|
||||||
this.MaximizeBox = false;
|
public AboutForm()
|
||||||
this.MinimizeBox = false;
|
{
|
||||||
|
this.Text = "关于 kortapp-z";
|
||||||
var aboutControl = new AboutUserControl();
|
this.Size = new Size(500, 400);
|
||||||
this.Controls.Add(aboutControl);
|
this.StartPosition = FormStartPosition.CenterScreen;
|
||||||
}
|
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||||
}
|
this.MaximizeBox = false;
|
||||||
}
|
this.MinimizeBox = false;
|
||||||
|
|
||||||
|
var aboutControl = new AboutUserControl();
|
||||||
|
this.Controls.Add(aboutControl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
197
AppCard.cs
197
AppCard.cs
@@ -1,3 +1,9 @@
|
|||||||
|
// _ _
|
||||||
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
@@ -53,28 +59,53 @@ namespace AppStore
|
|||||||
InitializeBorder();
|
InitializeBorder();
|
||||||
});
|
});
|
||||||
|
|
||||||
// 应用图标
|
// 应用图标 - 添加null检查
|
||||||
iconBox = new PictureBox();
|
if (iconBox != null && this != null && this.Controls != null)
|
||||||
iconBox.Size = new Size(80, 80);
|
{
|
||||||
iconBox.Location = new Point((Width - 80) / 2, 15);
|
iconBox.Size = new Size(80, 80);
|
||||||
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
|
iconBox.Location = new Point((Width - 80) / 2, 15);
|
||||||
this.Controls.Add(iconBox);
|
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||||
|
this.Controls.Add(iconBox);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.LogWarning("iconBox或Controls为null");
|
||||||
|
}
|
||||||
|
|
||||||
// 应用名称 - 使用Panel包裹Label实现边框颜色
|
// 应用名称 - 使用Panel包裹Label实现边框颜色
|
||||||
// namePanel已在构造函数中初始化
|
if (namePanel != null)
|
||||||
namePanel.Size = new Size(Width - 20, 40);
|
{
|
||||||
namePanel.Location = new Point(10, 100);
|
namePanel.Size = new Size(Width - 20, 40);
|
||||||
namePanel.Paint += (sender, e) => {
|
namePanel.Location = new Point(10, 100);
|
||||||
ControlPaint.DrawBorder(e.Graphics, namePanel.ClientRectangle,
|
namePanel.Paint += (sender, e) => {
|
||||||
borderColor, ButtonBorderStyle.Solid);
|
try
|
||||||
};
|
{
|
||||||
|
if (e != null && e.Graphics != null && namePanel != null)
|
||||||
|
{
|
||||||
|
var rect = namePanel.ClientRectangle;
|
||||||
|
if (rect.Width > 0 && rect.Height > 0)
|
||||||
|
{
|
||||||
|
ControlPaint.DrawBorder(e.Graphics, rect,
|
||||||
|
borderColor, ButtonBorderStyle.Solid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogWarning($"绘制namePanel边框失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
nameLabel = new Label();
|
nameLabel = new Label();
|
||||||
nameLabel.Dock = DockStyle.Fill;
|
nameLabel.Dock = DockStyle.Fill;
|
||||||
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
|
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
|
||||||
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
|
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
|
||||||
namePanel.Controls.Add(nameLabel);
|
if (namePanel != null && nameLabel != null)
|
||||||
|
{
|
||||||
|
namePanel.Controls.Add(nameLabel);
|
||||||
|
}
|
||||||
|
|
||||||
// 初始主题设置
|
// 初始主题设置
|
||||||
UpdateLabelTheme();
|
UpdateLabelTheme();
|
||||||
@@ -82,32 +113,43 @@ namespace AppStore
|
|||||||
// 订阅主题变化事件
|
// 订阅主题变化事件
|
||||||
ThemeManager.ThemeChanged += (theme) => UpdateLabelTheme();
|
ThemeManager.ThemeChanged += (theme) => UpdateLabelTheme();
|
||||||
|
|
||||||
this.Controls.Add(namePanel);
|
if (this != null && this.Controls != null && namePanel != null)
|
||||||
|
{
|
||||||
|
this.Controls.Add(namePanel);
|
||||||
|
}
|
||||||
|
|
||||||
// 下载按钮
|
// 下载按钮 - 添加null检查
|
||||||
downloadBtn = new Button();
|
if (downloadBtn != null)
|
||||||
downloadBtn.Text = "下载";
|
{
|
||||||
downloadBtn.Size = new Size(100, 32);
|
downloadBtn.Text = "下载";
|
||||||
downloadBtn.Location = new Point((Width - 100) / 2, 150);
|
downloadBtn.Size = new Size(100, 32);
|
||||||
downloadBtn.BackColor = Color.FromArgb(0, 120, 215);
|
downloadBtn.Location = new Point((Width - 100) / 2, 150);
|
||||||
downloadBtn.ForeColor = Color.White;
|
|
||||||
downloadBtn.FlatStyle = FlatStyle.Flat;
|
|
||||||
downloadBtn.FlatAppearance.BorderSize = 0;
|
|
||||||
downloadBtn.Cursor = Cursors.Hand;
|
|
||||||
downloadBtn.Font = new Font("Microsoft YaHei", 9);
|
|
||||||
|
|
||||||
// 按钮悬停效果
|
|
||||||
downloadBtn.MouseEnter += (s, e) => {
|
|
||||||
downloadBtn.BackColor = Color.FromArgb(0, 150, 255);
|
|
||||||
};
|
|
||||||
|
|
||||||
downloadBtn.MouseLeave += (s, e) => {
|
|
||||||
downloadBtn.BackColor = Color.FromArgb(0, 120, 215);
|
downloadBtn.BackColor = Color.FromArgb(0, 120, 215);
|
||||||
};
|
downloadBtn.ForeColor = Color.White;
|
||||||
|
downloadBtn.FlatStyle = FlatStyle.Flat;
|
||||||
downloadBtn.Click += DownloadBtn_Click;
|
downloadBtn.FlatAppearance.BorderSize = 0;
|
||||||
this.Controls.Add(downloadBtn);
|
downloadBtn.Cursor = Cursors.Hand;
|
||||||
downloadBtn.Visible = ShowDownloadButton;
|
downloadBtn.Font = new Font("Microsoft YaHei", 9);
|
||||||
|
|
||||||
|
// 按钮悬停效果 - 添加null检查
|
||||||
|
downloadBtn.MouseEnter += (s, e) => {
|
||||||
|
if (downloadBtn != null)
|
||||||
|
{
|
||||||
|
downloadBtn.BackColor = Color.FromArgb(0, 150, 255);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
downloadBtn.MouseLeave += (s, e) => {
|
||||||
|
if (downloadBtn != null)
|
||||||
|
{
|
||||||
|
downloadBtn.BackColor = Color.FromArgb(0, 120, 215);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
downloadBtn.Click += DownloadBtn_Click;
|
||||||
|
this.Controls.Add(downloadBtn);
|
||||||
|
downloadBtn.Visible = ShowDownloadButton;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateLabelTheme()
|
private void UpdateLabelTheme()
|
||||||
@@ -126,7 +168,14 @@ namespace AppStore
|
|||||||
namePanel.BackColor = Color.White;
|
namePanel.BackColor = Color.White;
|
||||||
borderColor = SystemColors.ControlDark;
|
borderColor = SystemColors.ControlDark;
|
||||||
}
|
}
|
||||||
namePanel.Invalidate(); // 触发重绘
|
if (namePanel != null && !namePanel.IsDisposed)
|
||||||
|
{
|
||||||
|
namePanel.Invalidate(); // 触发重绘
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.LogWarning("namePanel为null或已释放");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -256,22 +305,37 @@ namespace AppStore
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 启动C++程序计算路径
|
// 启动C++程序计算路径
|
||||||
using (var process = Process.Start(startInfo)) {
|
if (startInfo != null)
|
||||||
process.WaitForExit();
|
{
|
||||||
|
using (var process = Process.Start(startInfo))
|
||||||
// 检查计算结果
|
{
|
||||||
if (process.ExitCode == 0 && File.Exists(tempFile)) {
|
if (process != null)
|
||||||
// 读取生成的路径点
|
{
|
||||||
var lines = File.ReadAllLines(tempFile);
|
process.WaitForExit();
|
||||||
PointF[] points = lines.Select(line => {
|
|
||||||
var parts = line.Split(','); // 解析坐标
|
// 检查计算结果
|
||||||
return new PointF(float.Parse(parts[0]), float.Parse(parts[1]));
|
if (process.ExitCode == 0 && File.Exists(tempFile))
|
||||||
}).ToArray();
|
{
|
||||||
|
try
|
||||||
// 创建并缓存路径对象
|
{
|
||||||
path = new System.Drawing.Drawing2D.GraphicsPath();
|
// 读取生成的路径点
|
||||||
path.AddLines(points);
|
var lines = File.ReadAllLines(tempFile);
|
||||||
PathCache.TryAdd(cacheKey, path);
|
PointF[] points = lines.Select(line => {
|
||||||
|
var parts = line.Split(','); // 解析坐标
|
||||||
|
return new PointF(float.Parse(parts[0]), float.Parse(parts[1]));
|
||||||
|
}).ToArray();
|
||||||
|
|
||||||
|
// 创建并缓存路径对象
|
||||||
|
path = new System.Drawing.Drawing2D.GraphicsPath();
|
||||||
|
path.AddLines(points);
|
||||||
|
PathCache.TryAdd(cacheKey, path);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogWarning($"读取路径点失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@@ -347,8 +411,18 @@ namespace AppStore
|
|||||||
|
|
||||||
public void UpdateDisplay()
|
public void UpdateDisplay()
|
||||||
{
|
{
|
||||||
nameLabel.Text = AppName;
|
if (nameLabel != null && AppName != null)
|
||||||
iconBox.Image = AppIcon;
|
{
|
||||||
|
nameLabel.Text = AppName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.LogWarning("nameLabel或AppName为null");
|
||||||
|
}
|
||||||
|
if (iconBox != null && AppIcon != null)
|
||||||
|
{
|
||||||
|
iconBox.Image = AppIcon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DownloadBtn_Click(object sender, EventArgs e)
|
private void DownloadBtn_Click(object sender, EventArgs e)
|
||||||
@@ -358,14 +432,15 @@ namespace AppStore
|
|||||||
// 更严格的null检查
|
// 更严格的null检查
|
||||||
// 更严格的null检查,包括DownloadManager.Instance和其方法
|
// 更严格的null检查,包括DownloadManager.Instance和其方法
|
||||||
// 全面的null和状态检查
|
// 全面的null和状态检查
|
||||||
|
var downloadManager = DownloadManager.Instance;
|
||||||
if (sender == null || e == null ||
|
if (sender == null || e == null ||
|
||||||
string.IsNullOrWhiteSpace(DownloadUrl) ||
|
string.IsNullOrWhiteSpace(DownloadUrl) ||
|
||||||
string.IsNullOrWhiteSpace(AppName) ||
|
string.IsNullOrWhiteSpace(AppName) ||
|
||||||
!this.IsHandleCreated ||
|
!this.IsHandleCreated ||
|
||||||
this.IsDisposed ||
|
this.IsDisposed ||
|
||||||
DownloadManager.Instance == null ||
|
downloadManager == null ||
|
||||||
DownloadManager.Instance.DownloadItems == null ||
|
downloadManager.DownloadItems == null ||
|
||||||
DownloadManager.Instance.StartDownload == null)
|
downloadManager.StartDownload == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -373,7 +448,7 @@ namespace AppStore
|
|||||||
string safeAppName = AppName ?? "未知应用";
|
string safeAppName = AppName ?? "未知应用";
|
||||||
string fileName = $"{safeAppName.Replace(" ", "_")}.exe";
|
string fileName = $"{safeAppName.Replace(" ", "_")}.exe";
|
||||||
|
|
||||||
DownloadManager.Instance.StartDownload(fileName, DownloadUrl);
|
downloadManager.StartDownload(fileName, DownloadUrl);
|
||||||
|
|
||||||
string message = $"已开始下载: {safeAppName}";
|
string message = $"已开始下载: {safeAppName}";
|
||||||
this.Invoke((MethodInvoker)delegate {
|
this.Invoke((MethodInvoker)delegate {
|
||||||
|
|||||||
63
AppSearch.cs
Normal file
63
AppSearch.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// _ _
|
||||||
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppStore
|
||||||
|
{
|
||||||
|
public static class AppSearch
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 搜索应用卡片
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="flowPanel">包含应用卡片的FlowLayoutPanel</param>
|
||||||
|
/// <param name="searchText">搜索文本</param>
|
||||||
|
public static void SearchApps(FlowLayoutPanel flowPanel, string searchText)
|
||||||
|
{
|
||||||
|
if (flowPanel == null || string.IsNullOrWhiteSpace(searchText))
|
||||||
|
{
|
||||||
|
ShowAllApps(flowPanel);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (Control control in flowPanel.Controls)
|
||||||
|
{
|
||||||
|
if (control is AppCard appCard)
|
||||||
|
{
|
||||||
|
bool isMatch = IsMatchSearch(appCard.AppName, searchText);
|
||||||
|
control.Visible = isMatch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示所有应用卡片
|
||||||
|
/// </summary>
|
||||||
|
public static void ShowAllApps(FlowLayoutPanel? flowPanel)
|
||||||
|
{
|
||||||
|
if (flowPanel == null) return;
|
||||||
|
|
||||||
|
foreach (Control control in flowPanel.Controls)
|
||||||
|
{
|
||||||
|
control.Visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查应用名称是否匹配搜索文本
|
||||||
|
/// </summary>
|
||||||
|
private static bool IsMatchSearch(string appName, string searchText)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(appName)) return false;
|
||||||
|
|
||||||
|
// 不区分大小写比较
|
||||||
|
return appName.Contains(searchText, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,43 +1,41 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<NoWarn>CS8622</NoWarn>
|
<NoWarn>CS8622</NoWarn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<UseWindowsForms>true</UseWindowsForms>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<WarningsAsErrors>CS8618</WarningsAsErrors>
|
<WarningsAsErrors>CS8618</WarningsAsErrors>
|
||||||
<ApplicationIcon>img\ico\icon.ico</ApplicationIcon>
|
<ApplicationIcon>img\ico\icon.ico</ApplicationIcon>
|
||||||
<Platforms>x86;x64</Platforms>
|
<Platforms>x86;x64</Platforms>
|
||||||
</PropertyGroup>
|
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
|
||||||
<None Include="help.txt" />
|
<ItemGroup>
|
||||||
<None Include="resource\NetWorkManager\*">
|
<None Include="help.txt" />
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<None Include="resource\*.exe">
|
||||||
</None>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<None Include="resource\*.exe">
|
</None>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<None Include="img\png\*.png">
|
||||||
</None>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<None Include="img\png\*.png">
|
</None>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<None Include="img\jpg\*.jpg">
|
||||||
</None>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<None Include="img\jpg\*.jpg">
|
</None>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<None Include="img\resource\png\*.png">
|
||||||
</None>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<None Include="img\resource\png\*.png">
|
</None>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<None Include="img\ico\*.ico">
|
||||||
</None>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<None Include="img\ico\*.ico">
|
</None>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
</ItemGroup>
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="ZXing.Net" Version="0.16.9" />
|
||||||
<ItemGroup>
|
</ItemGroup>
|
||||||
<PackageReference Include="ZXing.Net" Version="0.16.8" />
|
|
||||||
</ItemGroup>
|
</Project>
|
||||||
|
|
||||||
</Project>
|
|
||||||
|
|||||||
256
DownloadItem.cs
256
DownloadItem.cs
@@ -1,125 +1,131 @@
|
|||||||
using System;
|
// _ _
|
||||||
using System.Drawing;
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
using System.Windows.Forms;
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
namespace AppStore
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
{
|
// |_| |_|
|
||||||
public class DownloadItem : UserControl
|
using System;
|
||||||
{
|
using System.Drawing;
|
||||||
private Label nameLabel;
|
using System.Windows.Forms;
|
||||||
private ProgressBar progressBar;
|
|
||||||
private Label statusLabel;
|
namespace AppStore
|
||||||
private Button cancelBtn;
|
{
|
||||||
|
public class DownloadItem : UserControl
|
||||||
public string FileName { get; set; } = string.Empty;
|
{
|
||||||
public int Progress { get; set; }
|
private Label nameLabel;
|
||||||
public string Status { get; set; } = string.Empty;
|
private ProgressBar progressBar;
|
||||||
|
private Label statusLabel;
|
||||||
public DownloadItem()
|
private Button cancelBtn;
|
||||||
{
|
|
||||||
nameLabel = new Label();
|
public string FileName { get; set; } = string.Empty;
|
||||||
progressBar = new ProgressBar();
|
public int Progress { get; set; }
|
||||||
statusLabel = new Label();
|
public string Status { get; set; } = string.Empty;
|
||||||
cancelBtn = new Button();
|
|
||||||
|
public DownloadItem()
|
||||||
InitializeComponent();
|
{
|
||||||
|
nameLabel = new Label();
|
||||||
// 监听主题变化
|
progressBar = new ProgressBar();
|
||||||
ThemeManager.ThemeChanged += (theme) => {
|
statusLabel = new Label();
|
||||||
this.Invoke((MethodInvoker)delegate {
|
cancelBtn = new Button();
|
||||||
ApplyTheme();
|
|
||||||
});
|
InitializeComponent();
|
||||||
};
|
|
||||||
}
|
// 监听主题变化
|
||||||
|
ThemeManager.ThemeChanged += (theme) => {
|
||||||
private void ApplyTheme()
|
this.Invoke((MethodInvoker)delegate {
|
||||||
{
|
ApplyTheme();
|
||||||
this.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
});
|
||||||
? Color.White
|
};
|
||||||
: Color.Black;
|
}
|
||||||
this.ForeColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
|
||||||
? Color.Black
|
private void ApplyTheme()
|
||||||
: Color.White;
|
{
|
||||||
|
this.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
||||||
cancelBtn.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
? Color.White
|
||||||
? SystemColors.Control
|
: Color.Black;
|
||||||
: Color.FromArgb(70, 70, 70);
|
this.ForeColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
||||||
cancelBtn.ForeColor = ThemeManager.TextColor;
|
? Color.Black
|
||||||
}
|
: Color.White;
|
||||||
|
|
||||||
private void InitializeComponent()
|
cancelBtn.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
||||||
{
|
? SystemColors.Control
|
||||||
this.Size = new Size(400, 60);
|
: Color.FromArgb(70, 70, 70);
|
||||||
this.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
cancelBtn.ForeColor = ThemeManager.TextColor;
|
||||||
? Color.White
|
}
|
||||||
: Color.Black;
|
|
||||||
this.BorderStyle = BorderStyle.FixedSingle;
|
private void InitializeComponent()
|
||||||
this.ForeColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
{
|
||||||
? Color.Black
|
this.Size = new Size(400, 60);
|
||||||
: Color.White;
|
this.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
||||||
|
? Color.White
|
||||||
// 文件名标签
|
: Color.Black;
|
||||||
nameLabel = new Label();
|
this.BorderStyle = BorderStyle.FixedSingle;
|
||||||
nameLabel.AutoSize = true;
|
this.ForeColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
||||||
nameLabel.Location = new Point(10, 10);
|
? Color.Black
|
||||||
nameLabel.Font = new Font("Microsoft YaHei", 9, FontStyle.Bold);
|
: Color.White;
|
||||||
this.Controls.Add(nameLabel);
|
|
||||||
|
// 文件名标签
|
||||||
// 进度条
|
nameLabel = new Label();
|
||||||
progressBar = new ProgressBar();
|
nameLabel.AutoSize = true;
|
||||||
progressBar.Size = new Size(200, 20);
|
nameLabel.Location = new Point(10, 10);
|
||||||
progressBar.Location = new Point(10, 30);
|
nameLabel.Font = new Font("Microsoft YaHei", 9, FontStyle.Bold);
|
||||||
this.Controls.Add(progressBar);
|
this.Controls.Add(nameLabel);
|
||||||
|
|
||||||
// 状态标签
|
// 进度条
|
||||||
statusLabel = new Label();
|
progressBar = new ProgressBar();
|
||||||
statusLabel.AutoSize = true;
|
progressBar.Size = new Size(200, 20);
|
||||||
statusLabel.Location = new Point(220, 30);
|
progressBar.Location = new Point(10, 30);
|
||||||
statusLabel.Font = new Font("Microsoft YaHei", 8);
|
this.Controls.Add(progressBar);
|
||||||
this.Controls.Add(statusLabel);
|
|
||||||
|
// 状态标签
|
||||||
// 取消按钮
|
statusLabel = new Label();
|
||||||
cancelBtn = new Button();
|
statusLabel.AutoSize = true;
|
||||||
cancelBtn.Text = "取消";
|
statusLabel.Location = new Point(220, 30);
|
||||||
cancelBtn.Size = new Size(60, 25);
|
statusLabel.Font = new Font("Microsoft YaHei", 8);
|
||||||
cancelBtn.Location = new Point(320, 30);
|
this.Controls.Add(statusLabel);
|
||||||
cancelBtn.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
|
||||||
? SystemColors.Control
|
// 取消按钮
|
||||||
: Color.FromArgb(70, 70, 70);
|
cancelBtn = new Button();
|
||||||
cancelBtn.ForeColor = ThemeManager.TextColor;
|
cancelBtn.Text = "取消";
|
||||||
cancelBtn.FlatStyle = FlatStyle.Flat;
|
cancelBtn.Size = new Size(60, 25);
|
||||||
cancelBtn.FlatAppearance.BorderSize = 0;
|
cancelBtn.Location = new Point(320, 30);
|
||||||
cancelBtn.Click += CancelBtn_Click;
|
cancelBtn.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
|
||||||
this.Controls.Add(cancelBtn);
|
? SystemColors.Control
|
||||||
}
|
: Color.FromArgb(70, 70, 70);
|
||||||
|
cancelBtn.ForeColor = ThemeManager.TextColor;
|
||||||
public void UpdateDisplay()
|
cancelBtn.FlatStyle = FlatStyle.Flat;
|
||||||
{
|
cancelBtn.FlatAppearance.BorderSize = 0;
|
||||||
nameLabel.Text = FileName;
|
cancelBtn.Click += CancelBtn_Click;
|
||||||
progressBar.Value = Progress;
|
this.Controls.Add(cancelBtn);
|
||||||
statusLabel.Text = Status;
|
}
|
||||||
}
|
|
||||||
|
public void UpdateDisplay()
|
||||||
private void CancelBtn_Click(object sender, EventArgs e)
|
{
|
||||||
{
|
nameLabel.Text = FileName;
|
||||||
if (sender == null || e == null) return;
|
progressBar.Value = Progress;
|
||||||
if (InvokeRequired)
|
statusLabel.Text = Status;
|
||||||
{
|
}
|
||||||
Invoke(new EventHandler(CancelBtn_Click), sender, e);
|
|
||||||
return;
|
private void CancelBtn_Click(object sender, EventArgs e)
|
||||||
}
|
{
|
||||||
|
if (sender == null || e == null) return;
|
||||||
try
|
if (InvokeRequired)
|
||||||
{
|
{
|
||||||
DownloadManager.Instance.CancelDownload(this);
|
Invoke(new EventHandler(CancelBtn_Click), sender, e);
|
||||||
Status = "已取消";
|
return;
|
||||||
UpdateDisplay();
|
}
|
||||||
}
|
|
||||||
catch (Exception ex)
|
try
|
||||||
{
|
{
|
||||||
Status = $"取消失败: {ex.Message}";
|
DownloadManager.Instance.CancelDownload(this);
|
||||||
UpdateDisplay();
|
Status = "已取消";
|
||||||
}
|
UpdateDisplay();
|
||||||
}
|
}
|
||||||
}
|
catch (Exception ex)
|
||||||
}
|
{
|
||||||
|
Status = $"取消失败: {ex.Message}";
|
||||||
|
UpdateDisplay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,15 @@
|
|||||||
|
// _ _
|
||||||
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
@@ -85,36 +92,39 @@ namespace AppStore
|
|||||||
|
|
||||||
private void DownloadFile(DownloadItem downloadItem, string fileName, string url)
|
private void DownloadFile(DownloadItem downloadItem, string fileName, string url)
|
||||||
{
|
{
|
||||||
|
string downloadsDir = string.Empty;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 设置下载目录为用户文件夹中的Downloads
|
// 获取并验证下载路径
|
||||||
// 获取系统下载文件夹路径
|
downloadsDir = GetDownloadPath();
|
||||||
// 获取系统下载文件夹路径
|
|
||||||
string downloadsDir;
|
|
||||||
IntPtr pathPtr = IntPtr.Zero;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 使用SHGetKnownFolderPath API获取下载文件夹
|
// 检查路径是否有效
|
||||||
var downloadsFolderGuid = new Guid("374DE290-123F-4565-9164-39C4925E467B");
|
if (string.IsNullOrWhiteSpace(downloadsDir))
|
||||||
if (SHGetKnownFolderPath(downloadsFolderGuid, 0, IntPtr.Zero, out pathPtr) != 0)
|
|
||||||
{
|
{
|
||||||
throw new Exception("无法获取下载文件夹路径");
|
throw new Exception("下载路径为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 尝试创建目录(如果不存在)
|
||||||
|
Directory.CreateDirectory(downloadsDir);
|
||||||
|
|
||||||
|
// 验证目录是否可写
|
||||||
|
string testFile = Path.Combine(downloadsDir, "write_test.tmp");
|
||||||
|
File.WriteAllText(testFile, "test");
|
||||||
|
File.Delete(testFile);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// 回退到默认下载路径
|
||||||
|
string defaultPath = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||||
|
"Downloads");
|
||||||
|
|
||||||
downloadsDir = Marshal.PtrToStringUni(pathPtr);
|
Logger.LogError($"下载路径{downloadsDir}不可用,将使用默认路径: {defaultPath}", ex);
|
||||||
|
downloadsDir = defaultPath;
|
||||||
|
Directory.CreateDirectory(downloadsDir);
|
||||||
}
|
}
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw new Exception("无法确定下载文件夹位置,请手动指定下载路径");
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (pathPtr != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
Marshal.FreeCoTaskMem(pathPtr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Directory.CreateDirectory(downloadsDir);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -309,12 +319,20 @@ namespace AppStore
|
|||||||
currentProcess.BeginErrorReadLine();
|
currentProcess.BeginErrorReadLine();
|
||||||
progressTimer.Start();
|
progressTimer.Start();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
downloadItem.Status = $"下载错误: {ex.Message}";
|
string errorDetails = $"下载错误: {ex.Message}\n";
|
||||||
DownloadCompleted?.Invoke(downloadItem);
|
errorDetails += $"目标路径: {downloadsDir}\n";
|
||||||
|
errorDetails += $"URL: {url}";
|
||||||
}
|
|
||||||
|
downloadItem.Status = $"下载失败: {ex.Message}";
|
||||||
|
Logger.LogError(errorDetails, ex);
|
||||||
|
|
||||||
|
MessageBox.Show($"下载失败:\n{errorDetails}", "错误",
|
||||||
|
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
|
||||||
|
DownloadCompleted?.Invoke(downloadItem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CancelDownload(DownloadItem item)
|
public void CancelDownload(DownloadItem item)
|
||||||
@@ -322,7 +340,7 @@ namespace AppStore
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var process = currentProcess;
|
var process = currentProcess;
|
||||||
if (process == null || process.HasExited || process.StartInfo == null)
|
if (process?.StartInfo == null || process.HasExited)
|
||||||
{
|
{
|
||||||
item.Status = "已取消";
|
item.Status = "已取消";
|
||||||
DownloadProgressChanged?.Invoke(item);
|
DownloadProgressChanged?.Invoke(item);
|
||||||
@@ -342,5 +360,145 @@ namespace AppStore
|
|||||||
DownloadProgressChanged?.Invoke(item);
|
DownloadProgressChanged?.Invoke(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetDownloadPath()
|
||||||
|
{
|
||||||
|
// 1. 优先读取用户设置的下载路径
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string jsonPath = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||||
|
"zsyg", "kortapp-z", ".date", "dl_path", "download_path.json");
|
||||||
|
|
||||||
|
Logger.Log($"尝试读取下载路径配置文件: {jsonPath}");
|
||||||
|
|
||||||
|
if (File.Exists(jsonPath))
|
||||||
|
{
|
||||||
|
string jsonString = File.ReadAllText(jsonPath);
|
||||||
|
Logger.Log($"配置文件内容: {jsonString}");
|
||||||
|
|
||||||
|
var jsonData = JsonSerializer.Deserialize<JsonElement>(jsonString);
|
||||||
|
string customPath = jsonData.GetProperty("DownloadPath").GetString()?.Trim();
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(customPath))
|
||||||
|
{
|
||||||
|
Logger.Log($"读取到自定义路径: {customPath}");
|
||||||
|
|
||||||
|
// 处理路径格式
|
||||||
|
customPath = customPath.Replace(@"\\", @"\");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 处理路径中的环境变量和特殊字符
|
||||||
|
customPath = Environment.ExpandEnvironmentVariables(customPath);
|
||||||
|
customPath = Path.GetFullPath(customPath);
|
||||||
|
Logger.Log($"标准化后的路径: {customPath}");
|
||||||
|
|
||||||
|
// 确保路径以目录分隔符结尾
|
||||||
|
if (!customPath.EndsWith(Path.DirectorySeparatorChar.ToString()))
|
||||||
|
{
|
||||||
|
customPath += Path.DirectorySeparatorChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证驱动器是否存在
|
||||||
|
string drive = Path.GetPathRoot(customPath);
|
||||||
|
if (!Directory.Exists(drive))
|
||||||
|
{
|
||||||
|
Logger.LogError($"驱动器不存在: {drive}");
|
||||||
|
throw new Exception($"驱动器 {drive} 不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证路径
|
||||||
|
if (!Directory.Exists(customPath))
|
||||||
|
{
|
||||||
|
Logger.Log($"创建目录: {customPath}");
|
||||||
|
Directory.CreateDirectory(customPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更严格的路径可写性测试
|
||||||
|
string testFile = Path.Combine(customPath, $"write_test_{Guid.NewGuid()}.tmp");
|
||||||
|
Logger.Log($"测试路径可写性: {testFile}");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.WriteAllText(testFile, DateTime.Now.ToString());
|
||||||
|
string content = File.ReadAllText(testFile);
|
||||||
|
File.Delete(testFile);
|
||||||
|
Logger.Log($"路径验证成功: {customPath}");
|
||||||
|
return customPath.TrimEnd(Path.DirectorySeparatorChar);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError($"路径不可写: {customPath}", ex);
|
||||||
|
throw new Exception($"路径不可写: {customPath}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError($"路径处理失败: {customPath}", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.Log("未找到下载路径配置文件");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError("读取自定义下载路径失败", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 回退到系统默认下载路径
|
||||||
|
IntPtr pathPtr = IntPtr.Zero;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var downloadsFolderGuid = new Guid("374DE290-123F-4565-9164-39C4925E467B");
|
||||||
|
if (SHGetKnownFolderPath(downloadsFolderGuid, 0, IntPtr.Zero, out pathPtr) == 0)
|
||||||
|
{
|
||||||
|
string? defaultPath = Marshal.PtrToStringUni(pathPtr);
|
||||||
|
if (!string.IsNullOrEmpty(defaultPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(defaultPath);
|
||||||
|
return defaultPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.LogWarning("获取到的系统下载路径为空");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError("获取系统下载路径失败", ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (pathPtr != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pathPtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 最终回退到相对路径 ~/Downloads
|
||||||
|
string relativePath = "~/Downloads";
|
||||||
|
string userProfile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) ?? string.Empty;
|
||||||
|
string fallbackPath = relativePath.Replace("~", userProfile);
|
||||||
|
fallbackPath = Path.GetFullPath(fallbackPath);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Directory.CreateDirectory(fallbackPath);
|
||||||
|
// 测试路径可写性
|
||||||
|
string testFile = Path.Combine(fallbackPath, "write_test.tmp");
|
||||||
|
if (!string.IsNullOrEmpty(testFile))
|
||||||
|
{
|
||||||
|
File.WriteAllText(testFile, "test");
|
||||||
|
File.Delete(testFile);
|
||||||
|
}
|
||||||
|
return fallbackPath;
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
throw new Exception($"无法使用默认下载路径: {fallbackPath}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 704 KiB |
@@ -1,190 +1,196 @@
|
|||||||
using System;
|
// _ _
|
||||||
using System.Diagnostics;
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
using System.Drawing;
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
using System.IO;
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
using System.Windows.Forms;
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
namespace AppStore
|
using System;
|
||||||
{
|
using System.Diagnostics;
|
||||||
public class ImageCompressorForm : Form
|
using System.Drawing;
|
||||||
{
|
using System.IO;
|
||||||
private Button btnSelectInput = new Button();
|
using System.Windows.Forms;
|
||||||
private Button btnSelectOutput = new Button();
|
|
||||||
private Button btnCompress = new Button();
|
namespace AppStore
|
||||||
private TextBox txtInput = new TextBox();
|
{
|
||||||
private TextBox txtOutput = new TextBox();
|
public class ImageCompressorForm : Form
|
||||||
private RadioButton rbLossy = new RadioButton();
|
{
|
||||||
private RadioButton rbLossless = new RadioButton();
|
private Button btnSelectInput = new Button();
|
||||||
private TrackBar tbQuality = new TrackBar();
|
private Button btnSelectOutput = new Button();
|
||||||
private Label lblQuality = new Label();
|
private Button btnCompress = new Button();
|
||||||
private CheckBox cbKeepExif = new CheckBox();
|
private TextBox txtInput = new TextBox();
|
||||||
private ProgressBar progressBar = new ProgressBar();
|
private TextBox txtOutput = new TextBox();
|
||||||
|
private RadioButton rbLossy = new RadioButton();
|
||||||
public ImageCompressorForm()
|
private RadioButton rbLossless = new RadioButton();
|
||||||
{
|
private TrackBar tbQuality = new TrackBar();
|
||||||
InitializeComponent();
|
private Label lblQuality = new Label();
|
||||||
}
|
private CheckBox cbKeepExif = new CheckBox();
|
||||||
|
private ProgressBar progressBar = new ProgressBar();
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
public ImageCompressorForm()
|
||||||
this.Text = "图片压缩工具";
|
{
|
||||||
this.Size = new Size(500, 350);
|
InitializeComponent();
|
||||||
this.StartPosition = FormStartPosition.CenterScreen;
|
}
|
||||||
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
|
||||||
this.MaximizeBox = false;
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
// 输入文件选择
|
this.Text = "图片压缩工具";
|
||||||
btnSelectInput.Text = "选择...";
|
this.Size = new Size(500, 350);
|
||||||
btnSelectInput.Location = new Point(400, 20);
|
this.StartPosition = FormStartPosition.CenterScreen;
|
||||||
btnSelectInput.Click += (s, e) => SelectFile(txtInput);
|
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||||
this.Controls.Add(btnSelectInput);
|
this.MaximizeBox = false;
|
||||||
|
|
||||||
txtInput.Location = new Point(20, 20);
|
// 输入文件选择
|
||||||
txtInput.Size = new Size(370, 20);
|
btnSelectInput.Text = "选择...";
|
||||||
txtInput.ReadOnly = true;
|
btnSelectInput.Location = new Point(400, 20);
|
||||||
this.Controls.Add(txtInput);
|
btnSelectInput.Click += (s, e) => SelectFile(txtInput);
|
||||||
|
this.Controls.Add(btnSelectInput);
|
||||||
Label lblInput = new Label();
|
|
||||||
lblInput.Text = "输入文件:";
|
txtInput.Location = new Point(20, 20);
|
||||||
lblInput.Location = new Point(20, 0);
|
txtInput.Size = new Size(370, 20);
|
||||||
this.Controls.Add(lblInput);
|
txtInput.ReadOnly = true;
|
||||||
|
this.Controls.Add(txtInput);
|
||||||
// 输出文件选择
|
|
||||||
btnSelectOutput.Text = "选择...";
|
Label lblInput = new Label();
|
||||||
btnSelectOutput.Location = new Point(400, 70);
|
lblInput.Text = "输入文件:";
|
||||||
btnSelectOutput.Click += (s, e) => SelectFile(txtOutput, true);
|
lblInput.Location = new Point(20, 0);
|
||||||
this.Controls.Add(btnSelectOutput);
|
this.Controls.Add(lblInput);
|
||||||
|
|
||||||
txtOutput.Location = new Point(20, 70);
|
// 输出文件选择
|
||||||
txtOutput.Size = new Size(370, 20);
|
btnSelectOutput.Text = "选择...";
|
||||||
this.Controls.Add(txtOutput);
|
btnSelectOutput.Location = new Point(400, 70);
|
||||||
|
btnSelectOutput.Click += (s, e) => SelectFile(txtOutput, true);
|
||||||
Label lblOutput = new Label();
|
this.Controls.Add(btnSelectOutput);
|
||||||
lblOutput.Text = "输出文件:";
|
|
||||||
lblOutput.Location = new Point(20, 50);
|
txtOutput.Location = new Point(20, 70);
|
||||||
this.Controls.Add(lblOutput);
|
txtOutput.Size = new Size(370, 20);
|
||||||
|
this.Controls.Add(txtOutput);
|
||||||
// 压缩类型
|
|
||||||
rbLossy.Text = "有损压缩 (JPEG)";
|
Label lblOutput = new Label();
|
||||||
rbLossy.Location = new Point(20, 110);
|
lblOutput.Text = "输出文件:";
|
||||||
rbLossy.Checked = true;
|
lblOutput.Location = new Point(20, 50);
|
||||||
this.Controls.Add(rbLossy);
|
this.Controls.Add(lblOutput);
|
||||||
|
|
||||||
rbLossless.Text = "无损压缩 (PNG)";
|
// 压缩类型
|
||||||
rbLossless.Location = new Point(20, 135);
|
rbLossy.Text = "有损压缩 (JPEG)";
|
||||||
this.Controls.Add(rbLossless);
|
rbLossy.Location = new Point(20, 110);
|
||||||
|
rbLossy.Checked = true;
|
||||||
// 质量设置
|
this.Controls.Add(rbLossy);
|
||||||
tbQuality.Minimum = 1;
|
|
||||||
tbQuality.Maximum = 1000;
|
rbLossless.Text = "无损压缩 (PNG)";
|
||||||
tbQuality.Value = 800;
|
rbLossless.Location = new Point(20, 135);
|
||||||
tbQuality.Location = new Point(20, 190);
|
this.Controls.Add(rbLossless);
|
||||||
tbQuality.Size = new Size(300, 50);
|
|
||||||
tbQuality.Scroll += (s, e) => lblQuality.Text = $"压缩质量: {tbQuality.Value}";
|
// 质量设置
|
||||||
this.Controls.Add(tbQuality);
|
tbQuality.Minimum = 1;
|
||||||
|
tbQuality.Maximum = 1000;
|
||||||
lblQuality.Text = $"压缩质量: {tbQuality.Value}";
|
tbQuality.Value = 800;
|
||||||
lblQuality.Location = new Point(20, 170);
|
tbQuality.Location = new Point(20, 190);
|
||||||
this.Controls.Add(lblQuality);
|
tbQuality.Size = new Size(300, 50);
|
||||||
|
tbQuality.Scroll += (s, e) => lblQuality.Text = $"压缩质量: {tbQuality.Value}";
|
||||||
// EXIF选项
|
this.Controls.Add(tbQuality);
|
||||||
cbKeepExif.Text = "保留EXIF信息";
|
|
||||||
cbKeepExif.Location = new Point(20, 240);
|
lblQuality.Text = $"压缩质量: {tbQuality.Value}";
|
||||||
this.Controls.Add(cbKeepExif);
|
lblQuality.Location = new Point(20, 170);
|
||||||
|
this.Controls.Add(lblQuality);
|
||||||
// 压缩按钮
|
|
||||||
btnCompress.Text = "开始压缩";
|
// EXIF选项
|
||||||
btnCompress.Location = new Point(20, 280);
|
cbKeepExif.Text = "保留EXIF信息";
|
||||||
btnCompress.Size = new Size(460, 30);
|
cbKeepExif.Location = new Point(20, 240);
|
||||||
btnCompress.Click += BtnCompress_Click;
|
this.Controls.Add(cbKeepExif);
|
||||||
this.Controls.Add(btnCompress);
|
|
||||||
|
// 压缩按钮
|
||||||
// 调整窗体大小
|
btnCompress.Text = "开始压缩";
|
||||||
this.Size = new Size(500, 370);
|
btnCompress.Location = new Point(20, 280);
|
||||||
}
|
btnCompress.Size = new Size(460, 30);
|
||||||
|
btnCompress.Click += BtnCompress_Click;
|
||||||
private void SelectFile(TextBox target, bool isSave = false)
|
this.Controls.Add(btnCompress);
|
||||||
{
|
|
||||||
var dialog = isSave ? new SaveFileDialog() : new OpenFileDialog() as FileDialog;
|
// 调整窗体大小
|
||||||
dialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.bmp|所有文件|*.*";
|
this.Size = new Size(500, 370);
|
||||||
|
}
|
||||||
if (dialog.ShowDialog() == DialogResult.OK)
|
|
||||||
{
|
private void SelectFile(TextBox target, bool isSave = false)
|
||||||
target.Text = dialog.FileName;
|
{
|
||||||
}
|
var dialog = isSave ? new SaveFileDialog() : new OpenFileDialog() as FileDialog;
|
||||||
}
|
dialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.bmp|所有文件|*.*";
|
||||||
|
|
||||||
private void BtnCompress_Click(object sender, EventArgs e)
|
if (dialog.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(txtInput.Text) || !File.Exists(txtInput.Text))
|
target.Text = dialog.FileName;
|
||||||
{
|
}
|
||||||
MessageBox.Show("请选择有效的输入文件", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
}
|
||||||
return;
|
|
||||||
}
|
private void BtnCompress_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
if (string.IsNullOrEmpty(txtOutput.Text))
|
if (string.IsNullOrEmpty(txtInput.Text) || !File.Exists(txtInput.Text))
|
||||||
{
|
{
|
||||||
MessageBox.Show("请指定输出文件", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show("请选择有效的输入文件", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
btnCompress.Enabled = false;
|
if (string.IsNullOrEmpty(txtOutput.Text))
|
||||||
|
{
|
||||||
try
|
MessageBox.Show("请指定输出文件", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
{
|
return;
|
||||||
string toolPath = Path.Combine(Application.StartupPath, "resource", "image_compressor.exe");
|
}
|
||||||
if (!File.Exists(toolPath))
|
|
||||||
{
|
btnCompress.Enabled = false;
|
||||||
MessageBox.Show("图片压缩工具未找到", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
return;
|
try
|
||||||
}
|
{
|
||||||
|
string toolPath = Path.Combine(Application.StartupPath, "resource", "image_compressor.exe");
|
||||||
string args = $"\"{txtInput.Text}\" \"{txtOutput.Text}\"";
|
if (!File.Exists(toolPath))
|
||||||
args += $" -t {(rbLossy.Checked ? "lossy" : "lossless")}";
|
{
|
||||||
args += $" -q {tbQuality.Value}";
|
MessageBox.Show("图片压缩工具未找到", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
if (cbKeepExif.Checked) args += " -e";
|
return;
|
||||||
|
}
|
||||||
var process = new Process();
|
|
||||||
process.StartInfo.FileName = toolPath;
|
string args = $"\"{txtInput.Text}\" \"{txtOutput.Text}\"";
|
||||||
process.StartInfo.Arguments = args;
|
args += $" -t {(rbLossy.Checked ? "lossy" : "lossless")}";
|
||||||
process.StartInfo.UseShellExecute = false;
|
args += $" -q {tbQuality.Value}";
|
||||||
process.StartInfo.CreateNoWindow = true;
|
if (cbKeepExif.Checked) args += " -e";
|
||||||
process.StartInfo.RedirectStandardOutput = true;
|
|
||||||
process.StartInfo.RedirectStandardError = true;
|
var process = new Process();
|
||||||
|
process.StartInfo.FileName = toolPath;
|
||||||
process.OutputDataReceived += (s, ev) => {
|
process.StartInfo.Arguments = args;
|
||||||
if (!string.IsNullOrEmpty(ev.Data))
|
process.StartInfo.UseShellExecute = false;
|
||||||
Console.WriteLine(ev.Data);
|
process.StartInfo.CreateNoWindow = true;
|
||||||
};
|
process.StartInfo.RedirectStandardOutput = true;
|
||||||
|
process.StartInfo.RedirectStandardError = true;
|
||||||
process.ErrorDataReceived += (s, ev) => {
|
|
||||||
if (!string.IsNullOrEmpty(ev.Data))
|
process.OutputDataReceived += (s, ev) => {
|
||||||
Console.Error.WriteLine(ev.Data);
|
if (!string.IsNullOrEmpty(ev.Data))
|
||||||
};
|
Console.WriteLine(ev.Data);
|
||||||
|
};
|
||||||
process.Start();
|
|
||||||
process.BeginOutputReadLine();
|
process.ErrorDataReceived += (s, ev) => {
|
||||||
process.BeginErrorReadLine();
|
if (!string.IsNullOrEmpty(ev.Data))
|
||||||
process.WaitForExit();
|
Console.Error.WriteLine(ev.Data);
|
||||||
|
};
|
||||||
if (process.ExitCode == 0)
|
|
||||||
{
|
process.Start();
|
||||||
MessageBox.Show("图片压缩完成", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
process.BeginOutputReadLine();
|
||||||
}
|
process.BeginErrorReadLine();
|
||||||
else
|
process.WaitForExit();
|
||||||
{
|
|
||||||
MessageBox.Show("图片压缩失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
if (process.ExitCode == 0)
|
||||||
}
|
{
|
||||||
}
|
MessageBox.Show("图片压缩完成", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
catch (Exception ex)
|
}
|
||||||
{
|
else
|
||||||
MessageBox.Show($"压缩过程中发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
{
|
||||||
}
|
MessageBox.Show("图片压缩失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
finally
|
}
|
||||||
{
|
}
|
||||||
btnCompress.Enabled = true;
|
catch (Exception ex)
|
||||||
progressBar.Visible = false;
|
{
|
||||||
}
|
MessageBox.Show($"压缩过程中发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
}
|
finally
|
||||||
}
|
{
|
||||||
|
btnCompress.Enabled = true;
|
||||||
|
progressBar.Visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
51
MainForm.cs
51
MainForm.cs
@@ -1,3 +1,9 @@
|
|||||||
|
// _ _
|
||||||
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
#nullable enable
|
#nullable enable
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
@@ -566,45 +572,22 @@ namespace AppStore
|
|||||||
passwordGeneratorCard.UpdateDisplay();
|
passwordGeneratorCard.UpdateDisplay();
|
||||||
flowPanel.Controls.Add(passwordGeneratorCard);
|
flowPanel.Controls.Add(passwordGeneratorCard);
|
||||||
|
|
||||||
// 端口检测工具卡片
|
// 自启动管理工具卡片
|
||||||
var portCheckerCard = new ToolCard();
|
var selfStartingManagerCard = new SelfStartingManagerToolCard();
|
||||||
portCheckerCard.ToolName = "端口检测";
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "system_info.png");
|
string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "Self_starting_management.png");
|
||||||
if (File.Exists(iconPath))
|
if (File.Exists(iconPath))
|
||||||
{
|
{
|
||||||
portCheckerCard.ToolIcon = Image.FromFile(iconPath);
|
selfStartingManagerCard.ToolIcon = Image.FromFile(iconPath);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
portCheckerCard.ToolIcon = SystemIcons.Shield.ToBitmap();
|
|
||||||
}
|
}
|
||||||
|
selfStartingManagerCard.UpdateDisplay();
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
portCheckerCard.ToolIcon = SystemIcons.Shield.ToBitmap();
|
Logger.LogError("加载自启动管理工具图标失败", ex);
|
||||||
}
|
}
|
||||||
portCheckerCard.ToolCardClicked += (s, e) => {
|
flowPanel.Controls.Add(selfStartingManagerCard);
|
||||||
try {
|
|
||||||
string toolPath = Path.Combine(Application.StartupPath, "resource", "NetWorkManager", "NetWorkManager.exe");
|
|
||||||
string absolutePath = Path.GetFullPath(toolPath);
|
|
||||||
if (File.Exists(absolutePath)) {
|
|
||||||
Process.Start(new ProcessStartInfo {
|
|
||||||
FileName = absolutePath,
|
|
||||||
WorkingDirectory = Path.GetDirectoryName(absolutePath)
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
MessageBox.Show($"端口检测工具未找到,请确保已正确安装。路径: {absolutePath}", "错误",
|
|
||||||
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
MessageBox.Show($"启动端口检测工具失败: {ex.Message}", "错误",
|
|
||||||
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
portCheckerCard.UpdateDisplay();
|
|
||||||
flowPanel.Controls.Add(portCheckerCard);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -755,7 +738,7 @@ namespace AppStore
|
|||||||
|
|
||||||
flowPanel.Controls.Add(CreateAppCard(
|
flowPanel.Controls.Add(CreateAppCard(
|
||||||
"XDM",
|
"XDM",
|
||||||
"https://hub.gitmirror.com/https://github.com/subhra74/xdm/releases/download/7.2.11/xdm-setup.msi",
|
"https://ghproxy.net/https://github.com/subhra74/xdm/releases/download/7.2.11/xdm-setup.msi",
|
||||||
"img/png/XDM.png"));
|
"img/png/XDM.png"));
|
||||||
|
|
||||||
flowPanel.Controls.Add(CreateAppCard(
|
flowPanel.Controls.Add(CreateAppCard(
|
||||||
@@ -820,7 +803,7 @@ namespace AppStore
|
|||||||
|
|
||||||
flowPanel.Controls.Add(CreateAppCard(
|
flowPanel.Controls.Add(CreateAppCard(
|
||||||
"Msys2",
|
"Msys2",
|
||||||
"https://hub.gitmirror.com/https://github.com/msys2/msys2-installer/releases/download/2025-02-21/msys2-x86_64-20250221.exe",
|
"https://ghproxy.net/https://github.com/msys2/msys2-installer/releases/download/2025-02-21/msys2-x86_64-20250221.exe",
|
||||||
"img/png/MSYS2.png"));
|
"img/png/MSYS2.png"));
|
||||||
|
|
||||||
flowPanel.Controls.Add(CreateAppCard(
|
flowPanel.Controls.Add(CreateAppCard(
|
||||||
@@ -920,7 +903,7 @@ namespace AppStore
|
|||||||
|
|
||||||
flowPanel.Controls.Add(CreateAppCard(
|
flowPanel.Controls.Add(CreateAppCard(
|
||||||
"frp",
|
"frp",
|
||||||
"https://hub.gitmirror.com/https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_windows_amd64.zip",
|
"https://ghproxy.net/https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_windows_amd64.zip",
|
||||||
""));
|
""));
|
||||||
|
|
||||||
flowPanel.Controls.Add(CreateAppCard(
|
flowPanel.Controls.Add(CreateAppCard(
|
||||||
|
|||||||
38
Program.cs
38
Program.cs
@@ -1,16 +1,22 @@
|
|||||||
using System;
|
// _ _
|
||||||
using System.Windows.Forms;
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
namespace AppStore
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
{
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
static class Program
|
// |_| |_|
|
||||||
{
|
using System;
|
||||||
[STAThread]
|
using System.Windows.Forms;
|
||||||
static void Main()
|
|
||||||
{
|
namespace AppStore
|
||||||
Application.EnableVisualStyles();
|
{
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
static class Program
|
||||||
Application.Run(new MainForm());
|
{
|
||||||
}
|
[STAThread]
|
||||||
}
|
static void Main()
|
||||||
}
|
{
|
||||||
|
Application.EnableVisualStyles();
|
||||||
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
Application.Run(new MainForm());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
141
SettingsForm.cs
141
SettingsForm.cs
@@ -1,8 +1,15 @@
|
|||||||
|
// _ _
|
||||||
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace AppStore
|
namespace AppStore
|
||||||
{
|
{
|
||||||
@@ -49,7 +56,43 @@ namespace AppStore
|
|||||||
btnCleanLogs.Click += (s, e) => CleanLogs();
|
btnCleanLogs.Click += (s, e) => CleanLogs();
|
||||||
this.Controls.Add(btnCleanLogs);
|
this.Controls.Add(btnCleanLogs);
|
||||||
|
|
||||||
|
// 下载路径设置
|
||||||
|
Label lblDownloadPath = new Label();
|
||||||
|
lblDownloadPath.Text = "下载路径:";
|
||||||
|
lblDownloadPath.AutoSize = true;
|
||||||
|
lblDownloadPath.Location = new Point((this.Width - 300) / 2, 170);
|
||||||
|
lblDownloadPath.Font = new Font("Microsoft YaHei", 10);
|
||||||
|
lblDownloadPath.Anchor = AnchorStyles.Top;
|
||||||
|
this.Controls.Add(lblDownloadPath);
|
||||||
|
|
||||||
|
TextBox txtDownloadPath = new TextBox();
|
||||||
|
txtDownloadPath.Size = new Size(300, 30);
|
||||||
|
txtDownloadPath.Location = new Point((this.Width - 300) / 2, 200);
|
||||||
|
txtDownloadPath.Font = new Font("Microsoft YaHei", 10);
|
||||||
|
txtDownloadPath.Anchor = AnchorStyles.Top;
|
||||||
|
txtDownloadPath.ReadOnly = true;
|
||||||
|
this.Controls.Add(txtDownloadPath);
|
||||||
|
|
||||||
|
Button btnBrowse = new Button();
|
||||||
|
btnBrowse.Text = "浏览...";
|
||||||
|
btnBrowse.Size = new Size(80, 30);
|
||||||
|
btnBrowse.Location = new Point(txtDownloadPath.Right + 10, 200);
|
||||||
|
btnBrowse.Font = new Font("Microsoft YaHei", 10);
|
||||||
|
btnBrowse.Anchor = AnchorStyles.Top;
|
||||||
|
btnBrowse.Click += (s, e) => BrowseDownloadPath(txtDownloadPath);
|
||||||
|
this.Controls.Add(btnBrowse);
|
||||||
|
|
||||||
|
Button btnSavePath = new Button();
|
||||||
|
btnSavePath.Text = "保存路径";
|
||||||
|
btnSavePath.Size = new Size(100, 30);
|
||||||
|
btnSavePath.Location = new Point((this.Width - 100) / 2, 240);
|
||||||
|
btnSavePath.Font = new Font("Microsoft YaHei", 10);
|
||||||
|
btnSavePath.Anchor = AnchorStyles.Top;
|
||||||
|
btnSavePath.Click += (s, e) => SaveDownloadPath(txtDownloadPath.Text);
|
||||||
|
this.Controls.Add(btnSavePath);
|
||||||
|
|
||||||
ThemeManager.ThemeChanged += OnThemeChanged;
|
ThemeManager.ThemeChanged += OnThemeChanged;
|
||||||
|
LoadDownloadPath(txtDownloadPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SwitchTheme(ThemeManager.ThemeMode theme)
|
private void SwitchTheme(ThemeManager.ThemeMode theme)
|
||||||
@@ -84,5 +127,103 @@ namespace AppStore
|
|||||||
MessageBox.Show($"清理日志时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show($"清理日志时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void BrowseDownloadPath(TextBox txtBox)
|
||||||
|
{
|
||||||
|
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
|
||||||
|
{
|
||||||
|
dialog.Description = "选择下载路径";
|
||||||
|
if (dialog.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
txtBox.Text = dialog.SelectedPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SaveDownloadPath(string path)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 验证路径
|
||||||
|
if (string.IsNullOrWhiteSpace(path))
|
||||||
|
{
|
||||||
|
MessageBox.Show("下载路径不能为空", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尝试创建目录(如果不存在)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(path);
|
||||||
|
|
||||||
|
// 验证目录是否可写
|
||||||
|
string testFile = Path.Combine(path, "write_test.tmp");
|
||||||
|
File.WriteAllText(testFile, "test");
|
||||||
|
File.Delete(testFile);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
MessageBox.Show($"无法访问路径: {path}\n请确保路径存在且有写入权限", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存路径
|
||||||
|
string dlPathDir = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||||
|
"zsyg", "kortapp-z", ".date", "dl_path");
|
||||||
|
|
||||||
|
if (!Directory.Exists(dlPathDir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(dlPathDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
string jsonPath = Path.Combine(dlPathDir, "download_path.json");
|
||||||
|
var jsonData = new { DownloadPath = path };
|
||||||
|
string jsonString = JsonSerializer.Serialize(jsonData);
|
||||||
|
|
||||||
|
File.WriteAllText(jsonPath, jsonString);
|
||||||
|
|
||||||
|
MessageBox.Show($"下载路径已保存到:\n{path}", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError("保存下载路径时出错", ex);
|
||||||
|
MessageBox.Show($"保存下载路径时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadDownloadPath(TextBox txtBox)
|
||||||
|
{
|
||||||
|
// 默认下载路径为用户文件夹下的Downloads
|
||||||
|
string defaultPath = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||||
|
"Downloads");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string jsonPath = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||||
|
"zsyg", "kortapp-z", ".date", "dl_path", "download_path.json");
|
||||||
|
|
||||||
|
if (File.Exists(jsonPath))
|
||||||
|
{
|
||||||
|
string jsonString = File.ReadAllText(jsonPath);
|
||||||
|
var jsonData = JsonSerializer.Deserialize<JsonElement>(jsonString);
|
||||||
|
string customPath = jsonData.GetProperty("DownloadPath").GetString();
|
||||||
|
|
||||||
|
// 如果自定义路径有效则显示,否则显示默认路径
|
||||||
|
txtBox.Text = !string.IsNullOrWhiteSpace(customPath) ? customPath : defaultPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
txtBox.Text = defaultPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError("加载下载路径时出错", ex);
|
||||||
|
txtBox.Text = defaultPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// _ _
|
||||||
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
@@ -42,6 +48,8 @@ namespace AppStore
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var dir = Path.GetDirectoryName(ThemeConfigPath);
|
var dir = Path.GetDirectoryName(ThemeConfigPath);
|
||||||
|
if (dir == null) return;
|
||||||
|
|
||||||
if (!Directory.Exists(dir))
|
if (!Directory.Exists(dir))
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(dir);
|
Directory.CreateDirectory(dir);
|
||||||
|
|||||||
232
ToolCard.cs
232
ToolCard.cs
@@ -1,113 +1,119 @@
|
|||||||
using System;
|
// _ _
|
||||||
using System.Drawing;
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
using System.Windows.Forms;
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
namespace AppStore
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
{
|
// |_| |_|
|
||||||
public class ToolCard : UserControl
|
using System;
|
||||||
{
|
using System.Drawing;
|
||||||
private PictureBox iconBox = new PictureBox();
|
using System.Windows.Forms;
|
||||||
private Label nameLabel = new Label();
|
|
||||||
private Panel namePanel = new Panel();
|
namespace AppStore
|
||||||
private Color borderColor = SystemColors.ControlDark;
|
{
|
||||||
|
public class ToolCard : UserControl
|
||||||
public string ToolName { get; set; } = string.Empty;
|
{
|
||||||
public Image ToolIcon { get; set; } = SystemIcons.Shield.ToBitmap();
|
private PictureBox iconBox = new PictureBox();
|
||||||
|
private Label nameLabel = new Label();
|
||||||
// 自定义点击事件初始化为空委托
|
private Panel namePanel = new Panel();
|
||||||
public event EventHandler ToolCardClicked = delegate {};
|
private Color borderColor = SystemColors.ControlDark;
|
||||||
|
|
||||||
public ToolCard()
|
public string ToolName { get; set; } = string.Empty;
|
||||||
{
|
public Image ToolIcon { get; set; } = SystemIcons.Shield.ToBitmap();
|
||||||
// 启用双缓冲
|
|
||||||
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
|
// 自定义点击事件初始化为空委托
|
||||||
ControlStyles.ResizeRedraw, true);
|
public event EventHandler ToolCardClicked = delegate {};
|
||||||
InitializeComponent();
|
|
||||||
}
|
public ToolCard()
|
||||||
|
{
|
||||||
private void InitializeComponent()
|
// 启用双缓冲
|
||||||
{
|
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
|
||||||
this.Size = new Size(240, 220);
|
ControlStyles.ResizeRedraw, true);
|
||||||
this.BackColor = Color.White;
|
InitializeComponent();
|
||||||
this.Padding = new Padding(5);
|
}
|
||||||
this.BorderStyle = BorderStyle.FixedSingle;
|
|
||||||
|
private void InitializeComponent()
|
||||||
// 工具图标
|
{
|
||||||
iconBox = new PictureBox();
|
this.Size = new Size(240, 220);
|
||||||
iconBox.Size = new Size(80, 80);
|
this.BackColor = Color.White;
|
||||||
iconBox.Location = new Point((Width - 80) / 2, 15);
|
this.Padding = new Padding(5);
|
||||||
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
|
this.BorderStyle = BorderStyle.FixedSingle;
|
||||||
this.Controls.Add(iconBox);
|
|
||||||
|
// 工具图标
|
||||||
// 工具名称 - 使用Panel包裹Label实现边框颜色
|
iconBox = new PictureBox();
|
||||||
namePanel = new Panel();
|
iconBox.Size = new Size(80, 80);
|
||||||
namePanel.Size = new Size(Width - 20, 30);
|
iconBox.Location = new Point((Width - 80) / 2, 15);
|
||||||
namePanel.Location = new Point(10, 100);
|
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||||
namePanel.Paint += (sender, e) => {
|
this.Controls.Add(iconBox);
|
||||||
ControlPaint.DrawBorder(e.Graphics, namePanel.ClientRectangle,
|
|
||||||
borderColor, ButtonBorderStyle.Solid);
|
// 工具名称 - 使用Panel包裹Label实现边框颜色
|
||||||
};
|
namePanel = new Panel();
|
||||||
|
namePanel.Size = new Size(Width - 20, 30);
|
||||||
nameLabel = new Label();
|
namePanel.Location = new Point(10, 100);
|
||||||
nameLabel.Dock = DockStyle.Fill;
|
namePanel.Paint += (sender, e) => {
|
||||||
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
|
ControlPaint.DrawBorder(e.Graphics, namePanel.ClientRectangle,
|
||||||
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
|
borderColor, ButtonBorderStyle.Solid);
|
||||||
namePanel.Controls.Add(nameLabel);
|
};
|
||||||
|
|
||||||
// 初始主题设置
|
nameLabel = new Label();
|
||||||
UpdateLabelTheme();
|
nameLabel.Dock = DockStyle.Fill;
|
||||||
|
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
|
||||||
// 订阅主题变化事件
|
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
ThemeManager.ThemeChanged += (theme) => UpdateLabelTheme();
|
namePanel.Controls.Add(nameLabel);
|
||||||
|
|
||||||
this.Controls.Add(namePanel);
|
// 初始主题设置
|
||||||
|
UpdateLabelTheme();
|
||||||
// 打开按钮
|
|
||||||
var openButton = new Button();
|
// 订阅主题变化事件
|
||||||
openButton.Text = "打开工具";
|
ThemeManager.ThemeChanged += (theme) => UpdateLabelTheme();
|
||||||
openButton.Size = new Size(100, 30);
|
|
||||||
openButton.Location = new Point((Width - 100) / 2, 140);
|
this.Controls.Add(namePanel);
|
||||||
openButton.BackColor = Color.FromArgb(0, 120, 215);
|
|
||||||
openButton.ForeColor = Color.White;
|
// 打开按钮
|
||||||
openButton.FlatStyle = FlatStyle.Flat;
|
var openButton = new Button();
|
||||||
openButton.FlatAppearance.BorderSize = 0;
|
openButton.Text = "打开工具";
|
||||||
openButton.Cursor = Cursors.Hand;
|
openButton.Size = new Size(100, 30);
|
||||||
// 按钮点击直接触发ToolCardClicked事件
|
openButton.Location = new Point((Width - 100) / 2, 140);
|
||||||
openButton.Click += (s, e) => {
|
openButton.BackColor = Color.FromArgb(0, 120, 215);
|
||||||
ToolCardClicked?.Invoke(this, e);
|
openButton.ForeColor = Color.White;
|
||||||
};
|
openButton.FlatStyle = FlatStyle.Flat;
|
||||||
this.Controls.Add(openButton);
|
openButton.FlatAppearance.BorderSize = 0;
|
||||||
|
openButton.Cursor = Cursors.Hand;
|
||||||
// 设置按钮悬停效果
|
// 按钮点击直接触发ToolCardClicked事件
|
||||||
openButton.BackColor = Color.FromArgb(0, 120, 215);
|
openButton.Click += (s, e) => {
|
||||||
openButton.FlatAppearance.MouseOverBackColor = Color.FromArgb(0, 100, 180);
|
ToolCardClicked?.Invoke(this, e);
|
||||||
openButton.FlatAppearance.MouseDownBackColor = Color.FromArgb(0, 80, 160);
|
};
|
||||||
}
|
this.Controls.Add(openButton);
|
||||||
|
|
||||||
private void UpdateLabelTheme()
|
// 设置按钮悬停效果
|
||||||
{
|
openButton.BackColor = Color.FromArgb(0, 120, 215);
|
||||||
if (ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Dark)
|
openButton.FlatAppearance.MouseOverBackColor = Color.FromArgb(0, 100, 180);
|
||||||
{
|
openButton.FlatAppearance.MouseDownBackColor = Color.FromArgb(0, 80, 160);
|
||||||
nameLabel.BackColor = Color.Black;
|
}
|
||||||
nameLabel.ForeColor = Color.White;
|
|
||||||
namePanel.BackColor = Color.Black;
|
private void UpdateLabelTheme()
|
||||||
borderColor = Color.White;
|
{
|
||||||
}
|
if (ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Dark)
|
||||||
else
|
{
|
||||||
{
|
nameLabel.BackColor = Color.Black;
|
||||||
nameLabel.BackColor = Color.White;
|
nameLabel.ForeColor = Color.White;
|
||||||
nameLabel.ForeColor = Color.Black;
|
namePanel.BackColor = Color.Black;
|
||||||
namePanel.BackColor = Color.White;
|
borderColor = Color.White;
|
||||||
borderColor = SystemColors.ControlDark;
|
}
|
||||||
}
|
else
|
||||||
namePanel.Invalidate(); // 触发重绘
|
{
|
||||||
}
|
nameLabel.BackColor = Color.White;
|
||||||
|
nameLabel.ForeColor = Color.Black;
|
||||||
public void UpdateDisplay()
|
namePanel.BackColor = Color.White;
|
||||||
{
|
borderColor = SystemColors.ControlDark;
|
||||||
nameLabel.Text = ToolName;
|
}
|
||||||
iconBox.Image = ToolIcon;
|
namePanel.Invalidate(); // 触发重绘
|
||||||
UpdateLabelTheme();
|
}
|
||||||
}
|
|
||||||
}
|
public void UpdateDisplay()
|
||||||
}
|
{
|
||||||
|
nameLabel.Text = ToolName;
|
||||||
|
iconBox.Image = ToolIcon;
|
||||||
|
UpdateLabelTheme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,64 +1,70 @@
|
|||||||
#include <windows.h>
|
// _ _
|
||||||
#include <vector>
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
#include <fstream>
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
#include <cmath>
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
#include <d2d1.h>
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
// 高性能边框路径生成
|
#include <windows.h>
|
||||||
void GenerateBorderPath(int width, int height, int radius, const char* outputPath) {
|
#include <vector>
|
||||||
std::ofstream out(outputPath);
|
#include <fstream>
|
||||||
const float pi = 3.1415926f;
|
#include <cmath>
|
||||||
const int segments = 24; // 高分段数确保平滑
|
#include <d2d1.h>
|
||||||
|
|
||||||
std::vector<POINTFLOAT> points;
|
// 高性能边框路径生成
|
||||||
|
void GenerateBorderPath(int width, int height, int radius, const char* outputPath) {
|
||||||
// 优化后的圆角路径生成
|
std::ofstream out(outputPath);
|
||||||
auto addArc = [&](float startAngle, float endAngle, float cx, float cy) {
|
const float pi = 3.1415926f;
|
||||||
for (int i = 0; i <= segments; ++i) {
|
const int segments = 24; // 高分段数确保平滑
|
||||||
float angle = startAngle + (endAngle - startAngle) * i / segments;
|
|
||||||
points.push_back({
|
std::vector<POINTFLOAT> points;
|
||||||
cx + radius * cosf(angle),
|
|
||||||
cy + radius * sinf(angle)
|
// 优化后的圆角路径生成
|
||||||
});
|
auto addArc = [&](float startAngle, float endAngle, float cx, float cy) {
|
||||||
}
|
for (int i = 0; i <= segments; ++i) {
|
||||||
};
|
float angle = startAngle + (endAngle - startAngle) * i / segments;
|
||||||
|
points.push_back({
|
||||||
// 左上角
|
cx + radius * cosf(angle),
|
||||||
addArc(pi, 3*pi/2, radius, radius);
|
cy + radius * sinf(angle)
|
||||||
|
});
|
||||||
// 右上角
|
}
|
||||||
addArc(3*pi/2, 2*pi, width - radius, radius);
|
};
|
||||||
|
|
||||||
// 右下角
|
// 左上角
|
||||||
addArc(0, pi/2, width - radius, height - radius);
|
addArc(pi, 3*pi/2, radius, radius);
|
||||||
|
|
||||||
// 左下角
|
// 右上角
|
||||||
addArc(pi/2, pi, radius, height - radius);
|
addArc(3*pi/2, 2*pi, width - radius, radius);
|
||||||
|
|
||||||
// 闭合路径
|
// 右下角
|
||||||
points.push_back(points[0]);
|
addArc(0, pi/2, width - radius, height - radius);
|
||||||
|
|
||||||
// 写入优化格式
|
// 左下角
|
||||||
if (out.is_open()) {
|
addArc(pi/2, pi, radius, height - radius);
|
||||||
for (const auto& p : points) {
|
|
||||||
out << p.x << "," << p.y << "\n";
|
// 闭合路径
|
||||||
}
|
points.push_back(points[0]);
|
||||||
}
|
|
||||||
}
|
// 写入优化格式
|
||||||
|
if (out.is_open()) {
|
||||||
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
|
for (const auto& p : points) {
|
||||||
int argc;
|
out << p.x << "," << p.y << "\n";
|
||||||
LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
|
}
|
||||||
|
}
|
||||||
if (argc != 5) return 1;
|
}
|
||||||
|
|
||||||
int width = _wtoi(argv[1]);
|
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
|
||||||
int height = _wtoi(argv[2]);
|
int argc;
|
||||||
int radius = _wtoi(argv[3]);
|
LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
|
||||||
|
|
||||||
char outputPath[MAX_PATH];
|
if (argc != 5) return 1;
|
||||||
wcstombs(outputPath, argv[4], MAX_PATH);
|
|
||||||
|
int width = _wtoi(argv[1]);
|
||||||
GenerateBorderPath(width, height, radius, outputPath);
|
int height = _wtoi(argv[2]);
|
||||||
return 0;
|
int radius = _wtoi(argv[3]);
|
||||||
}
|
|
||||||
|
char outputPath[MAX_PATH];
|
||||||
|
wcstombs(outputPath, argv[4], MAX_PATH);
|
||||||
|
|
||||||
|
GenerateBorderPath(width, height, radius, outputPath);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,90 +1,96 @@
|
|||||||
#include <iostream>
|
// _ _
|
||||||
#include <fstream>
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
#include <vector>
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
#include <cmath>
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
#include <windows.h>
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
using namespace std;
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
struct Point {
|
#include <vector>
|
||||||
float x;
|
#include <cmath>
|
||||||
float y;
|
#include <windows.h>
|
||||||
};
|
|
||||||
|
using namespace std;
|
||||||
void WritePathToFile(const vector<Point>& path, const string& filename) {
|
|
||||||
ofstream outFile(filename);
|
struct Point {
|
||||||
if (!outFile) {
|
float x;
|
||||||
cerr << "无法打开输出文件: " << filename << endl;
|
float y;
|
||||||
return;
|
};
|
||||||
}
|
|
||||||
|
void WritePathToFile(const vector<Point>& path, const string& filename) {
|
||||||
for (const auto& point : path) {
|
ofstream outFile(filename);
|
||||||
outFile << point.x << "," << point.y << "\n";
|
if (!outFile) {
|
||||||
}
|
cerr << "无法打开输出文件: " << filename << endl;
|
||||||
outFile.close();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<Point> CalculateRoundedRectPath(int width, int height, int radius) {
|
for (const auto& point : path) {
|
||||||
vector<Point> pathPoints;
|
outFile << point.x << "," << point.y << "\n";
|
||||||
|
}
|
||||||
const int segments = 10;
|
outFile.close();
|
||||||
const float angleStep = 3.1415926f / (2 * segments);
|
}
|
||||||
|
|
||||||
// 左上角
|
vector<Point> CalculateRoundedRectPath(int width, int height, int radius) {
|
||||||
for (int i = 0; i <= segments; i++) {
|
vector<Point> pathPoints;
|
||||||
float angle = 3.1415926f + i * angleStep;
|
|
||||||
pathPoints.push_back({
|
const int segments = 10;
|
||||||
radius + radius * cosf(angle),
|
const float angleStep = 3.1415926f / (2 * segments);
|
||||||
radius + radius * sinf(angle)
|
|
||||||
});
|
// 左上角
|
||||||
}
|
for (int i = 0; i <= segments; i++) {
|
||||||
|
float angle = 3.1415926f + i * angleStep;
|
||||||
// 右上角
|
pathPoints.push_back({
|
||||||
for (int i = 0; i <= segments; i++) {
|
radius + radius * cosf(angle),
|
||||||
float angle = 3 * 3.1415926f / 2 + i * angleStep;
|
radius + radius * sinf(angle)
|
||||||
pathPoints.push_back({
|
});
|
||||||
width - radius + radius * cosf(angle),
|
}
|
||||||
radius + radius * sinf(angle)
|
|
||||||
});
|
// 右上角
|
||||||
}
|
for (int i = 0; i <= segments; i++) {
|
||||||
|
float angle = 3 * 3.1415926f / 2 + i * angleStep;
|
||||||
// 右下角
|
pathPoints.push_back({
|
||||||
for (int i = 0; i <= segments; i++) {
|
width - radius + radius * cosf(angle),
|
||||||
float angle = 0 + i * angleStep;
|
radius + radius * sinf(angle)
|
||||||
pathPoints.push_back({
|
});
|
||||||
width - radius + radius * cosf(angle),
|
}
|
||||||
height - radius + radius * sinf(angle)
|
|
||||||
});
|
// 右下角
|
||||||
}
|
for (int i = 0; i <= segments; i++) {
|
||||||
|
float angle = 0 + i * angleStep;
|
||||||
// 左下角
|
pathPoints.push_back({
|
||||||
for (int i = 0; i <= segments; i++) {
|
width - radius + radius * cosf(angle),
|
||||||
float angle = 3.1415926f / 2 + i * angleStep;
|
height - radius + radius * sinf(angle)
|
||||||
pathPoints.push_back({
|
});
|
||||||
radius + radius * cosf(angle),
|
}
|
||||||
height - radius + radius * sinf(angle)
|
|
||||||
});
|
// 左下角
|
||||||
}
|
for (int i = 0; i <= segments; i++) {
|
||||||
|
float angle = 3.1415926f / 2 + i * angleStep;
|
||||||
// 闭合路径
|
pathPoints.push_back({
|
||||||
pathPoints.push_back(pathPoints[0]);
|
radius + radius * cosf(angle),
|
||||||
|
height - radius + radius * sinf(angle)
|
||||||
return pathPoints;
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
// 闭合路径
|
||||||
if (argc != 5) {
|
pathPoints.push_back(pathPoints[0]);
|
||||||
cout << "用法: card_calculator [宽度] [高度] [圆角半径] [输出文件]" << endl;
|
|
||||||
return 1;
|
return pathPoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
int width = stoi(argv[1]);
|
int main(int argc, char* argv[]) {
|
||||||
int height = stoi(argv[2]);
|
if (argc != 5) {
|
||||||
int radius = stoi(argv[3]);
|
cout << "用法: card_calculator [宽度] [高度] [圆角半径] [输出文件]" << endl;
|
||||||
string outputFile = argv[4];
|
return 1;
|
||||||
|
}
|
||||||
auto path = CalculateRoundedRectPath(width, height, radius);
|
|
||||||
WritePathToFile(path, outputFile);
|
int width = stoi(argv[1]);
|
||||||
|
int height = stoi(argv[2]);
|
||||||
return 0;
|
int radius = stoi(argv[3]);
|
||||||
}
|
string outputFile = argv[4];
|
||||||
|
|
||||||
|
auto path = CalculateRoundedRectPath(width, height, radius);
|
||||||
|
WritePathToFile(path, outputFile);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
BIN
img/resource/png/Self_starting_management.png
Normal file
BIN
img/resource/png/Self_starting_management.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 608 KiB |
BIN
img/resource/png/password_generator.png
Normal file
BIN
img/resource/png/password_generator.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 410 KiB |
@@ -2,10 +2,10 @@
|
|||||||
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
|
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
|
||||||
|
|
||||||
#define MyAppName "kortapp-z"
|
#define MyAppName "kortapp-z"
|
||||||
#define MyAppVersion "1.1.2"
|
#define MyAppVersion "1.1.4"
|
||||||
#define MyAppPublisher "zsyg"
|
#define MyAppPublisher "zsyg"
|
||||||
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
|
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
|
||||||
#define MyAppExeName "kortapp.exe"
|
#define MyAppExeName "kortapp-z.exe"
|
||||||
#define MyAppAssocName MyAppName + ""
|
#define MyAppAssocName MyAppName + ""
|
||||||
#define MyAppAssocExt ".exe"
|
#define MyAppAssocExt ".exe"
|
||||||
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
|
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
|
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
|
||||||
|
|
||||||
#define MyAppName "kortapp-z"
|
#define MyAppName "kortapp-z"
|
||||||
#define MyAppVersion "1.1.2"
|
#define MyAppVersion "1.1.4"
|
||||||
#define MyAppPublisher "zsyg"
|
#define MyAppPublisher "zsyg"
|
||||||
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
|
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
|
||||||
#define MyAppExeName "kortapp.exe"
|
#define MyAppExeName "kortapp-z.exe"
|
||||||
#define MyAppAssocName MyAppName + ""
|
#define MyAppAssocName MyAppName + ""
|
||||||
#define MyAppAssocExt ".exe"
|
#define MyAppAssocExt ".exe"
|
||||||
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
|
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
|
||||||
|
|||||||
136
log_cleaner.cpp
136
log_cleaner.cpp
@@ -1,65 +1,71 @@
|
|||||||
#include <iostream>
|
// _ _
|
||||||
#include <filesystem>
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
#include <chrono>
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
namespace fs = std::filesystem;
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
|
// |_| |_|
|
||||||
int main() {
|
#include <iostream>
|
||||||
try {
|
#include <filesystem>
|
||||||
auto start = std::chrono::high_resolution_clock::now();
|
#include <chrono>
|
||||||
|
|
||||||
// 定义日志目录路径
|
namespace fs = std::filesystem;
|
||||||
fs::path logDir;
|
|
||||||
|
int main() {
|
||||||
#ifdef _WIN32
|
try {
|
||||||
// Windows系统获取AppData路径
|
auto start = std::chrono::high_resolution_clock::now();
|
||||||
char* appData = nullptr;
|
|
||||||
size_t len = 0;
|
// 定义日志目录路径
|
||||||
if (_dupenv_s(&appData, &len, "APPDATA") == 0 && appData != nullptr) {
|
fs::path logDir;
|
||||||
logDir = fs::path(appData) / "zsyg" / "kortapp-z" / ".logs";
|
|
||||||
free(appData);
|
#ifdef _WIN32
|
||||||
} else {
|
// Windows系统获取AppData路径
|
||||||
std::cerr << "无法获取APPDATA环境变量" << std::endl;
|
char* appData = nullptr;
|
||||||
return 1;
|
size_t len = 0;
|
||||||
}
|
if (_dupenv_s(&appData, &len, "APPDATA") == 0 && appData != nullptr) {
|
||||||
#else
|
logDir = fs::path(appData) / "zsyg" / "kortapp-z" / ".logs";
|
||||||
// 非Windows系统使用默认路径
|
free(appData);
|
||||||
logDir = fs::path(getenv("HOME")) / ".zsyg" / "kortapp-z" / ".logs";
|
} else {
|
||||||
#endif
|
std::cerr << "无法获取APPDATA环境变量" << std::endl;
|
||||||
size_t deletedCount = 0;
|
return 1;
|
||||||
size_t errorCount = 0;
|
}
|
||||||
|
#else
|
||||||
// 检查目录是否存在
|
// 非Windows系统使用默认路径
|
||||||
if (fs::exists(logDir) && fs::is_directory(logDir)) {
|
logDir = fs::path(getenv("HOME")) / ".zsyg" / "kortapp-z" / ".logs";
|
||||||
// 遍历并删除所有日志文件
|
#endif
|
||||||
for (const auto& entry : fs::directory_iterator(logDir)) {
|
size_t deletedCount = 0;
|
||||||
try {
|
size_t errorCount = 0;
|
||||||
if (fs::is_regular_file(entry)) {
|
|
||||||
fs::remove(entry);
|
// 检查目录是否存在
|
||||||
deletedCount++;
|
if (fs::exists(logDir) && fs::is_directory(logDir)) {
|
||||||
}
|
// 遍历并删除所有日志文件
|
||||||
} catch (const std::exception& e) {
|
for (const auto& entry : fs::directory_iterator(logDir)) {
|
||||||
std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
|
try {
|
||||||
errorCount++;
|
if (fs::is_regular_file(entry)) {
|
||||||
}
|
fs::remove(entry);
|
||||||
}
|
deletedCount++;
|
||||||
} else {
|
}
|
||||||
std::cout << "日志目录不存在,无需清理" << std::endl;
|
} catch (const std::exception& e) {
|
||||||
return 0;
|
std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
|
||||||
}
|
errorCount++;
|
||||||
|
}
|
||||||
auto end = std::chrono::high_resolution_clock::now();
|
}
|
||||||
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
|
} else {
|
||||||
|
std::cout << "日志目录不存在,无需清理" << std::endl;
|
||||||
std::cout << "日志清理完成: " << std::endl;
|
return 0;
|
||||||
std::cout << "删除文件数: " << deletedCount << std::endl;
|
}
|
||||||
std::cout << "错误数: " << errorCount << std::endl;
|
|
||||||
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
|
auto end = std::chrono::high_resolution_clock::now();
|
||||||
|
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
|
||||||
} catch (const std::exception& e) {
|
|
||||||
std::cerr << "发生错误: " << e.what() << std::endl;
|
std::cout << "日志清理完成: " << std::endl;
|
||||||
return 1;
|
std::cout << "删除文件数: " << deletedCount << std::endl;
|
||||||
}
|
std::cout << "错误数: " << errorCount << std::endl;
|
||||||
|
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
|
||||||
return 0;
|
|
||||||
}
|
} catch (const std::exception& e) {
|
||||||
|
std::cerr << "发生错误: " << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
142
logger.cs
142
logger.cs
@@ -1,63 +1,79 @@
|
|||||||
using System;
|
// _ _
|
||||||
using System.IO;
|
//| | _____ _ __| |_ __ _ _ __ _ __ ____
|
||||||
using System.Text;
|
//| |/ / _ \| '__| __/ _` | '_ \| '_ \ ____|_ /
|
||||||
|
//| | (_) | | | || (_| | |_) | |_) |_____/ /
|
||||||
namespace AppStore
|
//|_|\_\___/|_| \__\__,_| .__/| .__/ /___|
|
||||||
{
|
// |_| |_|
|
||||||
public static class Logger
|
using System;
|
||||||
{
|
using System.IO;
|
||||||
private static readonly string LogsDirectory = Path.Combine(
|
using System.Text;
|
||||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
|
||||||
"zsyg", "kortapp-z", ".logs");
|
namespace AppStore
|
||||||
private static readonly object LockObject = new object();
|
{
|
||||||
|
public static class Logger
|
||||||
static Logger()
|
{
|
||||||
{
|
private static readonly string LogsDirectory = Path.Combine(
|
||||||
try
|
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||||
{
|
"zsyg", "kortapp-z", ".logs");
|
||||||
// 确保logs目录存在
|
private static readonly object LockObject = new object();
|
||||||
if (!Directory.Exists(LogsDirectory))
|
|
||||||
{
|
static Logger()
|
||||||
Directory.CreateDirectory(LogsDirectory);
|
{
|
||||||
}
|
try
|
||||||
}
|
{
|
||||||
catch (Exception ex)
|
// 确保logs目录存在
|
||||||
{
|
if (!Directory.Exists(LogsDirectory))
|
||||||
Console.WriteLine($"无法创建日志目录: {LogsDirectory}, 错误: {ex.Message}");
|
{
|
||||||
throw;
|
Directory.CreateDirectory(LogsDirectory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
public static void Log(string message)
|
{
|
||||||
{
|
Console.WriteLine($"无法创建日志目录: {LogsDirectory}, 错误: {ex.Message}");
|
||||||
lock (LockObject)
|
throw;
|
||||||
{
|
}
|
||||||
try
|
}
|
||||||
{
|
|
||||||
string fileName = $"{DateTime.Now:yyyyMMddHHmmss}.log";
|
public static void Log(string message)
|
||||||
string filePath = Path.Combine(LogsDirectory, fileName);
|
{
|
||||||
|
lock (LockObject)
|
||||||
using (StreamWriter writer = new StreamWriter(filePath, true, Encoding.UTF8))
|
{
|
||||||
{
|
try
|
||||||
writer.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}");
|
{
|
||||||
}
|
string fileName = $"{DateTime.Now:yyyyMMddHHmmss}.log";
|
||||||
}
|
string filePath = Path.Combine(LogsDirectory, fileName);
|
||||||
catch (Exception ex)
|
|
||||||
{
|
using (StreamWriter writer = new StreamWriter(filePath, true, Encoding.UTF8))
|
||||||
// 日志记录失败时输出到控制台
|
{
|
||||||
Console.WriteLine($"日志记录失败: {ex.Message}");
|
writer.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
catch (Exception ex)
|
||||||
|
{
|
||||||
public static void LogError(string message, Exception? ex = null)
|
// 日志记录失败时输出到控制台
|
||||||
{
|
Console.WriteLine($"日志记录失败: {ex.Message}");
|
||||||
string errorMessage = $"ERROR: {message}";
|
}
|
||||||
if (ex != null)
|
}
|
||||||
{
|
}
|
||||||
errorMessage += $"\nException: {ex}\nStackTrace: {ex.StackTrace}";
|
|
||||||
}
|
public static void LogError(string message, Exception? ex = null)
|
||||||
Log(errorMessage);
|
{
|
||||||
}
|
string errorMessage = $"ERROR: {message}";
|
||||||
}
|
if (ex != null)
|
||||||
}
|
{
|
||||||
|
errorMessage += $"\nException: {ex}\nStackTrace: {ex.StackTrace}";
|
||||||
|
}
|
||||||
|
Log(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void LogWarning(string message, Exception? ex = null)
|
||||||
|
{
|
||||||
|
string warningMessage = $"WARNING: {message}";
|
||||||
|
if (ex != null)
|
||||||
|
{
|
||||||
|
warningMessage += $"\nException: {ex}\nStackTrace: {ex.StackTrace}";
|
||||||
|
}
|
||||||
|
Log(warningMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#ifndef ABOUT_DIALOG_H
|
#ifndef ABOUT_DIALOG_H
|
||||||
#define ABOUT_DIALOG_H
|
#define ABOUT_DIALOG_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
void show_about_dialog(HWND hParent);
|
void show_about_dialog(HWND hParent);
|
||||||
|
|
||||||
#endif // ABOUT_DIALOG_H
|
#endif // ABOUT_DIALOG_H
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
#ifndef CONFIG_H
|
#ifndef CONFIG_H
|
||||||
#define CONFIG_H
|
#define CONFIG_H
|
||||||
|
|
||||||
#define APP_NAME "系统信息查看器"
|
#define APP_NAME "系统信息查看器"
|
||||||
#define APP_VERSION "1.0"
|
#define APP_VERSION "1.0"
|
||||||
#define MAX_DISKS 26
|
#define MAX_DISKS 26
|
||||||
#define MAX_ADAPTERS 10
|
#define MAX_ADAPTERS 10
|
||||||
#define UPDATE_INTERVAL 5000 // 5秒
|
#define UPDATE_INTERVAL 5000 // 5秒
|
||||||
|
|
||||||
#endif // CONFIG_H
|
#endif // CONFIG_H
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
#ifndef DISK_INFO_H
|
#ifndef DISK_INFO_H
|
||||||
#define DISK_INFO_H
|
#define DISK_INFO_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char driveLetter;
|
char driveLetter;
|
||||||
DWORD64 totalBytes;
|
DWORD64 totalBytes;
|
||||||
DWORD64 freeBytes;
|
DWORD64 freeBytes;
|
||||||
char fileSystem[32];
|
char fileSystem[32];
|
||||||
} DiskInfo;
|
} DiskInfo;
|
||||||
|
|
||||||
void get_disk_info(DiskInfo* disks, int* count);
|
void get_disk_info(DiskInfo* disks, int* count);
|
||||||
|
|
||||||
#endif // DISK_INFO_H
|
#endif // DISK_INFO_H
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
#ifndef LOGGING_H
|
#ifndef LOGGING_H
|
||||||
#define LOGGING_H
|
#define LOGGING_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
LOG_DEBUG,
|
LOG_DEBUG,
|
||||||
LOG_INFO,
|
LOG_INFO,
|
||||||
LOG_WARNING,
|
LOG_WARNING,
|
||||||
LOG_ERROR
|
LOG_ERROR
|
||||||
} LogLevel;
|
} LogLevel;
|
||||||
|
|
||||||
void log_message(LogLevel level, const char* format, ...);
|
void log_message(LogLevel level, const char* format, ...);
|
||||||
|
|
||||||
#endif // LOGGING_H
|
#endif // LOGGING_H
|
||||||
|
|||||||
@@ -5,5 +5,7 @@
|
|||||||
#include "system_info.h"
|
#include "system_info.h"
|
||||||
|
|
||||||
void update_main_window(HWND hWnd, SystemInfo* sysInfo);
|
void update_main_window(HWND hWnd, SystemInfo* sysInfo);
|
||||||
|
void toggle_fullscreen(HWND hWnd);
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
#endif // MAIN_WINDOW_H
|
#endif // MAIN_WINDOW_H
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
#ifndef NETWORK_INFO_H
|
#ifndef NETWORK_INFO_H
|
||||||
#define NETWORK_INFO_H
|
#define NETWORK_INFO_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <iphlpapi.h>
|
#include <iphlpapi.h>
|
||||||
|
|
||||||
// 确保GetAdaptersInfo函数声明
|
// 确保GetAdaptersInfo函数声明
|
||||||
#ifndef _IPHLPAPI_
|
#ifndef _IPHLPAPI_
|
||||||
#define _IPHLPAPI_
|
#define _IPHLPAPI_
|
||||||
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen);
|
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char adapterName[MAX_ADAPTER_NAME_LENGTH + 4];
|
char adapterName[MAX_ADAPTER_NAME_LENGTH + 4];
|
||||||
char description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
|
char description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
|
||||||
char ipAddress[16];
|
char ipAddress[16];
|
||||||
char macAddress[18];
|
char macAddress[18];
|
||||||
ULONG speed; // in Mbps
|
ULONG speed; // in Mbps
|
||||||
} NetworkAdapterInfo;
|
} NetworkAdapterInfo;
|
||||||
|
|
||||||
void get_network_adapters(NetworkAdapterInfo* adapters, int* count);
|
void get_network_adapters(NetworkAdapterInfo* adapters, int* count);
|
||||||
|
|
||||||
#endif // NETWORK_INFO_H
|
#endif // NETWORK_INFO_H
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
#ifndef PERFORMANCE_INFO_H
|
#ifndef PERFORMANCE_INFO_H
|
||||||
#define PERFORMANCE_INFO_H
|
#define PERFORMANCE_INFO_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <pdh.h>
|
#include <pdh.h>
|
||||||
|
|
||||||
// 确保PDH函数声明
|
// 确保PDH函数声明
|
||||||
#ifndef _PDH_H_
|
#ifndef _PDH_H_
|
||||||
#define _PDH_H_
|
#define _PDH_H_
|
||||||
PDH_STATUS PdhOpenQueryA(LPCSTR szDataSource, DWORD_PTR dwUserData, PDH_HQUERY* phQuery);
|
PDH_STATUS PdhOpenQueryA(LPCSTR szDataSource, DWORD_PTR dwUserData, PDH_HQUERY* phQuery);
|
||||||
PDH_STATUS PdhAddCounterA(PDH_HQUERY hQuery, LPCSTR szFullCounterPath, DWORD_PTR dwUserData, PDH_HCOUNTER* phCounter);
|
PDH_STATUS PdhAddCounterA(PDH_HQUERY hQuery, LPCSTR szFullCounterPath, DWORD_PTR dwUserData, PDH_HCOUNTER* phCounter);
|
||||||
PDH_STATUS PdhCollectQueryData(PDH_HQUERY hQuery);
|
PDH_STATUS PdhCollectQueryData(PDH_HQUERY hQuery);
|
||||||
PDH_STATUS PdhGetFormattedCounterValue(PDH_HCOUNTER hCounter, DWORD dwFormat, LPDWORD lpdwType, PPDH_FMT_COUNTERVALUE pValue);
|
PDH_STATUS PdhGetFormattedCounterValue(PDH_HCOUNTER hCounter, DWORD dwFormat, LPDWORD lpdwType, PPDH_FMT_COUNTERVALUE pValue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DWORD cpuUsage; // CPU使用率百分比
|
DWORD cpuUsage; // CPU使用率百分比
|
||||||
DWORD memoryUsage; // 内存使用率百分比
|
DWORD memoryUsage; // 内存使用率百分比
|
||||||
DWORD processesCount; // 进程数量
|
DWORD processesCount; // 进程数量
|
||||||
DWORD threadsCount; // 线程数量
|
DWORD threadsCount; // 线程数量
|
||||||
DWORD handlesCount; // 句柄数量
|
DWORD handlesCount; // 句柄数量
|
||||||
} PerformanceInfo;
|
} PerformanceInfo;
|
||||||
|
|
||||||
void get_performance_info(PerformanceInfo* perfInfo);
|
void get_performance_info(PerformanceInfo* perfInfo);
|
||||||
|
|
||||||
#endif // PERFORMANCE_INFO_H
|
#endif // PERFORMANCE_INFO_H
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
#ifndef RESOURCE_H
|
#ifndef RESOURCE_H
|
||||||
#define RESOURCE_H
|
#define RESOURCE_H
|
||||||
|
|
||||||
#define IDI_MAIN_ICON 101
|
#define IDI_MAIN_ICON 101
|
||||||
#define IDR_MAIN_MENU 102
|
#define IDR_MAIN_MENU 102
|
||||||
|
|
||||||
#define IDM_EXIT 1001
|
#define IDM_EXIT 1001
|
||||||
#define IDM_ABOUT 1002
|
#define IDM_ABOUT 1002
|
||||||
#define IDM_SHOW_INFO 1003
|
#define IDM_SHOW_INFO 1003
|
||||||
|
|
||||||
#endif // RESOURCE_H
|
#endif // RESOURCE_H
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
#ifndef SYSTEM_INFO_H
|
#ifndef SYSTEM_INFO_H
|
||||||
#define SYSTEM_INFO_H
|
#define SYSTEM_INFO_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char cpuName[256];
|
char cpuName[256];
|
||||||
DWORD cpuCores;
|
DWORD cpuCores;
|
||||||
DWORD cpuThreads;
|
DWORD cpuThreads;
|
||||||
MEMORYSTATUSEX memoryStatus;
|
MEMORYSTATUSEX memoryStatus;
|
||||||
SYSTEM_INFO systemInfo;
|
SYSTEM_INFO systemInfo;
|
||||||
OSVERSIONINFOEX osVersion;
|
OSVERSIONINFOEX osVersion;
|
||||||
} SystemInfo;
|
} SystemInfo;
|
||||||
|
|
||||||
// 初始化系统信息
|
// 初始化系统信息
|
||||||
void init_system_info(SystemInfo* sysInfo);
|
void init_system_info(SystemInfo* sysInfo);
|
||||||
|
|
||||||
// 创建主窗口
|
// 创建主窗口
|
||||||
int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage);
|
int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage);
|
||||||
|
|
||||||
#endif // SYSTEM_INFO_H
|
#endif // SYSTEM_INFO_H
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
#ifndef SYSTEM_TRAY_H
|
#ifndef SYSTEM_TRAY_H
|
||||||
#define SYSTEM_TRAY_H
|
#define SYSTEM_TRAY_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#define WM_TRAYICON (WM_USER + 1)
|
#define WM_TRAYICON (WM_USER + 1)
|
||||||
#define ID_TRAYICON 100
|
#define ID_TRAYICON 100
|
||||||
|
|
||||||
void create_tray_icon(HWND hWnd, HICON hIcon);
|
void create_tray_icon(HWND hWnd, HICON hIcon);
|
||||||
void update_tray_icon(HWND hWnd, HICON hIcon, LPCTSTR tooltip);
|
void update_tray_icon(HWND hWnd, HICON hIcon, LPCTSTR tooltip);
|
||||||
void remove_tray_icon(HWND hWnd);
|
void remove_tray_icon(HWND hWnd);
|
||||||
|
|
||||||
#endif // SYSTEM_TRAY_H
|
#endif // SYSTEM_TRAY_H
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#ifndef UTILS_H
|
#ifndef UTILS_H
|
||||||
#define UTILS_H
|
#define UTILS_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
// 安全释放内存
|
// 安全释放内存
|
||||||
#define SAFE_FREE(ptr) if (ptr) { free(ptr); ptr = NULL; }
|
#define SAFE_FREE(ptr) if (ptr) { free(ptr); ptr = NULL; }
|
||||||
|
|
||||||
// 宽字符转多字节字符串
|
// 宽字符转多字节字符串
|
||||||
char* wchar_to_mb(const wchar_t* wstr);
|
char* wchar_to_mb(const wchar_t* wstr);
|
||||||
|
|
||||||
// 多字节字符串转宽字符
|
// 多字节字符串转宽字符
|
||||||
wchar_t* mb_to_wchar(const char* str);
|
wchar_t* mb_to_wchar(const char* str);
|
||||||
|
|
||||||
// 获取当前时间字符串
|
// 获取当前时间字符串
|
||||||
char* get_current_time_string();
|
char* get_current_time_string();
|
||||||
|
|
||||||
#endif // UTILS_H
|
#endif // UTILS_H
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
#ifndef WINDOW_UTILS_H
|
#ifndef WINDOW_UTILS_H
|
||||||
#define WINDOW_UTILS_H
|
#define WINDOW_UTILS_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "system_info.h"
|
#include "system_info.h"
|
||||||
|
|
||||||
// 窗口过程函数
|
// 窗口过程函数
|
||||||
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
// 创建主窗口
|
// 创建主窗口
|
||||||
int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage);
|
int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage);
|
||||||
|
|
||||||
// 注册窗口类
|
// 注册窗口类
|
||||||
BOOL register_window_class(HINSTANCE hInstance);
|
BOOL register_window_class(HINSTANCE hInstance);
|
||||||
|
|
||||||
#endif // WINDOW_UTILS_H
|
#endif // WINDOW_UTILS_H
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#include "about_dialog.h"
|
#include "about_dialog.h"
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
void show_about_dialog(HWND hParent) {
|
void show_about_dialog(HWND hParent) {
|
||||||
MessageBox(hParent,
|
MessageBox(hParent,
|
||||||
_T("系统信息查看器\n版本 1.0\n\n一个简单的Windows系统信息工具"),
|
_T("系统信息查看器\n版本 1.0\n\n一个简单的Windows系统信息工具"),
|
||||||
_T("关于"),
|
_T("关于"),
|
||||||
MB_OK | MB_ICONINFORMATION);
|
MB_OK | MB_ICONINFORMATION);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,40 @@
|
|||||||
#include "disk_info.h"
|
#include "disk_info.h"
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
void get_disk_info(DiskInfo* disks, int* count) {
|
void get_disk_info(DiskInfo* disks, int* count) {
|
||||||
DWORD drives = GetLogicalDrives();
|
DWORD drives = GetLogicalDrives();
|
||||||
*count = 0;
|
*count = 0;
|
||||||
|
|
||||||
for (char drive = 'A'; drive <= 'Z'; drive++) {
|
for (char drive = 'A'; drive <= 'Z'; drive++) {
|
||||||
if (drives & (1 << (drive - 'A'))) {
|
if (drives & (1 << (drive - 'A'))) {
|
||||||
TCHAR rootPath[4] = {drive, ':', '\\', '\0'};
|
TCHAR rootPath[4] = {drive, ':', '\\', '\0'};
|
||||||
TCHAR fileSystem[32];
|
TCHAR fileSystem[32];
|
||||||
DWORD serialNumber, maxComponentLength, fileSystemFlags;
|
DWORD serialNumber, maxComponentLength, fileSystemFlags;
|
||||||
|
|
||||||
if (GetVolumeInformation(
|
if (GetVolumeInformation(
|
||||||
rootPath,
|
rootPath,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
&serialNumber,
|
&serialNumber,
|
||||||
&maxComponentLength,
|
&maxComponentLength,
|
||||||
&fileSystemFlags,
|
&fileSystemFlags,
|
||||||
fileSystem, sizeof(fileSystem))) {
|
fileSystem, sizeof(fileSystem))) {
|
||||||
|
|
||||||
DiskInfo* disk = &disks[(*count)++];
|
DiskInfo* disk = &disks[(*count)++];
|
||||||
disk->driveLetter = drive;
|
disk->driveLetter = drive;
|
||||||
|
|
||||||
ULARGE_INTEGER freeBytes, totalBytes, totalFreeBytes;
|
ULARGE_INTEGER freeBytes, totalBytes, totalFreeBytes;
|
||||||
if (GetDiskFreeSpaceEx(
|
if (GetDiskFreeSpaceEx(
|
||||||
rootPath,
|
rootPath,
|
||||||
&freeBytes,
|
&freeBytes,
|
||||||
&totalBytes,
|
&totalBytes,
|
||||||
&totalFreeBytes)) {
|
&totalFreeBytes)) {
|
||||||
disk->totalBytes = totalBytes.QuadPart;
|
disk->totalBytes = totalBytes.QuadPart;
|
||||||
disk->freeBytes = freeBytes.QuadPart;
|
disk->freeBytes = freeBytes.QuadPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(disk->fileSystem, fileSystem, sizeof(disk->fileSystem) - 1);
|
strncpy(disk->fileSystem, fileSystem, sizeof(disk->fileSystem) - 1);
|
||||||
disk->fileSystem[sizeof(disk->fileSystem) - 1] = '\0';
|
disk->fileSystem[sizeof(disk->fileSystem) - 1] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,41 @@
|
|||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
static const char* level_strings[] = {
|
static const char* level_strings[] = {
|
||||||
"DEBUG",
|
"DEBUG",
|
||||||
"INFO",
|
"INFO",
|
||||||
"WARNING",
|
"WARNING",
|
||||||
"ERROR"
|
"ERROR"
|
||||||
};
|
};
|
||||||
|
|
||||||
void log_message(LogLevel level, const char* format, ...) {
|
void log_message(LogLevel level, const char* format, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
|
|
||||||
// 获取当前时间
|
// 获取当前时间
|
||||||
time_t now;
|
time_t now;
|
||||||
time(&now);
|
time(&now);
|
||||||
struct tm* timeinfo = localtime(&now);
|
struct tm* timeinfo = localtime(&now);
|
||||||
char time_str[20];
|
char time_str[20];
|
||||||
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", timeinfo);
|
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", timeinfo);
|
||||||
|
|
||||||
// 格式化日志消息
|
// 格式化日志消息
|
||||||
char message[1024];
|
char message[1024];
|
||||||
vsnprintf(message, sizeof(message), format, args);
|
vsnprintf(message, sizeof(message), format, args);
|
||||||
|
|
||||||
// 输出到调试控制台
|
// 输出到调试控制台
|
||||||
char output[2048];
|
char output[2048];
|
||||||
snprintf(output, sizeof(output), "[%s] [%s] %s\n", time_str, level_strings[level], message);
|
snprintf(output, sizeof(output), "[%s] [%s] %s\n", time_str, level_strings[level], message);
|
||||||
OutputDebugStringA(output);
|
OutputDebugStringA(output);
|
||||||
|
|
||||||
// 输出到文件
|
// 输出到文件
|
||||||
FILE* log_file = fopen("system_info.log", "a");
|
FILE* log_file = fopen("system_info.log", "a");
|
||||||
if (log_file) {
|
if (log_file) {
|
||||||
fprintf(log_file, "%s", output);
|
fprintf(log_file, "%s", output);
|
||||||
fclose(log_file);
|
fclose(log_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include "system_info.h"
|
#include "system_info.h"
|
||||||
#include "window_utils.h"
|
#include "window_utils.h"
|
||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
|
|
||||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
||||||
UNREFERENCED_PARAMETER(hPrevInstance);
|
UNREFERENCED_PARAMETER(hPrevInstance);
|
||||||
UNREFERENCED_PARAMETER(lpCmdLine);
|
UNREFERENCED_PARAMETER(lpCmdLine);
|
||||||
UNREFERENCED_PARAMETER(nCmdShow);
|
UNREFERENCED_PARAMETER(nCmdShow);
|
||||||
|
|
||||||
// 设置控制台编码为UTF-8
|
// 设置控制台编码为UTF-8
|
||||||
SetConsoleOutputCP(65001);
|
SetConsoleOutputCP(65001);
|
||||||
setlocale(LC_ALL, "chs");
|
setlocale(LC_ALL, "chs");
|
||||||
|
|
||||||
// 初始化日志系统
|
// 初始化日志系统
|
||||||
log_message(LOG_INFO, "应用程序启动");
|
log_message(LOG_INFO, "应用程序启动");
|
||||||
|
|
||||||
// 初始化系统信息收集
|
// 初始化系统信息收集
|
||||||
SystemInfo sysInfo;
|
SystemInfo sysInfo;
|
||||||
init_system_info(&sysInfo);
|
init_system_info(&sysInfo);
|
||||||
|
|
||||||
// 创建并显示主窗口,传递UTF-8编码标识
|
// 创建并显示主窗口,传递UTF-8编码标识
|
||||||
int result = create_main_window(hInstance, &sysInfo, 65001);
|
int result = create_main_window(hInstance, &sysInfo, 65001);
|
||||||
|
|
||||||
log_message(LOG_INFO, "应用程序退出");
|
log_message(LOG_INFO, "应用程序退出");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +1,101 @@
|
|||||||
#include "main_window.h"
|
#include "main_window.h"
|
||||||
|
#include "disk_info.h"
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
#include <commctrl.h>
|
#include <commctrl.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define IDC_INFO_TEXT 1002
|
#define IDC_INFO_TEXT 1002
|
||||||
|
#define IDM_FULLSCREEN 1003
|
||||||
|
|
||||||
|
// 全屏状态标志
|
||||||
|
static BOOL g_isFullScreen = FALSE;
|
||||||
|
// 保存原始窗口位置和大小
|
||||||
|
static RECT g_windowRect;
|
||||||
|
|
||||||
|
void toggle_fullscreen(HWND hWnd) {
|
||||||
|
g_isFullScreen = !g_isFullScreen;
|
||||||
|
|
||||||
|
if (g_isFullScreen) {
|
||||||
|
// 保存当前窗口位置和大小
|
||||||
|
GetWindowRect(hWnd, &g_windowRect);
|
||||||
|
|
||||||
|
// 设置全屏样式
|
||||||
|
SetWindowLong(hWnd, GWL_STYLE,
|
||||||
|
WS_OVERLAPPEDWINDOW & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU));
|
||||||
|
|
||||||
|
// 设置全屏尺寸
|
||||||
|
MONITORINFO mi = {0};
|
||||||
|
mi.cbSize = sizeof(mi);
|
||||||
|
GetMonitorInfo(MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST), &mi);
|
||||||
|
SetWindowPos(hWnd, HWND_TOP,
|
||||||
|
mi.rcMonitor.left,
|
||||||
|
mi.rcMonitor.top,
|
||||||
|
mi.rcMonitor.right - mi.rcMonitor.left,
|
||||||
|
mi.rcMonitor.bottom - mi.rcMonitor.top,
|
||||||
|
SWP_FRAMECHANGED);
|
||||||
|
} else {
|
||||||
|
// 恢复窗口样式
|
||||||
|
SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);
|
||||||
|
|
||||||
|
// 恢复原始大小和位置
|
||||||
|
SetWindowPos(hWnd, NULL,
|
||||||
|
g_windowRect.left,
|
||||||
|
g_windowRect.top,
|
||||||
|
g_windowRect.right - g_windowRect.left,
|
||||||
|
g_windowRect.bottom - g_windowRect.top,
|
||||||
|
SWP_FRAMECHANGED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void update_main_window(HWND hWnd, SystemInfo* sysInfo) {
|
void update_main_window(HWND hWnd, SystemInfo* sysInfo) {
|
||||||
|
// 根据全屏状态计算窗口尺寸
|
||||||
|
int windowWidth, windowHeight;
|
||||||
|
if (g_isFullScreen) {
|
||||||
|
MONITORINFO mi = {0};
|
||||||
|
mi.cbSize = sizeof(mi);
|
||||||
|
GetMonitorInfo(MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST), &mi);
|
||||||
|
windowWidth = mi.rcMonitor.right - mi.rcMonitor.left;
|
||||||
|
windowHeight = mi.rcMonitor.bottom - mi.rcMonitor.top;
|
||||||
|
} else {
|
||||||
|
// 普通模式下使用70%屏幕尺寸
|
||||||
|
windowWidth = (int)(GetSystemMetrics(SM_CXSCREEN) * 0.7);
|
||||||
|
windowHeight = (int)(GetSystemMetrics(SM_CYSCREEN) * 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
HWND hInfoText = GetDlgItem(hWnd, IDC_INFO_TEXT);
|
HWND hInfoText = GetDlgItem(hWnd, IDC_INFO_TEXT);
|
||||||
if (!hInfoText) {
|
if (hInfoText) {
|
||||||
|
// 更新现有控件大小和位置
|
||||||
|
SetWindowPos(hInfoText, NULL,
|
||||||
|
30, 50, windowWidth - 60, windowHeight - 80,
|
||||||
|
SWP_NOZORDER);
|
||||||
|
} else {
|
||||||
// 创建信息显示控件
|
// 创建信息显示控件
|
||||||
hInfoText = CreateWindow(
|
hInfoText = CreateWindow(
|
||||||
_T("EDIT"),
|
_T("EDIT"),
|
||||||
_T(""),
|
_T(""),
|
||||||
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_READONLY,
|
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_READONLY | WS_BORDER,
|
||||||
20, 50, 800, 550,
|
30, 50, windowWidth - 60, windowHeight - 80,
|
||||||
hWnd,
|
hWnd,
|
||||||
(HMENU)IDC_INFO_TEXT,
|
(HMENU)IDC_INFO_TEXT,
|
||||||
(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
|
(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SendMessage(hInfoText, WM_SETFONT,
|
// 计算动态字体大小
|
||||||
(WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
|
int fontSize = max(16, windowHeight / 30);
|
||||||
|
|
||||||
|
// 创建支持中文的字体
|
||||||
|
HFONT hFont = CreateFont(
|
||||||
|
fontSize, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
|
||||||
|
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
||||||
|
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
|
||||||
|
_T("Microsoft YaHei"));
|
||||||
|
|
||||||
|
SendMessage(hInfoText, WM_SETFONT, (WPARAM)hFont, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用宽字符处理所有文本
|
// 使用宽字符处理所有文本
|
||||||
wchar_t infoText[2048];
|
wchar_t infoText[4096]; // 增大缓冲区以适应磁盘信息
|
||||||
wchar_t cpuNameW[256];
|
wchar_t cpuNameW[256];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, sysInfo->cpuName, -1, cpuNameW, 256);
|
MultiByteToWideChar(CP_UTF8, 0, sysInfo->cpuName, -1, cpuNameW, 256);
|
||||||
|
|
||||||
@@ -51,5 +121,26 @@ void update_main_window(HWND hWnd, SystemInfo* sysInfo) {
|
|||||||
sysInfo->osVersion.dwMinorVersion,
|
sysInfo->osVersion.dwMinorVersion,
|
||||||
sysInfo->osVersion.dwBuildNumber);
|
sysInfo->osVersion.dwBuildNumber);
|
||||||
|
|
||||||
|
// 添加磁盘信息
|
||||||
|
DiskInfo disks[26];
|
||||||
|
int diskCount;
|
||||||
|
get_disk_info(disks, &diskCount);
|
||||||
|
|
||||||
|
wchar_t diskInfoText[2048];
|
||||||
|
swprintf(diskInfoText, 2048,
|
||||||
|
L"\r\n[磁盘信息]\r\n"
|
||||||
|
L"磁盘数量: %d\r\n", diskCount);
|
||||||
|
wcscat(infoText, diskInfoText);
|
||||||
|
|
||||||
|
for (int i = 0; i < diskCount; i++) {
|
||||||
|
swprintf(diskInfoText, 2048,
|
||||||
|
L"%c: 文件系统: %ls, 总容量: %.2f GB, 剩余容量: %.2f GB\r\n",
|
||||||
|
disks[i].driveLetter,
|
||||||
|
disks[i].fileSystem[0] ? L"NTFS" : L"",
|
||||||
|
(float)disks[i].totalBytes / (1024 * 1024 * 1024),
|
||||||
|
(float)disks[i].freeBytes / (1024 * 1024 * 1024));
|
||||||
|
wcscat(infoText, diskInfoText);
|
||||||
|
}
|
||||||
|
|
||||||
SetWindowTextW(hInfoText, infoText);
|
SetWindowTextW(hInfoText, infoText);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,85 +1,85 @@
|
|||||||
#include "network_info.h"
|
#include "network_info.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
// 定义函数指针类型
|
// 定义函数指针类型
|
||||||
typedef DWORD (WINAPI *GetAdaptersInfoFunc)(_Out_ PIP_ADAPTER_INFO, _Inout_ PULONG);
|
typedef DWORD (WINAPI *GetAdaptersInfoFunc)(_Out_ PIP_ADAPTER_INFO, _Inout_ PULONG);
|
||||||
|
|
||||||
// 安全的函数指针转换函数
|
// 安全的函数指针转换函数
|
||||||
static FARPROC safe_get_proc_address(HMODULE module, const char* name) {
|
static FARPROC safe_get_proc_address(HMODULE module, const char* name) {
|
||||||
FARPROC proc = GetProcAddress(module, name);
|
FARPROC proc = GetProcAddress(module, name);
|
||||||
if (!proc) {
|
if (!proc) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 辅助宏用于安全的函数指针转换
|
// 辅助宏用于安全的函数指针转换
|
||||||
#define GET_PROC_ADDRESS(module, name, type) \
|
#define GET_PROC_ADDRESS(module, name, type) \
|
||||||
((type)(void*)safe_get_proc_address(module, name))
|
((type)(void*)safe_get_proc_address(module, name))
|
||||||
|
|
||||||
void get_network_adapters(NetworkAdapterInfo* adapters, int* count) {
|
void get_network_adapters(NetworkAdapterInfo* adapters, int* count) {
|
||||||
HMODULE hModule = LoadLibrary("iphlpapi.dll");
|
HMODULE hModule = LoadLibrary("iphlpapi.dll");
|
||||||
if (!hModule) return;
|
if (!hModule) return;
|
||||||
|
|
||||||
// 使用类型安全的函数指针转换
|
// 使用类型安全的函数指针转换
|
||||||
GetAdaptersInfoFunc pGetAdaptersInfo = GET_PROC_ADDRESS(hModule, "GetAdaptersInfo", GetAdaptersInfoFunc);
|
GetAdaptersInfoFunc pGetAdaptersInfo = GET_PROC_ADDRESS(hModule, "GetAdaptersInfo", GetAdaptersInfoFunc);
|
||||||
if (!pGetAdaptersInfo) {
|
if (!pGetAdaptersInfo) {
|
||||||
FreeLibrary(hModule);
|
FreeLibrary(hModule);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PIP_ADAPTER_INFO pAdapterInfo = NULL;
|
PIP_ADAPTER_INFO pAdapterInfo = NULL;
|
||||||
PIP_ADAPTER_INFO pAdapter = NULL;
|
PIP_ADAPTER_INFO pAdapter = NULL;
|
||||||
DWORD dwRetVal = 0;
|
DWORD dwRetVal = 0;
|
||||||
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
|
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
|
||||||
|
|
||||||
*count = 0;
|
*count = 0;
|
||||||
|
|
||||||
pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
|
pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
|
||||||
if (pAdapterInfo == NULL) {
|
if (pAdapterInfo == NULL) {
|
||||||
FreeLibrary(hModule);
|
FreeLibrary(hModule);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第一次调用获取缓冲区大小
|
// 第一次调用获取缓冲区大小
|
||||||
if (pGetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
|
if (pGetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
|
||||||
free(pAdapterInfo);
|
free(pAdapterInfo);
|
||||||
pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
|
pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
|
||||||
if (pAdapterInfo == NULL) {
|
if (pAdapterInfo == NULL) {
|
||||||
FreeLibrary(hModule);
|
FreeLibrary(hModule);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((dwRetVal = pGetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
|
if ((dwRetVal = pGetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
|
||||||
pAdapter = pAdapterInfo;
|
pAdapter = pAdapterInfo;
|
||||||
while (pAdapter && *count < MAX_ADAPTERS) {
|
while (pAdapter && *count < MAX_ADAPTERS) {
|
||||||
NetworkAdapterInfo* adapter = &adapters[(*count)++];
|
NetworkAdapterInfo* adapter = &adapters[(*count)++];
|
||||||
|
|
||||||
// 复制适配器名称和描述
|
// 复制适配器名称和描述
|
||||||
strncpy(adapter->adapterName, pAdapter->AdapterName, MAX_ADAPTER_NAME_LENGTH);
|
strncpy(adapter->adapterName, pAdapter->AdapterName, MAX_ADAPTER_NAME_LENGTH);
|
||||||
strncpy(adapter->description, pAdapter->Description, MAX_ADAPTER_DESCRIPTION_LENGTH);
|
strncpy(adapter->description, pAdapter->Description, MAX_ADAPTER_DESCRIPTION_LENGTH);
|
||||||
|
|
||||||
// 格式化IP地址
|
// 格式化IP地址
|
||||||
if (pAdapter->IpAddressList.IpAddress.String[0] != '\0') {
|
if (pAdapter->IpAddressList.IpAddress.String[0] != '\0') {
|
||||||
strncpy(adapter->ipAddress, pAdapter->IpAddressList.IpAddress.String, 15);
|
strncpy(adapter->ipAddress, pAdapter->IpAddressList.IpAddress.String, 15);
|
||||||
adapter->ipAddress[15] = '\0';
|
adapter->ipAddress[15] = '\0';
|
||||||
} else {
|
} else {
|
||||||
strcpy(adapter->ipAddress, "N/A");
|
strcpy(adapter->ipAddress, "N/A");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 格式化MAC地址
|
// 格式化MAC地址
|
||||||
sprintf(adapter->macAddress, "%02X:%02X:%02X:%02X:%02X:%02X",
|
sprintf(adapter->macAddress, "%02X:%02X:%02X:%02X:%02X:%02X",
|
||||||
pAdapter->Address[0], pAdapter->Address[1],
|
pAdapter->Address[0], pAdapter->Address[1],
|
||||||
pAdapter->Address[2], pAdapter->Address[3],
|
pAdapter->Address[2], pAdapter->Address[3],
|
||||||
pAdapter->Address[4], pAdapter->Address[5]);
|
pAdapter->Address[4], pAdapter->Address[5]);
|
||||||
|
|
||||||
adapter->speed = pAdapter->DhcpEnabled ? 100 : 10; // 简化处理,实际项目中应使用更精确的方法
|
adapter->speed = pAdapter->DhcpEnabled ? 100 : 10; // 简化处理,实际项目中应使用更精确的方法
|
||||||
|
|
||||||
pAdapter = pAdapter->Next;
|
pAdapter = pAdapter->Next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(pAdapterInfo);
|
free(pAdapterInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,137 +1,137 @@
|
|||||||
#include "performance_info.h"
|
#include "performance_info.h"
|
||||||
#include <pdh.h>
|
#include <pdh.h>
|
||||||
#include <psapi.h>
|
#include <psapi.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "performance_info.h"
|
#include "performance_info.h"
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <psapi.h>
|
#include <psapi.h>
|
||||||
|
|
||||||
// 定义函数指针类型
|
// 定义函数指针类型
|
||||||
typedef PDH_STATUS (WINAPI *PdhOpenQueryFunc)(_In_opt_ LPCSTR, _In_ DWORD_PTR, _Out_ PDH_HQUERY*);
|
typedef PDH_STATUS (WINAPI *PdhOpenQueryFunc)(_In_opt_ LPCSTR, _In_ DWORD_PTR, _Out_ PDH_HQUERY*);
|
||||||
typedef PDH_STATUS (WINAPI *PdhAddCounterFunc)(_In_ PDH_HQUERY, _In_ LPCSTR, _In_ DWORD_PTR, _Out_ PDH_HCOUNTER*);
|
typedef PDH_STATUS (WINAPI *PdhAddCounterFunc)(_In_ PDH_HQUERY, _In_ LPCSTR, _In_ DWORD_PTR, _Out_ PDH_HCOUNTER*);
|
||||||
typedef PDH_STATUS (WINAPI *PdhCollectQueryDataFunc)(_In_ PDH_HQUERY);
|
typedef PDH_STATUS (WINAPI *PdhCollectQueryDataFunc)(_In_ PDH_HQUERY);
|
||||||
typedef PDH_STATUS (WINAPI *PdhGetFormattedCounterValueFunc)(_In_ PDH_HCOUNTER, _In_ DWORD, _Out_opt_ LPDWORD, _Out_ PPDH_FMT_COUNTERVALUE);
|
typedef PDH_STATUS (WINAPI *PdhGetFormattedCounterValueFunc)(_In_ PDH_HCOUNTER, _In_ DWORD, _Out_opt_ LPDWORD, _Out_ PPDH_FMT_COUNTERVALUE);
|
||||||
|
|
||||||
// 安全的函数指针转换函数
|
// 安全的函数指针转换函数
|
||||||
static FARPROC safe_get_proc_address(HMODULE module, const char* name) {
|
static FARPROC safe_get_proc_address(HMODULE module, const char* name) {
|
||||||
FARPROC proc = GetProcAddress(module, name);
|
FARPROC proc = GetProcAddress(module, name);
|
||||||
if (!proc) {
|
if (!proc) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 辅助宏用于安全的函数指针转换
|
// 辅助宏用于安全的函数指针转换
|
||||||
#define GET_PROC_ADDRESS(module, name, type) \
|
#define GET_PROC_ADDRESS(module, name, type) \
|
||||||
((type)(void*)safe_get_proc_address(module, name))
|
((type)(void*)safe_get_proc_address(module, name))
|
||||||
|
|
||||||
static PDH_HQUERY cpuQuery;
|
static PDH_HQUERY cpuQuery;
|
||||||
static PDH_HCOUNTER cpuTotal;
|
static PDH_HCOUNTER cpuTotal;
|
||||||
static HMODULE hPdhModule = NULL;
|
static HMODULE hPdhModule = NULL;
|
||||||
static PdhOpenQueryFunc pPdhOpenQuery = NULL;
|
static PdhOpenQueryFunc pPdhOpenQuery = NULL;
|
||||||
static PdhAddCounterFunc pPdhAddCounter = NULL;
|
static PdhAddCounterFunc pPdhAddCounter = NULL;
|
||||||
static PdhCollectQueryDataFunc pPdhCollectQueryData = NULL;
|
static PdhCollectQueryDataFunc pPdhCollectQueryData = NULL;
|
||||||
static PdhGetFormattedCounterValueFunc pPdhGetFormattedCounterValue = NULL;
|
static PdhGetFormattedCounterValueFunc pPdhGetFormattedCounterValue = NULL;
|
||||||
|
|
||||||
void init_performance_counters() {
|
void init_performance_counters() {
|
||||||
hPdhModule = LoadLibrary("pdh.dll");
|
hPdhModule = LoadLibrary("pdh.dll");
|
||||||
if (!hPdhModule) {
|
if (!hPdhModule) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pPdhOpenQuery = GET_PROC_ADDRESS(hPdhModule, "PdhOpenQueryA", PdhOpenQueryFunc);
|
pPdhOpenQuery = GET_PROC_ADDRESS(hPdhModule, "PdhOpenQueryA", PdhOpenQueryFunc);
|
||||||
pPdhAddCounter = GET_PROC_ADDRESS(hPdhModule, "PdhAddCounterA", PdhAddCounterFunc);
|
pPdhAddCounter = GET_PROC_ADDRESS(hPdhModule, "PdhAddCounterA", PdhAddCounterFunc);
|
||||||
pPdhCollectQueryData = GET_PROC_ADDRESS(hPdhModule, "PdhCollectQueryData", PdhCollectQueryDataFunc);
|
pPdhCollectQueryData = GET_PROC_ADDRESS(hPdhModule, "PdhCollectQueryData", PdhCollectQueryDataFunc);
|
||||||
pPdhGetFormattedCounterValue = GET_PROC_ADDRESS(hPdhModule, "PdhGetFormattedCounterValue", PdhGetFormattedCounterValueFunc);
|
pPdhGetFormattedCounterValue = GET_PROC_ADDRESS(hPdhModule, "PdhGetFormattedCounterValue", PdhGetFormattedCounterValueFunc);
|
||||||
|
|
||||||
if (pPdhOpenQuery && pPdhAddCounter && pPdhCollectQueryData) {
|
if (pPdhOpenQuery && pPdhAddCounter && pPdhCollectQueryData) {
|
||||||
// 初始化性能计数器
|
// 初始化性能计数器
|
||||||
if (pPdhOpenQuery(NULL, 0, &cpuQuery) != ERROR_SUCCESS) {
|
if (pPdhOpenQuery(NULL, 0, &cpuQuery) != ERROR_SUCCESS) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加CPU计数器
|
// 添加CPU计数器
|
||||||
if (pPdhAddCounter(cpuQuery, "\\Processor(_Total)\\% Processor Time", 0, &cpuTotal) != ERROR_SUCCESS) {
|
if (pPdhAddCounter(cpuQuery, "\\Processor(_Total)\\% Processor Time", 0, &cpuTotal) != ERROR_SUCCESS) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第一次收集数据,用于初始化
|
// 第一次收集数据,用于初始化
|
||||||
pPdhCollectQueryData(cpuQuery);
|
pPdhCollectQueryData(cpuQuery);
|
||||||
Sleep(1000); // 等待1秒获取基准数据
|
Sleep(1000); // 等待1秒获取基准数据
|
||||||
pPdhCollectQueryData(cpuQuery);
|
pPdhCollectQueryData(cpuQuery);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_performance_info(PerformanceInfo* perfInfo) {
|
void get_performance_info(PerformanceInfo* perfInfo) {
|
||||||
static BOOL initialized = FALSE;
|
static BOOL initialized = FALSE;
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
init_performance_counters();
|
init_performance_counters();
|
||||||
initialized = TRUE;
|
initialized = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取CPU使用率
|
// 获取CPU使用率
|
||||||
if (pPdhCollectQueryData && pPdhGetFormattedCounterValue) {
|
if (pPdhCollectQueryData && pPdhGetFormattedCounterValue) {
|
||||||
// 第一次收集数据作为基准
|
// 第一次收集数据作为基准
|
||||||
pPdhCollectQueryData(cpuQuery);
|
pPdhCollectQueryData(cpuQuery);
|
||||||
Sleep(1000); // 等待1秒
|
Sleep(1000); // 等待1秒
|
||||||
pPdhCollectQueryData(cpuQuery); // 第二次收集数据
|
pPdhCollectQueryData(cpuQuery); // 第二次收集数据
|
||||||
|
|
||||||
PDH_FMT_COUNTERVALUE counterVal;
|
PDH_FMT_COUNTERVALUE counterVal;
|
||||||
if (pPdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal) == ERROR_SUCCESS) {
|
if (pPdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal) == ERROR_SUCCESS) {
|
||||||
perfInfo->cpuUsage = (DWORD)counterVal.doubleValue;
|
perfInfo->cpuUsage = (DWORD)counterVal.doubleValue;
|
||||||
} else {
|
} else {
|
||||||
perfInfo->cpuUsage = 0;
|
perfInfo->cpuUsage = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 如果PDH不可用,使用GetSystemTimes作为备用方案
|
// 如果PDH不可用,使用GetSystemTimes作为备用方案
|
||||||
FILETIME idleTime, kernelTime, userTime;
|
FILETIME idleTime, kernelTime, userTime;
|
||||||
if (GetSystemTimes(&idleTime, &kernelTime, &userTime)) {
|
if (GetSystemTimes(&idleTime, &kernelTime, &userTime)) {
|
||||||
ULONGLONG idle = ((ULONGLONG)idleTime.dwHighDateTime << 32) | idleTime.dwLowDateTime;
|
ULONGLONG idle = ((ULONGLONG)idleTime.dwHighDateTime << 32) | idleTime.dwLowDateTime;
|
||||||
ULONGLONG kernel = ((ULONGLONG)kernelTime.dwHighDateTime << 32) | kernelTime.dwLowDateTime;
|
ULONGLONG kernel = ((ULONGLONG)kernelTime.dwHighDateTime << 32) | kernelTime.dwLowDateTime;
|
||||||
ULONGLONG user = ((ULONGLONG)userTime.dwHighDateTime << 32) | userTime.dwLowDateTime;
|
ULONGLONG user = ((ULONGLONG)userTime.dwHighDateTime << 32) | userTime.dwLowDateTime;
|
||||||
|
|
||||||
static ULONGLONG prevIdle = 0, prevKernel = 0, prevUser = 0;
|
static ULONGLONG prevIdle = 0, prevKernel = 0, prevUser = 0;
|
||||||
ULONGLONG idleDiff = idle - prevIdle;
|
ULONGLONG idleDiff = idle - prevIdle;
|
||||||
ULONGLONG kernelDiff = kernel - prevKernel;
|
ULONGLONG kernelDiff = kernel - prevKernel;
|
||||||
ULONGLONG userDiff = user - prevUser;
|
ULONGLONG userDiff = user - prevUser;
|
||||||
|
|
||||||
if (prevIdle != 0 && (kernelDiff + userDiff) > 0) {
|
if (prevIdle != 0 && (kernelDiff + userDiff) > 0) {
|
||||||
perfInfo->cpuUsage = (DWORD)(100.0 - (100.0 * idleDiff) / (kernelDiff + userDiff));
|
perfInfo->cpuUsage = (DWORD)(100.0 - (100.0 * idleDiff) / (kernelDiff + userDiff));
|
||||||
} else {
|
} else {
|
||||||
perfInfo->cpuUsage = 0;
|
perfInfo->cpuUsage = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
prevIdle = idle;
|
prevIdle = idle;
|
||||||
prevKernel = kernel;
|
prevKernel = kernel;
|
||||||
prevUser = user;
|
prevUser = user;
|
||||||
} else {
|
} else {
|
||||||
perfInfo->cpuUsage = 0;
|
perfInfo->cpuUsage = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取内存使用率
|
// 获取内存使用率
|
||||||
MEMORYSTATUSEX memInfo;
|
MEMORYSTATUSEX memInfo;
|
||||||
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
|
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
|
||||||
GlobalMemoryStatusEx(&memInfo);
|
GlobalMemoryStatusEx(&memInfo);
|
||||||
// 使用GlobalMemoryStatusEx获取更精确的内存使用率
|
// 使用GlobalMemoryStatusEx获取更精确的内存使用率
|
||||||
MEMORYSTATUSEX memStatus;
|
MEMORYSTATUSEX memStatus;
|
||||||
memStatus.dwLength = sizeof(memStatus);
|
memStatus.dwLength = sizeof(memStatus);
|
||||||
GlobalMemoryStatusEx(&memStatus);
|
GlobalMemoryStatusEx(&memStatus);
|
||||||
perfInfo->memoryUsage = memStatus.dwMemoryLoad;
|
perfInfo->memoryUsage = memStatus.dwMemoryLoad;
|
||||||
|
|
||||||
// 获取进程和线程数量
|
// 获取进程和线程数量
|
||||||
PERFORMANCE_INFORMATION perfInfoStruct;
|
PERFORMANCE_INFORMATION perfInfoStruct;
|
||||||
GetPerformanceInfo(&perfInfoStruct, sizeof(perfInfoStruct));
|
GetPerformanceInfo(&perfInfoStruct, sizeof(perfInfoStruct));
|
||||||
perfInfo->processesCount = perfInfoStruct.ProcessCount;
|
perfInfo->processesCount = perfInfoStruct.ProcessCount;
|
||||||
perfInfo->threadsCount = perfInfoStruct.ThreadCount;
|
perfInfo->threadsCount = perfInfoStruct.ThreadCount;
|
||||||
perfInfo->handlesCount = perfInfoStruct.HandleCount;
|
perfInfo->handlesCount = perfInfoStruct.HandleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup_performance_counters() {
|
void cleanup_performance_counters() {
|
||||||
if (hPdhModule) {
|
if (hPdhModule) {
|
||||||
FreeLibrary(hPdhModule);
|
FreeLibrary(hPdhModule);
|
||||||
hPdhModule = NULL;
|
hPdhModule = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,26 +1,26 @@
|
|||||||
#include "system_info.h"
|
#include "system_info.h"
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
|
|
||||||
void init_system_info(SystemInfo* sysInfo) {
|
void init_system_info(SystemInfo* sysInfo) {
|
||||||
// 获取CPU信息
|
// 获取CPU信息
|
||||||
int cpuInfo[4] = {0};
|
int cpuInfo[4] = {0};
|
||||||
__cpuid(cpuInfo, 0x80000002);
|
__cpuid(cpuInfo, 0x80000002);
|
||||||
memcpy(sysInfo->cpuName, cpuInfo, sizeof(cpuInfo));
|
memcpy(sysInfo->cpuName, cpuInfo, sizeof(cpuInfo));
|
||||||
__cpuid(cpuInfo, 0x80000003);
|
__cpuid(cpuInfo, 0x80000003);
|
||||||
memcpy(sysInfo->cpuName + 16, cpuInfo, sizeof(cpuInfo));
|
memcpy(sysInfo->cpuName + 16, cpuInfo, sizeof(cpuInfo));
|
||||||
__cpuid(cpuInfo, 0x80000004);
|
__cpuid(cpuInfo, 0x80000004);
|
||||||
memcpy(sysInfo->cpuName + 32, cpuInfo, sizeof(cpuInfo));
|
memcpy(sysInfo->cpuName + 32, cpuInfo, sizeof(cpuInfo));
|
||||||
|
|
||||||
// 获取系统信息
|
// 获取系统信息
|
||||||
GetSystemInfo(&sysInfo->systemInfo);
|
GetSystemInfo(&sysInfo->systemInfo);
|
||||||
sysInfo->cpuCores = sysInfo->systemInfo.dwNumberOfProcessors;
|
sysInfo->cpuCores = sysInfo->systemInfo.dwNumberOfProcessors;
|
||||||
sysInfo->cpuThreads = sysInfo->cpuCores; // 简化处理
|
sysInfo->cpuThreads = sysInfo->cpuCores; // 简化处理
|
||||||
|
|
||||||
// 获取内存信息
|
// 获取内存信息
|
||||||
sysInfo->memoryStatus.dwLength = sizeof(sysInfo->memoryStatus);
|
sysInfo->memoryStatus.dwLength = sizeof(sysInfo->memoryStatus);
|
||||||
GlobalMemoryStatusEx(&sysInfo->memoryStatus);
|
GlobalMemoryStatusEx(&sysInfo->memoryStatus);
|
||||||
|
|
||||||
// 获取操作系统版本
|
// 获取操作系统版本
|
||||||
sysInfo->osVersion.dwOSVersionInfoSize = sizeof(sysInfo->osVersion);
|
sysInfo->osVersion.dwOSVersionInfoSize = sizeof(sysInfo->osVersion);
|
||||||
GetVersionEx((LPOSVERSIONINFO)&sysInfo->osVersion);
|
GetVersionEx((LPOSVERSIONINFO)&sysInfo->osVersion);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +1,45 @@
|
|||||||
#include "system_tray.h"
|
#include "system_tray.h"
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#include <strsafe.h>
|
#include <strsafe.h>
|
||||||
|
|
||||||
void create_tray_icon(HWND hWnd, HICON hIcon) {
|
void create_tray_icon(HWND hWnd, HICON hIcon) {
|
||||||
NOTIFYICONDATA nid = {0};
|
NOTIFYICONDATA nid = {0};
|
||||||
nid.cbSize = sizeof(NOTIFYICONDATA);
|
nid.cbSize = sizeof(NOTIFYICONDATA);
|
||||||
nid.hWnd = hWnd;
|
nid.hWnd = hWnd;
|
||||||
nid.uID = ID_TRAYICON;
|
nid.uID = ID_TRAYICON;
|
||||||
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
||||||
nid.uCallbackMessage = WM_TRAYICON;
|
nid.uCallbackMessage = WM_TRAYICON;
|
||||||
nid.hIcon = hIcon;
|
nid.hIcon = hIcon;
|
||||||
#if defined(UNICODE) || defined(_UNICODE)
|
#if defined(UNICODE) || defined(_UNICODE)
|
||||||
StringCbCopyW(nid.szTip, sizeof(nid.szTip), L"系统信息查看器");
|
StringCbCopyW(nid.szTip, sizeof(nid.szTip), L"系统信息查看器");
|
||||||
#else
|
#else
|
||||||
StringCbCopyA(nid.szTip, sizeof(nid.szTip), "系统信息查看器");
|
StringCbCopyA(nid.szTip, sizeof(nid.szTip), "系统信息查看器");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Shell_NotifyIcon(NIM_ADD, &nid);
|
Shell_NotifyIcon(NIM_ADD, &nid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_tray_icon(HWND hWnd, HICON hIcon, LPCTSTR tooltip) {
|
void update_tray_icon(HWND hWnd, HICON hIcon, LPCTSTR tooltip) {
|
||||||
NOTIFYICONDATA nid = {0};
|
NOTIFYICONDATA nid = {0};
|
||||||
nid.cbSize = sizeof(NOTIFYICONDATA);
|
nid.cbSize = sizeof(NOTIFYICONDATA);
|
||||||
nid.hWnd = hWnd;
|
nid.hWnd = hWnd;
|
||||||
nid.uID = ID_TRAYICON;
|
nid.uID = ID_TRAYICON;
|
||||||
nid.uFlags = NIF_ICON | NIF_TIP;
|
nid.uFlags = NIF_ICON | NIF_TIP;
|
||||||
nid.hIcon = hIcon;
|
nid.hIcon = hIcon;
|
||||||
#if defined(UNICODE) || defined(_UNICODE)
|
#if defined(UNICODE) || defined(_UNICODE)
|
||||||
StringCbCopyW(nid.szTip, sizeof(nid.szTip), tooltip);
|
StringCbCopyW(nid.szTip, sizeof(nid.szTip), tooltip);
|
||||||
#else
|
#else
|
||||||
StringCbCopyA(nid.szTip, sizeof(nid.szTip), tooltip);
|
StringCbCopyA(nid.szTip, sizeof(nid.szTip), tooltip);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Shell_NotifyIcon(NIM_MODIFY, &nid);
|
Shell_NotifyIcon(NIM_MODIFY, &nid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_tray_icon(HWND hWnd) {
|
void remove_tray_icon(HWND hWnd) {
|
||||||
NOTIFYICONDATA nid = {0};
|
NOTIFYICONDATA nid = {0};
|
||||||
nid.cbSize = sizeof(NOTIFYICONDATA);
|
nid.cbSize = sizeof(NOTIFYICONDATA);
|
||||||
nid.hWnd = hWnd;
|
nid.hWnd = hWnd;
|
||||||
nid.uID = ID_TRAYICON;
|
nid.uID = ID_TRAYICON;
|
||||||
|
|
||||||
Shell_NotifyIcon(NIM_DELETE, &nid);
|
Shell_NotifyIcon(NIM_DELETE, &nid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,38 +1,38 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
char* wchar_to_mb(const wchar_t* wstr) {
|
char* wchar_to_mb(const wchar_t* wstr) {
|
||||||
if (!wstr) return NULL;
|
if (!wstr) return NULL;
|
||||||
|
|
||||||
int size = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
|
int size = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
|
||||||
char* mbstr = (char*)malloc(size);
|
char* mbstr = (char*)malloc(size);
|
||||||
if (mbstr) {
|
if (mbstr) {
|
||||||
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, mbstr, size, NULL, NULL);
|
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, mbstr, size, NULL, NULL);
|
||||||
}
|
}
|
||||||
return mbstr;
|
return mbstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t* mb_to_wchar(const char* str) {
|
wchar_t* mb_to_wchar(const char* str) {
|
||||||
if (!str) return NULL;
|
if (!str) return NULL;
|
||||||
|
|
||||||
int size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
|
int size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
|
||||||
wchar_t* wstr = (wchar_t*)malloc(size * sizeof(wchar_t));
|
wchar_t* wstr = (wchar_t*)malloc(size * sizeof(wchar_t));
|
||||||
if (wstr) {
|
if (wstr) {
|
||||||
MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, size);
|
MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, size);
|
||||||
}
|
}
|
||||||
return wstr;
|
return wstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* get_current_time_string() {
|
char* get_current_time_string() {
|
||||||
time_t now;
|
time_t now;
|
||||||
time(&now);
|
time(&now);
|
||||||
struct tm* timeinfo = localtime(&now);
|
struct tm* timeinfo = localtime(&now);
|
||||||
|
|
||||||
char* time_str = (char*)malloc(20);
|
char* time_str = (char*)malloc(20);
|
||||||
if (time_str) {
|
if (time_str) {
|
||||||
strftime(time_str, 20, "%Y-%m-%d %H:%M:%S", timeinfo);
|
strftime(time_str, 20, "%Y-%m-%d %H:%M:%S", timeinfo);
|
||||||
}
|
}
|
||||||
return time_str;
|
return time_str;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ BOOL register_window_class(HINSTANCE hInstance) {
|
|||||||
wcex.hInstance = hInstance;
|
wcex.hInstance = hInstance;
|
||||||
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
|
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
|
||||||
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
wcex.hbrBackground = CreateSolidBrush(RGB(240, 240, 240));
|
||||||
wcex.lpszMenuName = NULL;
|
wcex.lpszMenuName = NULL;
|
||||||
wcex.lpszClassName = _T("SystemInfoWindowClass");
|
wcex.lpszClassName = _T("SystemInfoWindowClass");
|
||||||
wcex.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);
|
wcex.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);
|
||||||
@@ -47,10 +47,10 @@ int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage)
|
|||||||
HWND hWnd = CreateWindowW(
|
HWND hWnd = CreateWindowW(
|
||||||
L"SystemInfoWindowClass",
|
L"SystemInfoWindowClass",
|
||||||
windowTitle,
|
windowTitle,
|
||||||
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_CLIPCHILDREN,
|
WS_POPUP | WS_VISIBLE,
|
||||||
CW_USEDEFAULT, CW_USEDEFAULT,
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
450, 300,
|
800, 600,
|
||||||
NULL, NULL, hInstance, NULL);
|
NULL, NULL, hInstance, sysInfo);
|
||||||
|
|
||||||
if (!hWnd) {
|
if (!hWnd) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -75,14 +75,28 @@ int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage)
|
|||||||
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||||
switch (message) {
|
switch (message) {
|
||||||
case WM_CREATE: {
|
case WM_CREATE: {
|
||||||
|
// 安全初始化系统信息指针
|
||||||
|
if (lParam) {
|
||||||
|
g_sysInfo = (SystemInfo*)((CREATESTRUCT*)lParam)->lpCreateParams;
|
||||||
|
}
|
||||||
|
if (!g_sysInfo) {
|
||||||
|
MessageBoxW(hWnd, L"系统信息初始化失败", L"错误", MB_ICONERROR);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// 创建显示系统信息的按钮
|
// 创建显示系统信息的按钮
|
||||||
CreateWindowW(L"BUTTON", L"刷新信息",
|
CreateWindowW(L"BUTTON", L"刷新信息",
|
||||||
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
|
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | WS_BORDER,
|
||||||
10, 10, 150, 30,
|
10, 10, 150, 30,
|
||||||
hWnd, (HMENU)IDC_MAIN_BUTTON,
|
hWnd, (HMENU)IDC_MAIN_BUTTON,
|
||||||
(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
|
(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case WM_SIZE: {
|
||||||
|
// 窗口大小变化时更新布局
|
||||||
|
update_main_window(hWnd, g_sysInfo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case WM_COMMAND: {
|
case WM_COMMAND: {
|
||||||
if (LOWORD(wParam) == IDC_MAIN_BUTTON) {
|
if (LOWORD(wParam) == IDC_MAIN_BUTTON) {
|
||||||
// 刷新系统信息
|
// 刷新系统信息
|
||||||
@@ -91,6 +105,25 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case WM_KEYDOWN: {
|
||||||
|
// F11键切换全屏
|
||||||
|
if (wParam == VK_F11) {
|
||||||
|
toggle_fullscreen(hWnd);
|
||||||
|
update_main_window(hWnd, g_sysInfo);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_NCCALCSIZE:
|
||||||
|
if (wParam) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_ERASEBKGND: {
|
||||||
|
RECT rc;
|
||||||
|
GetClientRect(hWnd, &rc);
|
||||||
|
FillRect((HDC)wParam, &rc, (HBRUSH)GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
case WM_DESTROY: {
|
case WM_DESTROY: {
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
ren bin\Release\net8.0-windows\win-x86\publish\AppStore.exe kortapp.exe
|
ren bin\Release\net8.0-windows\win-x86\publish\AppStore.exe kortapp-z.exe
|
||||||
ren bin\Release\net8.0-windows\win-x64\publish\AppStore.exe kortapp.exe
|
ren bin\Release\net8.0-windows\win-x64\publish\AppStore.exe kortapp-z.exe
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,451 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<doc>
|
|
||||||
<assembly>
|
|
||||||
<name>DevExpress.Sparkline.v24.1.Core</name>
|
|
||||||
</assembly>
|
|
||||||
<members>
|
|
||||||
<member name="N:DevExpress.Sparkline">
|
|
||||||
<summary>
|
|
||||||
<para>Contains classes required for DevExpress sparklines.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.AreaSparklineView">
|
|
||||||
<summary>
|
|
||||||
<para>The Area sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.AreaSparklineView.#ctor">
|
|
||||||
<summary>
|
|
||||||
<para>Initializes a new instance of the <see cref="T:DevExpress.Sparkline.AreaSparklineView"/> class with the default settings.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.AreaSparklineView.AreaOpacity">
|
|
||||||
<summary>
|
|
||||||
<para>Specifies the opacity (0-255) of the area sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Byte"/> value from 0 (transparent) to 255 (opaque).</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.AreaSparklineView.Assign(DevExpress.Sparkline.SparklineViewBase)">
|
|
||||||
<summary>
|
|
||||||
<para>Copies all the settings from the <see cref="T:DevExpress.Sparkline.AreaSparklineView"/> object passed as the parameter.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">A <see cref="T:DevExpress.Sparkline.AreaSparklineView"/> object (which is the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> descendant) whose settings are assigned to the current object. If null (Nothing in Visual Basic), then a <see cref="T:System.ArgumentNullException"/> will be thrown.</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.AreaSparklineView.Type">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the type of the sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
<value>Always <see cref="F:DevExpress.Sparkline.SparklineViewType.Area">SparklineViewType.Area</see>.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.AreaSparklineView.Visit(DevExpress.Sparkline.ISparklineViewVisitor)">
|
|
||||||
<summary>
|
|
||||||
<para>Invokes the Visit method of the specified visitor for the current <see cref="T:DevExpress.Sparkline.AreaSparklineView"/> object.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="visitor">An object implementing the <see cref="T:DevExpress.Sparkline.ISparklineViewVisitor"/> interface.</param>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.BarSparklineView">
|
|
||||||
<summary>
|
|
||||||
<para>The Bar sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.BarSparklineView.#ctor">
|
|
||||||
<summary>
|
|
||||||
<para>Initializes a new instance of the <see cref="T:DevExpress.Sparkline.BarSparklineView"/> class with the default settings.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.BarSparklineView.Type">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the type of the sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
<value>Always <see cref="F:DevExpress.Sparkline.SparklineViewType.Bar">SparklineViewType.Bar</see>.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.BarSparklineView.Visit(DevExpress.Sparkline.ISparklineViewVisitor)">
|
|
||||||
<summary>
|
|
||||||
<para>Invokes the Visit method of the specified visitor for the current <see cref="T:DevExpress.Sparkline.BarSparklineView"/> object.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="visitor">An object implementing the <see cref="T:DevExpress.Sparkline.ISparklineViewVisitor"/> interface.</param>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.BarSparklineViewBase">
|
|
||||||
<summary>
|
|
||||||
<para>The base for Bar and WinLoss sparkline views.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.BarSparklineViewBase.Assign(DevExpress.Sparkline.SparklineViewBase)">
|
|
||||||
<summary>
|
|
||||||
<para>Copies all the settings from the <see cref="T:DevExpress.Sparkline.BarSparklineViewBase"/> object passed as the parameter.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">A <see cref="T:DevExpress.Sparkline.BarSparklineViewBase"/> object (which is the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> descendant) whose settings are assigned to the current object. If null (Nothing in Visual Basic), then a <see cref="T:System.ArgumentNullException"/> will be thrown.</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.BarSparklineViewBase.BarDistance">
|
|
||||||
<summary>
|
|
||||||
<para>Specifies the distance between two bars of a bar sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value (in pixels).</value>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.ISparklineViewVisitor">
|
|
||||||
<summary>
|
|
||||||
<para>Interface implementing the Visitor pattern.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.ISparklineViewVisitor.Visit(DevExpress.Sparkline.AreaSparklineView)">
|
|
||||||
<summary>
|
|
||||||
<para>Performs the operation as required by the Visitor and the View, as defined in the Visitor pattern.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">An <see cref="T:DevExpress.Sparkline.AreaSparklineView"/> object for which the operation is performed.</param>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.ISparklineViewVisitor.Visit(DevExpress.Sparkline.BarSparklineView)">
|
|
||||||
<summary>
|
|
||||||
<para>Performs the operation as required by the Visitor and the View, as defined in the Visitor pattern.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">An <see cref="T:DevExpress.Sparkline.BarSparklineView"/> object for which the operation is performed.</param>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.ISparklineViewVisitor.Visit(DevExpress.Sparkline.LineSparklineView)">
|
|
||||||
<summary>
|
|
||||||
<para>Performs the operation as required by the Visitor and the View, as defined in the Visitor pattern.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">An <see cref="T:DevExpress.Sparkline.LineSparklineView"/> object for which the operation is performed.</param>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.ISparklineViewVisitor.Visit(DevExpress.Sparkline.WinLossSparklineView)">
|
|
||||||
<summary>
|
|
||||||
<para>Performs the operation as required by the Visitor and the View, as defined in the Visitor pattern.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">An <see cref="T:DevExpress.Sparkline.WinLossSparklineView"/> object for which the operation is performed.</param>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.LineSparklineView">
|
|
||||||
<summary>
|
|
||||||
<para>The Line sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.LineSparklineView.#ctor">
|
|
||||||
<summary>
|
|
||||||
<para>Initializes a new instance of the <see cref="T:DevExpress.Sparkline.LineSparklineView"/> class with the default settings.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.ActualMarkerColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the actual color of a sparkline marker.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> value that is the actual marker color.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.LineSparklineView.Assign(DevExpress.Sparkline.SparklineViewBase)">
|
|
||||||
<summary>
|
|
||||||
<para>Copies all the settings from the <see cref="T:DevExpress.Sparkline.LineSparklineView"/> object passed as the parameter.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">A <see cref="T:DevExpress.Sparkline.LineSparklineView"/> object (which is the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> descendant) whose settings are assigned to the current object. If null (Nothing in Visual Basic), then a <see cref="T:System.ArgumentNullException"/> will be thrown.</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.EnableAntialiasing">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets whether anti-aliasing (smoothing) is applied to the line view.</para>
|
|
||||||
</summary>
|
|
||||||
<value>True to apply anti-aliasing to the line view; False to disable anti-aliasing.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.EndPointMarkerSize">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the size of an end point’s marker.</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value specifying the marker size, in pixels.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.LineWidth">
|
|
||||||
<summary>
|
|
||||||
<para>Specifies the width of a line in a <see cref="T:DevExpress.Sparkline.LineSparklineView"/>.</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value specifying the line width (in pixels).</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.MarkerColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the color to draw line markers.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> that defines the color to draw line markers.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.MarkerSize">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the size of markers for data points in a line sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value specifying the marker size, in pixels.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.MaxPointMarkerSize">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the marker size of a data point that has the maximum value among all data points.</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value specifying the marker size, in pixels.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.MinPointMarkerSize">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the marker size of a data point that has the minimum value among all data points.</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value specifying the marker size, in pixels.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.NegativePointMarkerSize">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the marker size of all data points that have negative values (less than 0).</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value specifying the marker size, in pixels.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.LineSparklineView.SetSizeForAllMarkers(System.Int32)">
|
|
||||||
<summary>
|
|
||||||
<para>Sets size for all markers of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="markerSize">An integer value specifying the new size for sparkline markers (in pixels).</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.ShowMarkers">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value specifying the visibility of point markers on a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>true to show markers for each data point; false to hide them.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.StartPointMarkerSize">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the size of a start point’s marker.</para>
|
|
||||||
</summary>
|
|
||||||
<value>An integer value specifying the marker size, in pixels.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.LineSparklineView.Type">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the type of the sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
<value>Always <see cref="F:DevExpress.Sparkline.SparklineViewType.Line">SparklineViewType.Line</see>.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.LineSparklineView.Visit(DevExpress.Sparkline.ISparklineViewVisitor)">
|
|
||||||
<summary>
|
|
||||||
<para>Invokes the Visit method of the specified visitor for the current <see cref="T:DevExpress.Sparkline.LineSparklineView"/> object.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="visitor">An object implementing the <see cref="T:DevExpress.Sparkline.ISparklineViewVisitor"/> interface.</param>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.SparklineRange">
|
|
||||||
<summary>
|
|
||||||
<para>Represents a range to be used in DevExpress Sparkline controls.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.SparklineRange.#ctor">
|
|
||||||
<summary>
|
|
||||||
<para>Initializes a new instance of the <see cref="T:DevExpress.Sparkline.SparklineRange"/> class with the default settings.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.SparklineRange.#ctor(System.Double,System.Double)">
|
|
||||||
<summary>
|
|
||||||
<para>Initializes a new instance of the <see cref="T:DevExpress.Sparkline.SparklineRange"/> class with the specified minimum and maximum limits.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="min">A <see cref="T:System.Double"/> value, specifying the minimum limit. This value is assigned to the <see cref="P:DevExpress.Sparkline.SparklineRange.Limit1">SparklineRange.Limit1</see> property.</param>
|
|
||||||
<param name="max">A <see cref="T:System.Double"/> value, specifying the maximum limit. This value is assigned to the <see cref="P:DevExpress.Sparkline.SparklineRange.Limit2">SparklineRange.Limit2</see> property.</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineRange.IsAuto">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value indicating whether or not range limits should be calculated automatically.</para>
|
|
||||||
</summary>
|
|
||||||
<value>true to calculate range limits automatically; false to use the <see cref="P:DevExpress.Sparkline.SparklineRange.Limit1">SparklineRange.Limit1</see> and <see cref="P:DevExpress.Sparkline.SparklineRange.Limit2">SparklineRange.Limit2</see> property values.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineRange.Limit1">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value specifying the first limit of the range.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Double"/> value that specifies the first limit.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineRange.Limit2">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value specifying the second limit of the range.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Double"/> value that specifies the second limit.</value>
|
|
||||||
</member>
|
|
||||||
<member name="E:DevExpress.Sparkline.SparklineRange.PropertiesChanged">
|
|
||||||
<summary>
|
|
||||||
<para>This event is hidden, because it is not appropriate for the <see cref="T:DevExpress.Sparkline.SparklineRange"/> class.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.SparklineRange.ToString">
|
|
||||||
<summary>
|
|
||||||
<para>Returns the textual representation of the <see cref="T:DevExpress.Sparkline.SparklineRange"/>.</para>
|
|
||||||
</summary>
|
|
||||||
<returns>A <see cref="T:System.String"/> value which is the textual representation of the <see cref="T:DevExpress.Sparkline.SparklineRange"/>.</returns>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.SparklineViewBase">
|
|
||||||
<summary>
|
|
||||||
<para>The base class for sparkline views.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.ActualColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the actual color of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> value that is the actual sparkline color.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.ActualEndPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the actual color of a sparkline end point.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> value that is the actual point color.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.ActualMaxPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the actual color of a sparkline maximum point.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> value that is the actual point color.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.ActualMinPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the actual color of a sparkline minimum point.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> value that is the actual point color.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.ActualNegativePointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the actual color of sparkline negative points.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> value that is the actual point color.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.ActualStartPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the actual color of a sparkline start point.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> value that is the actual point color.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.SparklineViewBase.Assign(DevExpress.Sparkline.SparklineViewBase)">
|
|
||||||
<summary>
|
|
||||||
<para>Copies all the settings from the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> object passed as the parameter.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="view">A <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> object (which is the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> descendant) whose settings are assigned to the current object. If null (Nothing in Visual Basic), then a <see cref="T:System.ArgumentNullException"/> will be thrown.</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.Color">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the color to draw a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> that defines the color to draw a sparkline.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.SparklineViewBase.CreateView(DevExpress.Sparkline.SparklineViewType)">
|
|
||||||
<summary>
|
|
||||||
<para>Creates a sparkline view of the specified type.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="viewType">A <see cref="T:DevExpress.Sparkline.SparklineViewType"/> enumeration value specifying the type of view to create.</param>
|
|
||||||
<returns>A <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> class descendant.</returns>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.EndPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the color to draw the end point of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> that defines the color to draw the end point.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.HighlightEndPoint">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value specifying whether or not to highlight the end point of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>true, to highlight the end point; otherwise, false.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.HighlightMaxPoint">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value specifying whether or not to highlight a sparkline point that has the highest value among all points.</para>
|
|
||||||
</summary>
|
|
||||||
<value>true, to highlight a point with the maximum value; otherwise, false.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.HighlightMinPoint">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value specifying whether or not to highlight a sparkline point that has the lowest value among all points.</para>
|
|
||||||
</summary>
|
|
||||||
<value>true, to highlight a point with the minimum value; otherwise, false.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.HighlightNegativePoints">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the value that specifies whether to highlight the negative points of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>true to highlight the negative points; otherwise, `false``.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.HighlightStartPoint">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets a value specifying whether or not to highlight the start point of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>true, to highlight the start point; otherwise, false.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.MaxPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the color to draw a sparkline point that has the highest value among all data points.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> that defines the color to draw a data point with the maximum value.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.MinPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the color to draw a sparkline point that has the lowest value among all data points.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> that defines the color to draw a data point with the minimum value.</value>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.NegativePointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the color to draw sparkline points that have negative values (less than 0).</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> that defines the color to draw data points with negative values.</value>
|
|
||||||
</member>
|
|
||||||
<member name="E:DevExpress.Sparkline.SparklineViewBase.PropertiesChanged">
|
|
||||||
<summary>
|
|
||||||
<para>Occurs when any property of the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> object has changed its value.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.StartPointColor">
|
|
||||||
<summary>
|
|
||||||
<para>Gets or sets the color to draw the start point of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:System.Drawing.Color"/> that defines the color to draw the start point.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.SparklineViewBase.ToString">
|
|
||||||
<summary>
|
|
||||||
<para>Returns a human-readable string that represents the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> object.</para>
|
|
||||||
</summary>
|
|
||||||
<returns>A <see cref="T:System.String"/> value that represents the <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> object.</returns>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.SparklineViewBase.Type">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the type of the sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
<value>A <see cref="T:DevExpress.Sparkline.SparklineViewType"/> enumeration value specifying the view type.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.SparklineViewBase.Visit(DevExpress.Sparkline.ISparklineViewVisitor)">
|
|
||||||
<summary>
|
|
||||||
<para>Invokes the Visit method of the specified visitor for the current <see cref="T:DevExpress.Sparkline.SparklineViewBase"/> object.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="visitor">An object implementing the <see cref="T:DevExpress.Sparkline.ISparklineViewVisitor"/> interface.</param>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.SparklineViewType">
|
|
||||||
<summary>
|
|
||||||
<para>Lists the values used to specify the available view types of a sparkline.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="F:DevExpress.Sparkline.SparklineViewType.Area">
|
|
||||||
<summary>
|
|
||||||
<para>Sparkline data points are represented as area.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="F:DevExpress.Sparkline.SparklineViewType.Bar">
|
|
||||||
<summary>
|
|
||||||
<para>Sparkline data points are represented as bars.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="F:DevExpress.Sparkline.SparklineViewType.Line">
|
|
||||||
<summary>
|
|
||||||
<para>Sparkline data points are represented as a line.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="F:DevExpress.Sparkline.SparklineViewType.WinLoss">
|
|
||||||
<summary>
|
|
||||||
<para>Sparkline data points are represented as win and loss squares.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="T:DevExpress.Sparkline.WinLossSparklineView">
|
|
||||||
<summary>
|
|
||||||
<para>The WinLoss sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.WinLossSparklineView.#ctor">
|
|
||||||
<summary>
|
|
||||||
<para>Initializes a new instance of the <see cref="T:DevExpress.Sparkline.WinLossSparklineView"/> class with the default settings.</para>
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:DevExpress.Sparkline.WinLossSparklineView.Type">
|
|
||||||
<summary>
|
|
||||||
<para>Gets the type of the sparkline view.</para>
|
|
||||||
</summary>
|
|
||||||
<value>Always <see cref="F:DevExpress.Sparkline.SparklineViewType.WinLoss">SparklineViewType.WinLoss</see>.</value>
|
|
||||||
</member>
|
|
||||||
<member name="M:DevExpress.Sparkline.WinLossSparklineView.Visit(DevExpress.Sparkline.ISparklineViewVisitor)">
|
|
||||||
<summary>
|
|
||||||
<para>Invokes the Visit method of the specified visitor for the current <see cref="T:DevExpress.Sparkline.WinLossSparklineView"/> object.</para>
|
|
||||||
</summary>
|
|
||||||
<param name="visitor">An object implementing the <see cref="T:DevExpress.Sparkline.ISparklineViewVisitor"/> interface.</param>
|
|
||||||
</member>
|
|
||||||
</members>
|
|
||||||
</doc>
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,34 +1,34 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace AppStore
|
namespace AppStore
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 提供基本数学运算功能的工具类
|
/// 提供基本数学运算功能的工具类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class Calculator
|
public static class Calculator
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加法运算
|
/// 加法运算
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static double Add(double a, double b) => a + b;
|
public static double Add(double a, double b) => a + b;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 减法运算
|
/// 减法运算
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static double Subtract(double a, double b) => a - b;
|
public static double Subtract(double a, double b) => a - b;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 乘法运算
|
/// 乘法运算
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static double Multiply(double a, double b) => a * b;
|
public static double Multiply(double a, double b) => a * b;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 除法运算
|
/// 除法运算
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static double Divide(double a, double b)
|
public static double Divide(double a, double b)
|
||||||
{
|
{
|
||||||
if (b == 0) throw new DivideByZeroException("除数不能为零");
|
if (b == 0) throw new DivideByZeroException("除数不能为零");
|
||||||
return a / b;
|
return a / b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,118 +1,118 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using AppStore;
|
using AppStore;
|
||||||
|
|
||||||
namespace AppStore
|
namespace AppStore
|
||||||
{
|
{
|
||||||
public class CalculatorForm : Form
|
public class CalculatorForm : Form
|
||||||
{
|
{
|
||||||
private TextBox display = new TextBox();
|
private TextBox display = new TextBox();
|
||||||
private double firstNumber = 0;
|
private double firstNumber = 0;
|
||||||
private string operation = "";
|
private string operation = "";
|
||||||
|
|
||||||
public CalculatorForm()
|
public CalculatorForm()
|
||||||
{
|
{
|
||||||
this.Text = "计算器";
|
this.Text = "计算器";
|
||||||
this.Size = new Size(300, 400);
|
this.Size = new Size(300, 400);
|
||||||
this.StartPosition = FormStartPosition.CenterScreen;
|
this.StartPosition = FormStartPosition.CenterScreen;
|
||||||
CreateControls();
|
CreateControls();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateControls()
|
private void CreateControls()
|
||||||
{
|
{
|
||||||
// 显示框
|
// 显示框
|
||||||
display = new TextBox();
|
display = new TextBox();
|
||||||
display.ReadOnly = true;
|
display.ReadOnly = true;
|
||||||
display.TextAlign = HorizontalAlignment.Right;
|
display.TextAlign = HorizontalAlignment.Right;
|
||||||
display.Font = new Font("Microsoft YaHei", 14);
|
display.Font = new Font("Microsoft YaHei", 14);
|
||||||
display.Size = new Size(260, 40);
|
display.Size = new Size(260, 40);
|
||||||
display.Location = new Point(20, 20);
|
display.Location = new Point(20, 20);
|
||||||
this.Controls.Add(display);
|
this.Controls.Add(display);
|
||||||
|
|
||||||
// 按钮布局
|
// 按钮布局
|
||||||
string[] buttonLabels = {
|
string[] buttonLabels = {
|
||||||
"7", "8", "9", "/",
|
"7", "8", "9", "/",
|
||||||
"4", "5", "6", "*",
|
"4", "5", "6", "*",
|
||||||
"1", "2", "3", "-",
|
"1", "2", "3", "-",
|
||||||
"0", ".", "=", "+"
|
"0", ".", "=", "+"
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 0; i < buttonLabels.Length; i++)
|
for (int i = 0; i < buttonLabels.Length; i++)
|
||||||
{
|
{
|
||||||
var btn = new Button();
|
var btn = new Button();
|
||||||
btn.Text = buttonLabels[i];
|
btn.Text = buttonLabels[i];
|
||||||
btn.Size = new Size(60, 50);
|
btn.Size = new Size(60, 50);
|
||||||
btn.Location = new Point(20 + (i % 4) * 65, 70 + (i / 4) * 55);
|
btn.Location = new Point(20 + (i % 4) * 65, 70 + (i / 4) * 55);
|
||||||
btn.Font = new Font("Microsoft YaHei", 12);
|
btn.Font = new Font("Microsoft YaHei", 12);
|
||||||
btn.Click += ButtonClickHandler;
|
btn.Click += ButtonClickHandler;
|
||||||
this.Controls.Add(btn);
|
this.Controls.Add(btn);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 清除按钮
|
// 清除按钮
|
||||||
var clearBtn = new Button();
|
var clearBtn = new Button();
|
||||||
clearBtn.Text = "C";
|
clearBtn.Text = "C";
|
||||||
clearBtn.Size = new Size(260, 40);
|
clearBtn.Size = new Size(260, 40);
|
||||||
clearBtn.Location = new Point(20, 300);
|
clearBtn.Location = new Point(20, 300);
|
||||||
clearBtn.Font = new Font("Microsoft YaHei", 12);
|
clearBtn.Font = new Font("Microsoft YaHei", 12);
|
||||||
clearBtn.Click += (s, e) => {
|
clearBtn.Click += (s, e) => {
|
||||||
display.Text = "";
|
display.Text = "";
|
||||||
firstNumber = 0;
|
firstNumber = 0;
|
||||||
operation = "";
|
operation = "";
|
||||||
};
|
};
|
||||||
this.Controls.Add(clearBtn);
|
this.Controls.Add(clearBtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ButtonClickHandler(object sender, EventArgs e)
|
private void ButtonClickHandler(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var button = sender as Button;
|
var button = sender as Button;
|
||||||
if (button == null) return;
|
if (button == null) return;
|
||||||
|
|
||||||
switch (button.Text)
|
switch (button.Text)
|
||||||
{
|
{
|
||||||
case "+":
|
case "+":
|
||||||
case "-":
|
case "-":
|
||||||
case "*":
|
case "*":
|
||||||
case "/":
|
case "/":
|
||||||
if (!string.IsNullOrEmpty(display.Text))
|
if (!string.IsNullOrEmpty(display.Text))
|
||||||
{
|
{
|
||||||
firstNumber = double.Parse(display.Text);
|
firstNumber = double.Parse(display.Text);
|
||||||
operation = button.Text;
|
operation = button.Text;
|
||||||
display.Text = "";
|
display.Text = "";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "=":
|
case "=":
|
||||||
if (!string.IsNullOrEmpty(operation) && !string.IsNullOrEmpty(display.Text))
|
if (!string.IsNullOrEmpty(operation) && !string.IsNullOrEmpty(display.Text))
|
||||||
{
|
{
|
||||||
double secondNumber = double.Parse(display.Text);
|
double secondNumber = double.Parse(display.Text);
|
||||||
double result = 0;
|
double result = 0;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
result = operation switch
|
result = operation switch
|
||||||
{
|
{
|
||||||
"+" => AppStore.Calculator.Add(firstNumber, secondNumber),
|
"+" => AppStore.Calculator.Add(firstNumber, secondNumber),
|
||||||
"-" => AppStore.Calculator.Subtract(firstNumber, secondNumber),
|
"-" => AppStore.Calculator.Subtract(firstNumber, secondNumber),
|
||||||
"*" => AppStore.Calculator.Multiply(firstNumber, secondNumber),
|
"*" => AppStore.Calculator.Multiply(firstNumber, secondNumber),
|
||||||
"/" => AppStore.Calculator.Divide(firstNumber, secondNumber),
|
"/" => AppStore.Calculator.Divide(firstNumber, secondNumber),
|
||||||
_ => 0
|
_ => 0
|
||||||
};
|
};
|
||||||
|
|
||||||
display.Text = result.ToString();
|
display.Text = result.ToString();
|
||||||
}
|
}
|
||||||
catch (DivideByZeroException)
|
catch (DivideByZeroException)
|
||||||
{
|
{
|
||||||
MessageBox.Show("除数不能为零", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show("除数不能为零", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
operation = "";
|
operation = "";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
display.Text += button.Text;
|
display.Text += button.Text;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,38 +1,38 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace AppStore
|
namespace AppStore
|
||||||
{
|
{
|
||||||
public class CalculatorToolCard : ToolCard
|
public class CalculatorToolCard : ToolCard
|
||||||
{
|
{
|
||||||
public CalculatorToolCard()
|
public CalculatorToolCard()
|
||||||
{
|
{
|
||||||
ToolName = "计算器";
|
ToolName = "计算器";
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "Calculator.png");
|
string iconPath = Path.Combine(Application.StartupPath, "img", "resource", "png", "Calculator.png");
|
||||||
if (File.Exists(iconPath))
|
if (File.Exists(iconPath))
|
||||||
{
|
{
|
||||||
ToolIcon = Image.FromFile(iconPath);
|
ToolIcon = Image.FromFile(iconPath);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ToolIcon = SystemIcons.Application.ToBitmap();
|
ToolIcon = SystemIcons.Application.ToBitmap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
ToolIcon = SystemIcons.Application.ToBitmap();
|
ToolIcon = SystemIcons.Application.ToBitmap();
|
||||||
}
|
}
|
||||||
this.ToolCardClicked += OnCalculatorCardClicked;
|
this.ToolCardClicked += OnCalculatorCardClicked;
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnCalculatorCardClicked(object sender, EventArgs e)
|
private void OnCalculatorCardClicked(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var calculatorForm = new CalculatorForm();
|
var calculatorForm = new CalculatorForm();
|
||||||
calculatorForm.ShowDialog();
|
calculatorForm.ShowDialog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
|
||||||
VisualStudioVersion = 17.11.35327.3
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetWorkManager", "NetWorkManager\NetWorkManager.csproj", "{25900669-2872-4F11-9516-763C420E2B96}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{25900669-2872-4F11-9516-763C420E2B96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{25900669-2872-4F11-9516-763C420E2B96}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{25900669-2872-4F11-9516-763C420E2B96}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{25900669-2872-4F11-9516-763C420E2B96}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<configuration>
|
|
||||||
<configSections>
|
|
||||||
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System">
|
|
||||||
<section name="DevExpress.LookAndFeel.Design.AppSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
|
|
||||||
</sectionGroup>
|
|
||||||
</configSections>
|
|
||||||
<applicationSettings>
|
|
||||||
<DevExpress.LookAndFeel.Design.AppSettings>
|
|
||||||
<setting name="DPIAwarenessMode" serializeAs="String">
|
|
||||||
<value>System</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="RegisterBonusSkins" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
</DevExpress.LookAndFeel.Design.AppSettings>
|
|
||||||
</applicationSettings>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
|
||||||
</startup>
|
|
||||||
</configuration>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
|
|
||||||
<Costura />
|
|
||||||
</Weavers>
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
|
|
||||||
<xs:element name="Weavers">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:all>
|
|
||||||
<xs:element name="Costura" minOccurs="0" maxOccurs="1">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:all>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
</xs:all>
|
|
||||||
<xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeRuntimeReferences" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="DisableCompression" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="DisableCleanup" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="ExcludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="PreloadOrder" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
</xs:all>
|
|
||||||
<xs:attribute name="VerifyAssembly" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="GenerateXsd" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
</xs:schema>
|
|
||||||
175
tools/NetWorkManager/NetWorkManager/Form1.Designer.cs
generated
175
tools/NetWorkManager/NetWorkManager/Form1.Designer.cs
generated
@@ -1,175 +0,0 @@
|
|||||||
namespace NetWorkManager
|
|
||||||
{
|
|
||||||
partial class Form1
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Component Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
this.gridControl = new DevExpress.XtraGrid.GridControl();
|
|
||||||
this.gridView = new DevExpress.XtraGrid.Views.Grid.GridView();
|
|
||||||
this.ribbonControl = new DevExpress.XtraBars.Ribbon.RibbonControl();
|
|
||||||
this.bsiRecordsCount = new DevExpress.XtraBars.BarStaticItem();
|
|
||||||
this.bbiDelete = new DevExpress.XtraBars.BarButtonItem();
|
|
||||||
this.bbiRefresh = new DevExpress.XtraBars.BarButtonItem();
|
|
||||||
this.ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
|
|
||||||
this.ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
|
|
||||||
this.ribbonStatusBar = new DevExpress.XtraBars.Ribbon.RibbonStatusBar();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridControl)).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridView)).BeginInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.ribbonControl)).BeginInit();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// gridControl
|
|
||||||
//
|
|
||||||
this.gridControl.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.gridControl.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(4);
|
|
||||||
this.gridControl.Location = new System.Drawing.Point(0, 231);
|
|
||||||
this.gridControl.MainView = this.gridView;
|
|
||||||
this.gridControl.Margin = new System.Windows.Forms.Padding(4);
|
|
||||||
this.gridControl.MenuManager = this.ribbonControl;
|
|
||||||
this.gridControl.Name = "gridControl";
|
|
||||||
this.gridControl.Size = new System.Drawing.Size(1448, 839);
|
|
||||||
this.gridControl.TabIndex = 2;
|
|
||||||
this.gridControl.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
|
|
||||||
this.gridView});
|
|
||||||
this.gridControl.Click += new System.EventHandler(this.gridControl_Click);
|
|
||||||
this.gridControl.MouseClick += new System.Windows.Forms.MouseEventHandler(this.gridControl_MouseClick);
|
|
||||||
//
|
|
||||||
// gridView
|
|
||||||
//
|
|
||||||
this.gridView.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
|
|
||||||
this.gridView.DetailHeight = 512;
|
|
||||||
this.gridView.GridControl = this.gridControl;
|
|
||||||
this.gridView.Name = "gridView";
|
|
||||||
this.gridView.OptionsBehavior.Editable = false;
|
|
||||||
this.gridView.OptionsBehavior.ReadOnly = true;
|
|
||||||
this.gridView.OptionsEditForm.PopupEditFormWidth = 1200;
|
|
||||||
this.gridView.Click += new System.EventHandler(this.gridView_Click);
|
|
||||||
//
|
|
||||||
// ribbonControl
|
|
||||||
//
|
|
||||||
this.ribbonControl.EmptyAreaImageOptions.ImagePadding = new System.Windows.Forms.Padding(45, 44, 45, 44);
|
|
||||||
this.ribbonControl.ExpandCollapseItem.Id = 0;
|
|
||||||
this.ribbonControl.Items.AddRange(new DevExpress.XtraBars.BarItem[] {
|
|
||||||
this.ribbonControl.ExpandCollapseItem,
|
|
||||||
this.bsiRecordsCount,
|
|
||||||
this.bbiDelete,
|
|
||||||
this.bbiRefresh});
|
|
||||||
this.ribbonControl.Location = new System.Drawing.Point(0, 0);
|
|
||||||
this.ribbonControl.Margin = new System.Windows.Forms.Padding(4);
|
|
||||||
this.ribbonControl.MaxItemId = 20;
|
|
||||||
this.ribbonControl.Name = "ribbonControl";
|
|
||||||
this.ribbonControl.OptionsMenuMinWidth = 495;
|
|
||||||
this.ribbonControl.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] {
|
|
||||||
this.ribbonPage1});
|
|
||||||
this.ribbonControl.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonControlStyle.Office2013;
|
|
||||||
this.ribbonControl.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
|
|
||||||
this.ribbonControl.Size = new System.Drawing.Size(1448, 231);
|
|
||||||
this.ribbonControl.StatusBar = this.ribbonStatusBar;
|
|
||||||
this.ribbonControl.ToolbarLocation = DevExpress.XtraBars.Ribbon.RibbonQuickAccessToolbarLocation.Hidden;
|
|
||||||
//
|
|
||||||
// bsiRecordsCount
|
|
||||||
//
|
|
||||||
this.bsiRecordsCount.Caption = "RECORDS : 0";
|
|
||||||
this.bsiRecordsCount.Id = 15;
|
|
||||||
this.bsiRecordsCount.Name = "bsiRecordsCount";
|
|
||||||
//
|
|
||||||
// bbiDelete
|
|
||||||
//
|
|
||||||
this.bbiDelete.Caption = "Terminate";
|
|
||||||
this.bbiDelete.Id = 18;
|
|
||||||
this.bbiDelete.ImageOptions.ImageUri.Uri = "Delete";
|
|
||||||
this.bbiDelete.Name = "bbiDelete";
|
|
||||||
this.bbiDelete.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.bbiDelete_ItemClick);
|
|
||||||
//
|
|
||||||
// bbiRefresh
|
|
||||||
//
|
|
||||||
this.bbiRefresh.Caption = "Refresh";
|
|
||||||
this.bbiRefresh.Id = 19;
|
|
||||||
this.bbiRefresh.ImageOptions.ImageUri.Uri = "Refresh";
|
|
||||||
this.bbiRefresh.Name = "bbiRefresh";
|
|
||||||
this.bbiRefresh.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.bbiRefresh_ItemClick);
|
|
||||||
//
|
|
||||||
// ribbonPage1
|
|
||||||
//
|
|
||||||
this.ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] {
|
|
||||||
this.ribbonPageGroup1});
|
|
||||||
this.ribbonPage1.MergeOrder = 0;
|
|
||||||
this.ribbonPage1.Name = "ribbonPage1";
|
|
||||||
this.ribbonPage1.Text = "Home";
|
|
||||||
//
|
|
||||||
// ribbonPageGroup1
|
|
||||||
//
|
|
||||||
this.ribbonPageGroup1.AllowTextClipping = false;
|
|
||||||
this.ribbonPageGroup1.CaptionButtonVisible = DevExpress.Utils.DefaultBoolean.False;
|
|
||||||
this.ribbonPageGroup1.ItemLinks.Add(this.bbiDelete);
|
|
||||||
this.ribbonPageGroup1.ItemLinks.Add(this.bbiRefresh);
|
|
||||||
this.ribbonPageGroup1.Name = "ribbonPageGroup1";
|
|
||||||
this.ribbonPageGroup1.Text = "Tasks";
|
|
||||||
//
|
|
||||||
// ribbonStatusBar
|
|
||||||
//
|
|
||||||
this.ribbonStatusBar.ItemLinks.Add(this.bsiRecordsCount);
|
|
||||||
this.ribbonStatusBar.Location = new System.Drawing.Point(0, 1034);
|
|
||||||
this.ribbonStatusBar.Margin = new System.Windows.Forms.Padding(4);
|
|
||||||
this.ribbonStatusBar.Name = "ribbonStatusBar";
|
|
||||||
this.ribbonStatusBar.Ribbon = this.ribbonControl;
|
|
||||||
this.ribbonStatusBar.Size = new System.Drawing.Size(1448, 36);
|
|
||||||
//
|
|
||||||
// Form1
|
|
||||||
//
|
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.ClientSize = new System.Drawing.Size(1448, 1070);
|
|
||||||
this.Controls.Add(this.ribbonStatusBar);
|
|
||||||
this.Controls.Add(this.gridControl);
|
|
||||||
this.Controls.Add(this.ribbonControl);
|
|
||||||
this.Margin = new System.Windows.Forms.Padding(4);
|
|
||||||
this.Name = "Form1";
|
|
||||||
this.Ribbon = this.ribbonControl;
|
|
||||||
this.StatusBar = this.ribbonStatusBar;
|
|
||||||
this.Text = "NetWorkManger";
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridControl)).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridView)).EndInit();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.ribbonControl)).EndInit();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private DevExpress.XtraGrid.GridControl gridControl;
|
|
||||||
private DevExpress.XtraGrid.Views.Grid.GridView gridView;
|
|
||||||
private DevExpress.XtraBars.Ribbon.RibbonControl ribbonControl;
|
|
||||||
private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
|
|
||||||
private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
|
|
||||||
private DevExpress.XtraBars.Ribbon.RibbonStatusBar ribbonStatusBar;
|
|
||||||
private DevExpress.XtraBars.BarStaticItem bsiRecordsCount;
|
|
||||||
private DevExpress.XtraBars.BarButtonItem bbiDelete;
|
|
||||||
private DevExpress.XtraBars.BarButtonItem bbiRefresh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
using DevExpress.Utils.Design;
|
|
||||||
using DevExpress.Utils.Extensions;
|
|
||||||
using DevExpress.XtraBars;
|
|
||||||
using DevExpress.XtraEditors;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Data;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace NetWorkManager
|
|
||||||
{
|
|
||||||
public partial class Form1 : DevExpress.XtraBars.Ribbon.RibbonForm
|
|
||||||
{
|
|
||||||
public Form1()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
BindingList<Customer> dataSource = GetDataSource();
|
|
||||||
gridControl.DataSource = dataSource;
|
|
||||||
bsiRecordsCount.Caption = "RECORDS : " + dataSource.Count;
|
|
||||||
}
|
|
||||||
void bbiPrintPreview_ItemClick(object sender, ItemClickEventArgs e)
|
|
||||||
{
|
|
||||||
gridControl.ShowRibbonPrintPreview();
|
|
||||||
}
|
|
||||||
public BindingList<Customer> GetDataSource()
|
|
||||||
{
|
|
||||||
List<PortScanner.internet_info> internet_infolist = PortScanner.GetAllInfo();
|
|
||||||
|
|
||||||
BindingList<Customer> result = new BindingList<Customer>();
|
|
||||||
|
|
||||||
int index = 1;
|
|
||||||
foreach(var item in internet_infolist)
|
|
||||||
{
|
|
||||||
result.Add(new Customer()
|
|
||||||
{
|
|
||||||
ID = index++,
|
|
||||||
PID = item.pid,
|
|
||||||
Process = item.process,
|
|
||||||
Local = item.local,
|
|
||||||
Remote = item.remote,
|
|
||||||
State = item.state,
|
|
||||||
Protocal = item.protocal
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
public class Customer
|
|
||||||
{
|
|
||||||
[Key, Display(AutoGenerateField = false)]
|
|
||||||
public int ID { get; set; }
|
|
||||||
[Required]
|
|
||||||
public string PID { get; set; }
|
|
||||||
public string Process { get; set; }
|
|
||||||
public string Local { get; set; }
|
|
||||||
public string Remote { get; set; }
|
|
||||||
// [Display(Name = "Zip Code")]
|
|
||||||
public string State { get; set; }
|
|
||||||
public string Protocal { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private void bbiRefresh_ItemClick(object sender, ItemClickEventArgs e)
|
|
||||||
{
|
|
||||||
BindingList<Customer> dataSource = GetDataSource();
|
|
||||||
gridControl.DataSource = dataSource;
|
|
||||||
bsiRecordsCount.Caption = "RECORDS : " + dataSource.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void bbiDelete_ItemClick(object sender, ItemClickEventArgs e)
|
|
||||||
{
|
|
||||||
var tRcvrLineID = gridView.GetFocusedRowCellValue("PID").ToString();
|
|
||||||
var processee = gridView.GetFocusedRowCellValue("Process").ToString();
|
|
||||||
|
|
||||||
if (XtraMessageBox.Show("Do you want to terminate" +$" PID:{tRcvrLineID} Process:{processee}", "Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes)
|
|
||||||
{
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Process process = Process.GetProcessById(Convert.ToInt32(tRcvrLineID));
|
|
||||||
process.Kill();
|
|
||||||
process.WaitForExit();
|
|
||||||
|
|
||||||
XtraMessageBox.Show($" PID:{tRcvrLineID} Process:{processee} Terminated!", "Succuess Execute!");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
XtraMessageBox.Show($" PID:{tRcvrLineID} Process:{processee} {ex.Message}!", "error!");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BindingList<Customer> dataSource = GetDataSource();
|
|
||||||
gridControl.DataSource = dataSource;
|
|
||||||
bsiRecordsCount.Caption = "RECORDS : " + dataSource.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void gridControl_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void gridControl_MouseClick(object sender, MouseEventArgs e)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void gridView_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="..\packages\Fody.6.8.2\build\Fody.targets" Condition="Exists('..\packages\Fody.6.8.2\build\Fody.targets')" />
|
|
||||||
<Import Project="..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
|
||||||
<ProductVersion>8.0.30703</ProductVersion>
|
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
|
||||||
<ProjectGuid>{25900669-2872-4F11-9516-763C420E2B96}</ProjectGuid>
|
|
||||||
<OutputType>WinExe</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>NetWorkManager</RootNamespace>
|
|
||||||
<AssemblyName>NetWorkManager</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<PublishUrl>publish\</PublishUrl>
|
|
||||||
<Install>true</Install>
|
|
||||||
<InstallFrom>Disk</InstallFrom>
|
|
||||||
<UpdateEnabled>false</UpdateEnabled>
|
|
||||||
<UpdateMode>Foreground</UpdateMode>
|
|
||||||
<UpdateInterval>7</UpdateInterval>
|
|
||||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
|
||||||
<UpdatePeriodically>false</UpdatePeriodically>
|
|
||||||
<UpdateRequired>false</UpdateRequired>
|
|
||||||
<MapFileExtensions>true</MapFileExtensions>
|
|
||||||
<ApplicationRevision>0</ApplicationRevision>
|
|
||||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
|
||||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
|
||||||
<UseApplicationTrust>false</UseApplicationTrust>
|
|
||||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugType>none</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="DevExpress.BonusSkins.v24.1" />
|
|
||||||
<Reference Include="DevExpress.Data.Desktop.v24.1" />
|
|
||||||
<Reference Include="DevExpress.Data.v24.1" />
|
|
||||||
<Reference Include="DevExpress.Images.v24.1, Version=24.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
|
||||||
<Reference Include="DevExpress.Utils.v24.1" />
|
|
||||||
<Reference Include="DevExpress.Sparkline.v24.1.Core" />
|
|
||||||
<Reference Include="DevExpress.XtraBars.v24.1, Version=24.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
|
||||||
<Reference Include="DevExpress.XtraEditors.v24.1" />
|
|
||||||
<Reference Include="DevExpress.Printing.v24.1.Core" />
|
|
||||||
<Reference Include="DevExpress.Drawing.v24.1" />
|
|
||||||
<Reference Include="DevExpress.XtraGrid.v24.1, Version=24.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Deployment" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Windows.Forms" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="enumInternet.cs" />
|
|
||||||
<Compile Include="Program.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="Form1.cs">
|
|
||||||
<SubType>Form</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Form1.Designer.cs">
|
|
||||||
<DependentUpon>Form1.cs</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<EmbeddedResource Include="Form1.resx">
|
|
||||||
<DependentUpon>Form1.cs</DependentUpon>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<EmbeddedResource Include="Properties\licenses.licx" />
|
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<None Include="App.config" />
|
|
||||||
<None Include="Properties\Settings.settings">
|
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
<Compile Include="Properties\Settings.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<BootstrapperPackage Include=".NETFramework,Version=v4.7.2">
|
|
||||||
<Visible>False</Visible>
|
|
||||||
<ProductName>Microsoft .NET Framework 4.7.2 %28x86 and x64%29</ProductName>
|
|
||||||
<Install>true</Install>
|
|
||||||
</BootstrapperPackage>
|
|
||||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
|
||||||
<Visible>False</Visible>
|
|
||||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
|
||||||
<Install>false</Install>
|
|
||||||
</BootstrapperPackage>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<PublishUrlHistory />
|
|
||||||
<InstallUrlHistory />
|
|
||||||
<SupportUrlHistory />
|
|
||||||
<UpdateUrlHistory />
|
|
||||||
<BootstrapperUrlHistory />
|
|
||||||
<ErrorReportUrlHistory />
|
|
||||||
<FallbackCulture>en-US</FallbackCulture>
|
|
||||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
using DevExpress.LookAndFeel;
|
|
||||||
using DevExpress.Skins;
|
|
||||||
using DevExpress.UserSkins;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace NetWorkManager
|
|
||||||
{
|
|
||||||
internal static class Program
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The main entry point for the application.
|
|
||||||
/// </summary>
|
|
||||||
[STAThread]
|
|
||||||
static void Main()
|
|
||||||
{
|
|
||||||
Application.EnableVisualStyles();
|
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
|
||||||
Application.Run(new Form1());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("NetWorkManager")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("NetWorkManager")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © 2025")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
|
||||||
// to COM components. If you need to access a type in this assembly from
|
|
||||||
// COM, set the ComVisible attribute to true on that type.
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
|
||||||
[assembly: Guid("9006f149-aa49-4b8e-ba69-386d945fa738")]
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
|
||||||
// by using the '*' as shown below:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.18034
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace NetWorkManager.Properties
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
|
||||||
/// </summary>
|
|
||||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
|
||||||
// class via a tool like ResGen or Visual Studio.
|
|
||||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
|
||||||
// with the /str option, or rebuild your VS project.
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
internal class Resources
|
|
||||||
{
|
|
||||||
|
|
||||||
private static global::System.Resources.ResourceManager resourceMan;
|
|
||||||
|
|
||||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
|
||||||
|
|
||||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
|
||||||
internal Resources()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the cached ResourceManager instance used by this class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Resources.ResourceManager ResourceManager
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if ((resourceMan == null))
|
|
||||||
{
|
|
||||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NetWorkManager.Properties.Resources", typeof(Resources).Assembly);
|
|
||||||
resourceMan = temp;
|
|
||||||
}
|
|
||||||
return resourceMan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Overrides the current thread's CurrentUICulture property for all
|
|
||||||
/// resource lookups using this strongly typed resource class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Globalization.CultureInfo Culture
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return resourceCulture;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
resourceCulture = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0"></xsd:element>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string"></xsd:attribute>
|
|
||||||
<xsd:attribute name="type" type="xsd:string"></xsd:attribute>
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string"></xsd:attribute>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string"></xsd:attribute>
|
|
||||||
<xsd:attribute name="name" type="xsd:string"></xsd:attribute>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"></xsd:element>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1"></xsd:attribute>
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"></xsd:attribute>
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"></xsd:attribute>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.18034
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace NetWorkManager.Properties
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
|
||||||
{
|
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
|
||||||
|
|
||||||
public static Settings Default
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return defaultInstance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
|
||||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
|
||||||
<Profiles>
|
|
||||||
<Profile Name="(Default)" />
|
|
||||||
</Profiles>
|
|
||||||
<Settings />
|
|
||||||
</SettingsFile>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v24.1, Version=24.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
|
|
||||||
DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v24.1, Version=24.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
|
|
||||||
@@ -1,390 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.NetworkInformation;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Diagnostics;
|
|
||||||
namespace NetWorkManager
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
public class PortScanner
|
|
||||||
{
|
|
||||||
|
|
||||||
[DllImport("iphlpapi.dll", SetLastError = true)]
|
|
||||||
private static extern uint GetExtendedTcpTable(
|
|
||||||
IntPtr pTcpTable,
|
|
||||||
ref int dwOutBufLen,
|
|
||||||
bool sort,
|
|
||||||
int ipVersion,
|
|
||||||
TCP_TABLE_CLASS tblClass,
|
|
||||||
uint reserved = 0);
|
|
||||||
|
|
||||||
private enum TCP_TABLE_CLASS
|
|
||||||
{
|
|
||||||
TCP_TABLE_BASIC_LISTENER,
|
|
||||||
TCP_TABLE_BASIC_CONNECTIONS,
|
|
||||||
TCP_TABLE_BASIC_ALL,
|
|
||||||
TCP_TABLE_OWNER_PID_LISTENER,
|
|
||||||
TCP_TABLE_OWNER_PID_CONNECTIONS,
|
|
||||||
TCP_TABLE_OWNER_PID_ALL,
|
|
||||||
TCP_TABLE_OWNER_MODULE_LISTENER,
|
|
||||||
TCP_TABLE_OWNER_MODULE_CONNECTIONS,
|
|
||||||
TCP_TABLE_OWNER_MODULE_ALL
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_TCPROW_OWNER_PID
|
|
||||||
{
|
|
||||||
public uint state;
|
|
||||||
public uint localAddr;
|
|
||||||
public uint localPort;
|
|
||||||
public uint remoteAddr;
|
|
||||||
public uint remotePort;
|
|
||||||
public uint owningPid;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_TCPTABLE_OWNER_PID
|
|
||||||
{
|
|
||||||
public uint dwNumEntries;
|
|
||||||
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
|
|
||||||
public MIB_TCPROW_OWNER_PID[] table;
|
|
||||||
}
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_TCP6ROW_OWNER_PID
|
|
||||||
{
|
|
||||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
|
||||||
public byte[] localAddr;
|
|
||||||
public uint localScopeId;
|
|
||||||
public uint localPort;
|
|
||||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
|
||||||
public byte[] remoteAddr;
|
|
||||||
public uint remoteScopeId;
|
|
||||||
public uint remotePort;
|
|
||||||
public uint state;
|
|
||||||
public uint owningPid;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_TCP6TABLE_OWNER_PID
|
|
||||||
{
|
|
||||||
public uint dwNumEntries;
|
|
||||||
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
|
|
||||||
public MIB_TCP6ROW_OWNER_PID[] table;
|
|
||||||
}
|
|
||||||
private enum UDP_TABLE_CLASS
|
|
||||||
{
|
|
||||||
UDP_TABLE_BASIC,
|
|
||||||
UDP_TABLE_OWNER_PID,
|
|
||||||
UDP_TABLE_OWNER_MODULE
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_UDP6ROW_OWNER_PID
|
|
||||||
{
|
|
||||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
|
||||||
public byte[] localAddr;
|
|
||||||
public uint localScopeId;
|
|
||||||
public uint localPort;
|
|
||||||
public uint owningPid;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_UDP6TABLE_OWNER_PID
|
|
||||||
{
|
|
||||||
public uint dwNumEntries;
|
|
||||||
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
|
|
||||||
public MIB_UDP6ROW_OWNER_PID[] table;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[DllImport("iphlpapi.dll", SetLastError = true)]
|
|
||||||
private static extern uint GetExtendedUdpTable(
|
|
||||||
IntPtr pUdpTable,
|
|
||||||
ref int dwOutBufLen,
|
|
||||||
bool sort,
|
|
||||||
int ipVersion,
|
|
||||||
UDP_TABLE_CLASS tblClass,
|
|
||||||
uint reserved = 0);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_UDPROW_OWNER_PID
|
|
||||||
{
|
|
||||||
public uint localAddr;
|
|
||||||
public uint localPort;
|
|
||||||
public uint owningPid;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
private struct MIB_UDPTABLE_OWNER_PID
|
|
||||||
{
|
|
||||||
public uint dwNumEntries;
|
|
||||||
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
|
|
||||||
public MIB_UDPROW_OWNER_PID[] table;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static string[] TcpStateStrings = new string[] {
|
|
||||||
"CLOSED", "LISTENING", "SYN_SENT", "SYN_RCVD",
|
|
||||||
"ESTABLISHED", "FIN_WAIT1", "FIN_WAIT2", "CLOSE_WAIT",
|
|
||||||
"CLOSING", "LAST_ACK", "TIME_WAIT", "DELETE_TCB"
|
|
||||||
};
|
|
||||||
private const int AF_INET = 2;
|
|
||||||
private const int AF_INET6 = 23;
|
|
||||||
|
|
||||||
public class internet_info
|
|
||||||
{
|
|
||||||
public string pid;
|
|
||||||
public string process;
|
|
||||||
public string local;
|
|
||||||
public string remote;
|
|
||||||
public string state;
|
|
||||||
public string protocal;
|
|
||||||
|
|
||||||
public internet_info(string pid, string process, string local, string remote, string state, string protocal)
|
|
||||||
{
|
|
||||||
this.pid = pid.Trim();
|
|
||||||
this.process = process.Trim();
|
|
||||||
this.local = local.Trim();
|
|
||||||
this.remote = remote.Trim();
|
|
||||||
this.state = state.Trim();
|
|
||||||
this.protocal = protocal.Trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static List<internet_info> internet_infolist = new List<internet_info>();
|
|
||||||
public static List<internet_info> GetAllInfo()
|
|
||||||
{
|
|
||||||
internet_infolist.Clear();
|
|
||||||
|
|
||||||
Console.WriteLine("IPv4 TCP Connections:");
|
|
||||||
ScanTcpPorts(AF_INET);
|
|
||||||
Console.WriteLine("\nIPv6 TCP Connections:");
|
|
||||||
ScanTcpPorts(AF_INET6);
|
|
||||||
Console.WriteLine("\nIPv4 UDP Connections:");
|
|
||||||
ScanUdpPorts(AF_INET);
|
|
||||||
Console.WriteLine("\nIPv6 UDP Connections:");
|
|
||||||
ScanUdpPorts(AF_INET6);
|
|
||||||
|
|
||||||
return internet_infolist;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ScanTcpPorts(int ipVersion)
|
|
||||||
{
|
|
||||||
IntPtr tcpTable = IntPtr.Zero;
|
|
||||||
int tcpTableSize = 0;
|
|
||||||
uint ret = GetExtendedTcpTable(
|
|
||||||
tcpTable,
|
|
||||||
ref tcpTableSize,
|
|
||||||
true,
|
|
||||||
ipVersion,
|
|
||||||
TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
|
|
||||||
|
|
||||||
if (ret != 0 && ret != 122) // ERROR_INSUFFICIENT_BUFFER
|
|
||||||
{
|
|
||||||
Console.WriteLine($"GetExtendedTcpTable failed: {ret}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
tcpTable = Marshal.AllocHGlobal(tcpTableSize);
|
|
||||||
ret = GetExtendedTcpTable(
|
|
||||||
tcpTable,
|
|
||||||
ref tcpTableSize,
|
|
||||||
true,
|
|
||||||
ipVersion,
|
|
||||||
TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
|
|
||||||
|
|
||||||
if (ret != 0)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"GetExtendedTcpTable failed: {ret}");
|
|
||||||
Marshal.FreeHGlobal(tcpTable);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ipVersion == AF_INET)
|
|
||||||
{
|
|
||||||
|
|
||||||
var table = Marshal.PtrToStructure<MIB_TCPTABLE_OWNER_PID>(tcpTable);
|
|
||||||
IntPtr rowPtr = (IntPtr)((long)tcpTable + Marshal.SizeOf(table.dwNumEntries));
|
|
||||||
|
|
||||||
for (int i = 0; i < table.dwNumEntries; i++)
|
|
||||||
{
|
|
||||||
var row = Marshal.PtrToStructure<MIB_TCPROW_OWNER_PID>(rowPtr);
|
|
||||||
string processName = GetProcessName((int)row.owningPid);
|
|
||||||
string localAddr = new IPAddress(row.localAddr).ToString();
|
|
||||||
string remoteAddr = row.remoteAddr != 0 ?
|
|
||||||
new IPAddress(row.remoteAddr).ToString() : "0.0.0.0";
|
|
||||||
ushort localPort = NetworkToHostPort(row.localPort);
|
|
||||||
ushort remotePort = NetworkToHostPort(row.remotePort);
|
|
||||||
|
|
||||||
Console.WriteLine(
|
|
||||||
$"PID: {row.owningPid,6} | " +
|
|
||||||
$"Process: {processName,-20} | " +
|
|
||||||
$"Local: {localAddr}:{localPort,-5} | " +
|
|
||||||
$"Remote: {remoteAddr}:{remotePort,-5} | " +
|
|
||||||
$"State: {TcpStateStrings[row.state]}");
|
|
||||||
|
|
||||||
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(typeof(MIB_TCPROW_OWNER_PID)));
|
|
||||||
|
|
||||||
internet_info ifo = new internet_info($"{row.owningPid,6}", $"{processName,-20}", $"{localAddr}:{localPort,-5}", $"{remoteAddr}:{remotePort,-5}", $"{TcpStateStrings[row.state]}", "tcpv4");
|
|
||||||
|
|
||||||
internet_infolist.Add(ifo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
var table = Marshal.PtrToStructure<MIB_TCP6TABLE_OWNER_PID>(tcpTable);
|
|
||||||
IntPtr rowPtr = (IntPtr)((long)tcpTable + Marshal.SizeOf(table.dwNumEntries));
|
|
||||||
|
|
||||||
for (int i = 0; i < table.dwNumEntries; i++)
|
|
||||||
{
|
|
||||||
var row = Marshal.PtrToStructure<MIB_TCP6ROW_OWNER_PID>(rowPtr);
|
|
||||||
string processName = GetProcessName((int)row.owningPid);
|
|
||||||
IPAddress localAddr = new IPAddress(row.localAddr, row.localScopeId);
|
|
||||||
IPAddress remoteAddr = new IPAddress(row.remoteAddr, row.remoteScopeId);
|
|
||||||
ushort localPort = NetworkToHostPort(row.localPort);
|
|
||||||
ushort remotePort = NetworkToHostPort(row.remotePort);
|
|
||||||
|
|
||||||
Console.WriteLine(
|
|
||||||
$"PID: {row.owningPid,6} | " +
|
|
||||||
$"Process: {processName,-20} | " +
|
|
||||||
$"Local: [{localAddr}]:{localPort,-5} | " +
|
|
||||||
$"Remote: [{remoteAddr}]:{remotePort,-5} | " +
|
|
||||||
$"State: {TcpStateStrings[row.state]}");
|
|
||||||
|
|
||||||
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(typeof(MIB_TCP6ROW_OWNER_PID)));
|
|
||||||
|
|
||||||
internet_info ifo = new internet_info($"{row.owningPid,6}", $"{processName,-20}", $"{localAddr}:{localPort,-5}", $"{remoteAddr}:{remotePort,-5}", $"{TcpStateStrings[row.state]}", "tcpv6");
|
|
||||||
|
|
||||||
internet_infolist.Add(ifo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Marshal.FreeHGlobal(tcpTable);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ScanUdpPorts(int ipVersion)
|
|
||||||
{
|
|
||||||
IntPtr udpTable = IntPtr.Zero;
|
|
||||||
int udpTableSize = 0;
|
|
||||||
uint ret = GetExtendedUdpTable(
|
|
||||||
udpTable,
|
|
||||||
ref udpTableSize,
|
|
||||||
true,
|
|
||||||
ipVersion,
|
|
||||||
UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
|
|
||||||
|
|
||||||
if (ret != 0 && ret != 122) // ERROR_INSUFFICIENT_BUFFER
|
|
||||||
{
|
|
||||||
Console.WriteLine($"GetExtendedUdpTable failed: {ret}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
udpTable = Marshal.AllocHGlobal(udpTableSize);
|
|
||||||
ret = GetExtendedUdpTable(
|
|
||||||
udpTable,
|
|
||||||
ref udpTableSize,
|
|
||||||
true,
|
|
||||||
ipVersion,
|
|
||||||
UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
|
|
||||||
|
|
||||||
if (ret != 0)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"GetExtendedUdpTable failed: {ret}");
|
|
||||||
Marshal.FreeHGlobal(udpTable);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ipVersion == AF_INET)
|
|
||||||
{
|
|
||||||
|
|
||||||
var table = Marshal.PtrToStructure<MIB_UDPTABLE_OWNER_PID>(udpTable);
|
|
||||||
IntPtr rowPtr = (IntPtr)((long)udpTable + Marshal.SizeOf(table.dwNumEntries));
|
|
||||||
|
|
||||||
for (int i = 0; i < table.dwNumEntries; i++)
|
|
||||||
{
|
|
||||||
var row = Marshal.PtrToStructure<MIB_UDPROW_OWNER_PID>(rowPtr);
|
|
||||||
string processName = GetProcessName((int)row.owningPid);
|
|
||||||
string localAddr = new IPAddress(row.localAddr).ToString();
|
|
||||||
ushort localPort = NetworkToHostPort(row.localPort);
|
|
||||||
|
|
||||||
Console.WriteLine(
|
|
||||||
$"PID: {row.owningPid,6} | " +
|
|
||||||
$"Process: {processName,-20} | " +
|
|
||||||
$"Local: {localAddr}:{localPort} | " +
|
|
||||||
$"State: LISTENING");
|
|
||||||
|
|
||||||
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(typeof(MIB_UDPROW_OWNER_PID)));
|
|
||||||
|
|
||||||
internet_info ifo = new internet_info($"{row.owningPid,6}", $"{processName,-20}", $"{localAddr}:{localPort,-5}", $"", $"", "udpv4");
|
|
||||||
|
|
||||||
internet_infolist.Add(ifo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
var table = Marshal.PtrToStructure<MIB_UDP6TABLE_OWNER_PID>(udpTable);
|
|
||||||
IntPtr rowPtr = (IntPtr)((long)udpTable + Marshal.SizeOf(table.dwNumEntries));
|
|
||||||
|
|
||||||
for (int i = 0; i < table.dwNumEntries; i++)
|
|
||||||
{
|
|
||||||
var row = Marshal.PtrToStructure<MIB_UDP6ROW_OWNER_PID>(rowPtr);
|
|
||||||
string processName = GetProcessName((int)row.owningPid);
|
|
||||||
IPAddress localAddr = new IPAddress(row.localAddr, row.localScopeId);
|
|
||||||
ushort localPort = NetworkToHostPort(row.localPort);
|
|
||||||
|
|
||||||
Console.WriteLine(
|
|
||||||
$"PID: {row.owningPid,6} | " +
|
|
||||||
$"Process: {processName,-20} | " +
|
|
||||||
$"Local: [{localAddr}]:{localPort} | " +
|
|
||||||
$"State: LISTENING");
|
|
||||||
|
|
||||||
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(typeof(MIB_UDP6ROW_OWNER_PID)));
|
|
||||||
|
|
||||||
internet_info ifo = new internet_info($"{row.owningPid,6}", $"{processName,-20}", $"{localAddr}:{localPort,-5}", $"", $"", "udpv6");
|
|
||||||
|
|
||||||
internet_infolist.Add(ifo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Marshal.FreeHGlobal(udpTable);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static ushort NetworkToHostPort(uint port)
|
|
||||||
{
|
|
||||||
byte[] bytes = BitConverter.GetBytes(port);
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
{
|
|
||||||
Array.Reverse(bytes, 0, 2);
|
|
||||||
}
|
|
||||||
return BitConverter.ToUInt16(bytes, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetProcessName(int pid)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Process process = Process.GetProcessById(pid);
|
|
||||||
return process.ProcessName;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return "N/A";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Binary file not shown.
@@ -1,15 +0,0 @@
|
|||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<WeaverRuntimeToken
|
|
||||||
Condition="$(MSBuildRuntimeType) != 'Core'">netclassicweaver</WeaverRuntimeToken>
|
|
||||||
<WeaverRuntimeToken
|
|
||||||
Condition="$(MSBuildRuntimeType) == 'Core'">netstandardweaver</WeaverRuntimeToken>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<WeaverFiles
|
|
||||||
Include="$(MsBuildThisFileDirectory)..\$(WeaverRuntimeToken)\$(MSBuildThisFileName).dll" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
|
|
||||||
<PropertyGroup Condition="$(CosturaRemoveCopyLocalFilesToPublish) == ''">
|
|
||||||
<CosturaRemoveCopyLocalFilesToPublish>true</CosturaRemoveCopyLocalFilesToPublish>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Target Name="CosturaRemoveAlreadyEmbeddedFilesFromPublish" AfterTargets="ComputeResolvedFilesToPublishList" Condition="$(CosturaRemoveCopyLocalFilesToPublish) == 'true'">
|
|
||||||
<ItemGroup>
|
|
||||||
<ResolvedFileToPublish Remove="@(FodyRemovedReferenceCopyLocalPaths)" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
Binary file not shown.
@@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<doc>
|
|
||||||
<assembly>
|
|
||||||
<name>Costura</name>
|
|
||||||
</assembly>
|
|
||||||
<members>
|
|
||||||
<member name="T:MethodTimeLogger">
|
|
||||||
<summary>
|
|
||||||
Note: do not rename this class or put it inside a namespace.
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="T:CosturaUtility">
|
|
||||||
<summary>
|
|
||||||
Contains methods for interacting with the Costura system.
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:CosturaUtility.Initialize">
|
|
||||||
<summary>
|
|
||||||
Call this to Initialize the Costura system.
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
</members>
|
|
||||||
</doc>
|
|
||||||
Binary file not shown.
@@ -1,115 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<xs:all>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
</xs:all>
|
|
||||||
<xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeRuntimeReferences" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="DisableCompression" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="DisableCleanup" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="ExcludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="PreloadOrder" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
</xs:complexType>
|
|
||||||
Binary file not shown.
@@ -1,115 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<xs:all>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
</xs:all>
|
|
||||||
<xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeRuntimeReferences" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="DisableCompression" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="DisableCleanup" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="ExcludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="IncludeRuntimeAssemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="PreloadOrder" type="xs:string">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
</xs:complexType>
|
|
||||||
Binary file not shown.
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) Simon Cropp
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user