Compare commits

...

81 Commits

Author SHA1 Message Date
zsyg
d54bd4c353 Add files via upload 2025-06-29 09:47:07 +08:00
zsyg
24198b2e09 Add files via upload 2025-06-29 09:46:39 +08:00
zsyg
0a0ef24497 Add files via upload 2025-06-29 09:46:05 +08:00
zsyg
96ab4bc726 添加innosetup脚本 2025-06-29 08:01:13 +08:00
zsyg
be87aaa0e6 Update README.md 2025-06-28 18:27:22 +08:00
zsyg
e8bef7e396 Update README.md 2025-06-28 18:23:41 +08:00
zsyg
7f06c9b6b1 Update README.md 2025-06-28 18:22:59 +08:00
zsyg
0137e43408 添加视频压缩代码 2025-06-28 16:10:13 +08:00
zsyg
3f88a5e5c7 上传视频压缩软件图标 2025-06-28 16:10:11 +08:00
zsyg
ba7ed20664 添加视频压缩程序 2025-06-28 16:09:12 +08:00
zsyg
336b3d3ed9 Add files via upload 2025-06-28 16:08:38 +08:00
zsyg
214a179923 Add files via upload 2025-06-28 13:23:21 +08:00
zsyg
fad8522b88 添加英文README.md 2025-06-28 12:11:31 +08:00
zsyg
337c1853c7 Create CODE_OF_CONDUCT.md 2025-06-28 12:07:38 +08:00
zsyg
cdb54b95c2 Update README.md 2025-06-28 12:04:37 +08:00
zsyg
021e89e3a4 添加系统信息查看器代码 2025-06-28 11:58:36 +08:00
zsyg
dcecf58f23 Add files via upload 2025-06-28 11:56:58 +08:00
zsyg
9b5257c67b Add files via upload 2025-06-28 11:56:26 +08:00
zsyg
90b191a939 Add files via upload 2025-06-28 11:56:04 +08:00
zsyg
4aedf9d97a Add files via upload 2025-06-28 09:05:46 +08:00
zsyg
d3667a2cc8 Add files via upload 2025-06-28 09:01:16 +08:00
zsyg
defd688323 Add files via upload 2025-06-28 09:00:49 +08:00
zsyg
6df4a9a534 添加内存锻炼器代码 2025-06-28 09:00:15 +08:00
zsyg
0efd3a9e32 Update README.md 2025-06-22 18:38:08 +08:00
zsyg
8efa2725aa Add files via upload 2025-06-22 17:46:21 +08:00
zsyg
6fc1ccc9a2 Add files via upload 2025-06-22 17:45:51 +08:00
zsyg
04b551c3c0 Add files via upload 2025-06-22 17:45:23 +08:00
zsyg
ef9a2df02c Add files via upload 2025-06-22 17:14:26 +08:00
zsyg
c25cd37755 Add files via upload 2025-06-22 12:10:39 +08:00
zsyg
6536e99eec Add files via upload 2025-06-22 12:10:19 +08:00
zsyg
0ac791653e Add files via upload 2025-06-22 12:09:14 +08:00
zsyg
45ca7909fd Add files via upload 2025-06-22 12:08:56 +08:00
zsyg
60b459c74a Create CONTRIBUTING.md 2025-06-22 11:20:48 +08:00
zsyg
295af72e4f Create SECURITY.md 2025-06-22 11:17:44 +08:00
zsyg
474f3ecfbc Update issue templates 2025-06-22 11:14:51 +08:00
zsyg
ab37a33443 Update README.md 2025-06-22 11:09:49 +08:00
zsyg
7f8a12c26a Update README.md 2025-06-22 11:03:21 +08:00
zsyg
0f50193705 Update README.md 2025-06-22 11:02:05 +08:00
zsyg
bc01dad692 Update README.md 2025-06-22 11:00:32 +08:00
zsyg
0b58ee3f2e Update README.md 2025-06-22 10:59:44 +08:00
zsyg
51974beaa8 Add files via upload 2025-06-22 10:41:46 +08:00
zsyg
9faa32e985 Add files via upload 2025-06-22 10:41:33 +08:00
zsyg
197f9ae76f Update README.md 2025-06-22 10:36:29 +08:00
zsyg
7d11096f8a Add files via upload 2025-06-22 10:35:17 +08:00
zsyg
f8d02d44c1 Add files via upload 2025-06-22 10:30:12 +08:00
zsyg
c22b653ce0 Add files via upload 2025-06-22 10:04:45 +08:00
zsyg
4b27d2e1dc 添加工具图标 2025-06-22 09:45:33 +08:00
zsyg
0f578d56d4 Add files via upload 2025-06-22 09:44:59 +08:00
zsyg
d36a367147 添加调用程序 2025-06-22 09:42:47 +08:00
zsyg
2c8ce29b3d 修改主要代码 2025-06-22 09:39:58 +08:00
zsyg
efe7d16f96 Add files via upload 2025-06-21 10:14:12 +08:00
zsyg
a5b60d7079 Add files via upload 2025-06-21 10:09:51 +08:00
zsyg
f8192063a4 Add files via upload 2025-06-21 10:08:50 +08:00
zsyg
cd1abd3e33 Add files via upload 2025-06-21 10:02:21 +08:00
zsyg
cc577948b7 Add files via upload 2025-06-21 10:00:38 +08:00
zsyg
0e550c746b Add files via upload 2025-06-20 21:02:53 +08:00
zsyg
7fb9b53e62 Add files via upload 2025-06-20 20:59:58 +08:00
zsyg
80ce2c6151 Add files via upload 2025-06-20 20:58:10 +08:00
zsyg
f2a2f48020 修复部分编译警告 2025-06-19 20:58:49 +08:00
zsyg
d85d2d67ea 添加关于界面 2025-06-18 20:33:12 +08:00
zsyg
532006297a Add files via upload 2025-06-18 20:32:45 +08:00
zsyg
8ccf566d88 修复资源文件链接问题 2025-06-18 20:31:45 +08:00
zsyg
5029b5b2b8 修复下载bug 2025-06-18 10:46:59 +08:00
zsyg
c0d366acdc Update README.md 2025-06-18 09:36:56 +08:00
zsyg
95b05612c9 完善声明文件 2025-06-18 09:34:57 +08:00
zsyg
144cbce13f Update README.md 2025-06-18 09:33:16 +08:00
zsyg
63d360072b Update README.md 2025-06-17 22:14:13 +08:00
zsyg
4f0d223579 Update README.md 2025-06-17 22:03:58 +08:00
zsyg
d11bb9bc79 Update README.md 2025-06-17 20:48:55 +08:00
zsyg
595a78473f Update README.md 2025-06-17 20:43:31 +08:00
zsyg
68873fb115 Add files via upload 2025-06-17 20:38:45 +08:00
zsyg
35b514e155 修改主程序,以C++为程序计算核心 2025-06-17 20:30:24 +08:00
zsyg
30f1c14b67 修改README.md 2025-06-15 19:57:55 +08:00
zsyg
749ff3a3ce 声明调用软件名字和下载链接 2025-06-15 18:22:00 +08:00
zsyg
3bae74dcbe Update README.md 2025-06-15 11:07:57 +08:00
zsyg
933333bfbf 修改alist为openlist 2025-06-15 11:07:16 +08:00
zsyg
da1e95a11c Add files via upload 2025-06-15 11:06:22 +08:00
zsyg
24a352f67b Add files via upload 2025-06-14 16:41:29 +08:00
zsyg
9dfa777c6d Update log_cleaner.cpp 2025-06-14 10:51:12 +08:00
zsyg
30d1c0c8c6 Update logger.cs 2025-06-14 10:50:39 +08:00
zsyg
efd2c615bc 修改主要程序 2025-06-14 10:05:11 +08:00
164 changed files with 6773 additions and 137 deletions

38
.github/ISSUE_TEMPLATE/bug反馈.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: Bug反馈
about: Create a report to help us improve
title: ''
labels: ''
assignees: zs-yg
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

10
.github/ISSUE_TEMPLATE/功能建议.md vendored Normal file
View File

@@ -0,0 +1,10 @@
---
name: 功能建议
about: 给我们一些修改建议
title: ''
labels: ''
assignees: ''
---

View File

@@ -0,0 +1,20 @@
---
name: "新功能添加请求\U0001F970\U0001F970\U0001F970"
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

141
AboutForm.cs Normal file
View File

@@ -0,0 +1,141 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace AppStore
{
public class AboutUserControl : UserControl
{
private PictureBox logo = null!;
private Label infoLabel = null!;
public AboutUserControl()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.Dock = DockStyle.Fill;
this.BackColor = Color.White;
this.Padding = new Padding(20);
// 创建主布局面板
TableLayoutPanel mainLayout = new TableLayoutPanel();
mainLayout.Dock = DockStyle.Fill;
mainLayout.ColumnCount = 1;
mainLayout.RowCount = 2;
mainLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
mainLayout.Padding = new Padding(0, 20, 0, 20);
// 初始化并添加应用图标
logo = new PictureBox();
try
{
logo.Image = Image.FromFile("img/png/kortapp-z.png");
}
catch (Exception ex)
{
Logger.LogError($"无法加载应用图标: {ex.Message}");
logo.Image = SystemIcons.Application.ToBitmap();
}
logo.SizeMode = PictureBoxSizeMode.Zoom;
logo.Width = 200;
logo.Height = 200;
logo.Anchor = AnchorStyles.None;
logo.Margin = new Padding(0, 0, 0, 20);
mainLayout.Controls.Add(logo, 0, 0);
// 初始化并添加应用信息
infoLabel = new Label();
infoLabel.Text = "kortapp-z\n版本: 1.0.8\n作者: zs-yg\n一个简单、开源的应用商店\nkortapp-z是完全免费\n基于.NET8和C/C++的软件";
infoLabel.Font = new Font("Microsoft YaHei", 12);
infoLabel.AutoSize = false;
infoLabel.Width = 300;
infoLabel.Height = 130; // 增加高度确保文字完整显示
infoLabel.TextAlign = ContentAlignment.MiddleCenter;
infoLabel.Anchor = AnchorStyles.None;
mainLayout.Controls.Add(infoLabel, 0, 1);
// 调整主布局为3行
mainLayout.RowCount = 3;
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
// 在底部添加GitHub链接区域
TableLayoutPanel githubPanel = new TableLayoutPanel();
githubPanel.Dock = DockStyle.Bottom;
githubPanel.Height = 60;
githubPanel.ColumnCount = 3;
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
githubPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
githubPanel.RowCount = 1;
githubPanel.Padding = new Padding(10);
// 添加GitHub图标
PictureBox githubIcon = new PictureBox();
try
{
githubIcon.Image = Image.FromFile("img/jpg/github.jpg");
}
catch (Exception ex)
{
Logger.LogError($"无法加载GitHub图标: {ex.Message}");
githubIcon.Image = SystemIcons.Application.ToBitmap();
}
githubIcon.SizeMode = PictureBoxSizeMode.Zoom;
githubIcon.Width = 30;
githubIcon.Height = 30;
githubIcon.Cursor = Cursors.Hand;
githubIcon.Click += (s, e) => {
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
{
FileName = "https://github.com/zs-yg/kortapp-z",
UseShellExecute = true
});
};
// 添加文字说明
Label githubLabel = new Label();
githubLabel.Text = "🤗🤗🤗开源地址 🌟 欢迎点star和提交pr 🚀";
githubLabel.Font = new Font("Microsoft YaHei", 10);
githubLabel.AutoSize = true;
githubLabel.Margin = new Padding(10, 0, 0, 0);
// 创建包含图标和文字的面板
Panel linkPanel = new Panel();
linkPanel.AutoSize = true;
linkPanel.Controls.Add(githubIcon);
linkPanel.Controls.Add(githubLabel);
githubIcon.Location = new Point(0, 0);
githubLabel.Location = new Point(githubIcon.Width + 10, 5);
// 将链接面板添加到中间列
githubPanel.Controls.Add(linkPanel, 1, 0);
this.Controls.Add(mainLayout);
this.Controls.Add(githubPanel);
}
}
// 保留原AboutForm作为容器(可选)
public class AboutForm : Form
{
public AboutForm()
{
this.Text = "关于 kortapp-z";
this.Size = new Size(500, 400);
this.StartPosition = FormStartPosition.CenterScreen;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
var aboutControl = new AboutUserControl();
this.Controls.Add(aboutControl);
}
}
}

View File

@@ -1,6 +1,11 @@
using System; using System;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Concurrent;
namespace AppStore namespace AppStore
{ {
@@ -9,53 +14,298 @@ namespace AppStore
private PictureBox iconBox; private PictureBox iconBox;
private Label nameLabel; private Label nameLabel;
private Button downloadBtn; private Button downloadBtn;
private static readonly ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath> PathCache =
new ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath>();
public string AppName { get; set; } = string.Empty; public string AppName { get; set; } = string.Empty;
public Image AppIcon { get; set; } = SystemIcons.Application.ToBitmap(); public Image AppIcon { get; set; } = SystemIcons.Application.ToBitmap();
public string DownloadUrl { get; set; } = string.Empty; public string DownloadUrl { get; set; } = string.Empty;
public bool ShowDownloadButton { get; set; } = true;
public AppCard() public AppCard()
{ {
iconBox = new PictureBox(); // 确保关键对象不为null
nameLabel = new Label(); iconBox = new PictureBox() { SizeMode = PictureBoxSizeMode.StretchImage };
downloadBtn = new Button(); nameLabel = new Label() { Text = string.Empty };
downloadBtn = new Button() { Text = "下载" };
// 确保DownloadManager已初始化
var _ = DownloadManager.Instance;
InitializeComponent(); InitializeComponent();
} }
private static readonly ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath> BorderCache =
new ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath>();
private void InitializeComponent() private void InitializeComponent()
{ {
this.Size = new Size(220, 180); this.Size = new Size(240, 200);
this.BackColor = Color.White; this.BackColor = Color.White;
this.BorderStyle = BorderStyle.FixedSingle; this.Padding = new Padding(10);
this.Padding = new Padding(5);
// 异步初始化卡片路径和边框
Task.Run(() => {
InitializeCardPath();
InitializeBorder();
});
// 应用图标 // 应用图标
iconBox = new PictureBox(); iconBox = new PictureBox();
iconBox.Size = new Size(64, 64); iconBox.Size = new Size(80, 80);
iconBox.Location = new Point(10, 10); iconBox.Location = new Point((Width - 80) / 2, 15);
iconBox.SizeMode = PictureBoxSizeMode.StretchImage; iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
this.Controls.Add(iconBox); this.Controls.Add(iconBox);
// 应用名称 // 应用名称
nameLabel = new Label(); nameLabel = new Label();
nameLabel.AutoSize = false; nameLabel.AutoSize = false;
nameLabel.Size = new Size(140, 60); nameLabel.Size = new Size(Width - 20, 40);
nameLabel.Location = new Point(80, 15); nameLabel.Location = new Point(10, 100);
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold); nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
nameLabel.TextAlign = ContentAlignment.TopLeft; nameLabel.TextAlign = ContentAlignment.MiddleCenter;
this.Controls.Add(nameLabel); this.Controls.Add(nameLabel);
// 下载按钮 // 下载按钮
downloadBtn = new Button(); downloadBtn = new Button();
downloadBtn.Text = "下载"; downloadBtn.Text = "下载";
downloadBtn.Size = new Size(80, 30); downloadBtn.Size = new Size(100, 32);
downloadBtn.Location = new Point(70, 120); downloadBtn.Location = new Point((Width - 100) / 2, 150);
downloadBtn.BackColor = Color.FromArgb(0, 120, 215); downloadBtn.BackColor = Color.FromArgb(0, 120, 215);
downloadBtn.ForeColor = Color.White; downloadBtn.ForeColor = Color.White;
downloadBtn.FlatStyle = FlatStyle.Flat; downloadBtn.FlatStyle = FlatStyle.Flat;
downloadBtn.FlatAppearance.BorderSize = 0; 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.Click += DownloadBtn_Click; downloadBtn.Click += DownloadBtn_Click;
this.Controls.Add(downloadBtn); this.Controls.Add(downloadBtn);
downloadBtn.Visible = ShowDownloadButton;
}
/// <summary>
/// 初始化卡片边框路径
/// 使用C++程序计算高性能边框路径并缓存结果
/// </summary>
private void InitializeBorder()
{
// 使用卡片尺寸作为缓存键
string cacheKey = $"{Width}_{Height}_10";
// 检查缓存中是否已有路径
if (!BorderCache.TryGetValue(cacheKey, out var borderPath))
{
// 创建临时文件存储路径数据
string tempFile = Path.GetTempFileName();
try
{
// 配置C++程序启动参数
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = Path.Combine(Application.StartupPath, "resource", "border_renderer.exe"),
Arguments = $"{Width} {Height} 10 \"{tempFile}\"", // 传递宽高和圆角半径
UseShellExecute = false, // 不显示命令行窗口
CreateNoWindow = true // 静默运行
};
// 启动C++程序计算路径
using (var process = Process.Start(startInfo))
{
process.WaitForExit();
// 检查计算结果
if (process.ExitCode == 0 && File.Exists(tempFile))
{
// 读取C++程序生成的路径点
var lines = File.ReadAllLines(tempFile);
PointF[] points = lines.Select(line => {
var parts = line.Split(','); // 解析坐标点
return new PointF(float.Parse(parts[0]), float.Parse(parts[1]));
}).ToArray();
// 创建GraphicsPath对象
borderPath = new System.Drawing.Drawing2D.GraphicsPath();
borderPath.AddLines(points); // 添加路径点
// 缓存路径对象
BorderCache.TryAdd(cacheKey, borderPath);
}
}
}
finally
{
// 确保临时文件被删除
if (File.Exists(tempFile))
{
File.Delete(tempFile);
}
}
}
}
// 边框和阴影效果
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 绘制背景
using (var brush = new SolidBrush(this.BackColor)) {
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
string cacheKey = $"{Width}_{Height}_10";
if (BorderCache.TryGetValue(cacheKey, out var borderPath))
{
try
{
// 绘制阴影
using (var shadowBrush = new SolidBrush(Color.FromArgb(20, 0, 0, 0))) {
e.Graphics.FillPath(shadowBrush, borderPath);
}
// 绘制边框(调整为蓝色系)
using (var pen = new Pen(Color.FromArgb(70, 130, 200), 4)) {
e.Graphics.DrawPath(pen, borderPath);
}
}
catch (Exception ex)
{
Debug.WriteLine($"边框绘制错误: {ex.Message}");
// 回退到简单矩形边框
using (var pen = new Pen(Color.FromArgb(100, 150, 220), 2)) {
e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, Width-1, Height-1));
}
}
}
else
{
// 缓存未命中时绘制默认边框
using (var pen = new Pen(Color.FromArgb(100, 150, 220), 2)) {
e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, Width-1, Height-1));
}
}
}
/// <summary>
/// 初始化卡片形状路径
/// 使用C++程序计算圆角矩形路径并缓存结果
/// </summary>
private void InitializeCardPath()
{
int radius = 10; // 圆角半径
string cacheKey = $"{Width}_{Height}_{radius}"; // 缓存键
// 检查缓存
if (!PathCache.TryGetValue(cacheKey, out var path))
{
string tempFile = Path.GetTempFileName(); // 临时文件路径
try {
// 配置C++程序启动参数
ProcessStartInfo startInfo = new ProcessStartInfo {
FileName = Path.Combine(Application.StartupPath, "resource", "card_calculator.exe"),
Arguments = $"{Width} {Height} {radius} {tempFile}", // 传递宽高半径和输出文件
UseShellExecute = false, // 不显示命令行窗口
CreateNoWindow = true // 静默运行
};
// 启动C++程序计算路径
using (var process = Process.Start(startInfo)) {
process.WaitForExit();
// 检查计算结果
if (process.ExitCode == 0 && File.Exists(tempFile)) {
// 读取生成的路径点
var lines = File.ReadAllLines(tempFile);
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 {
// C++程序失败时使用C#回退方案
path = CalculatePathFallback(Width, Height, radius);
} finally {
// 确保删除临时文件
if (File.Exists(tempFile)) {
File.Delete(tempFile);
}
}
}
// 应用计算好的路径 - 更严格的null检查和异常处理
try
{
var safePath = path ?? CalculatePathFallback(Width, Height, 10);
// 更严格的null检查包括路径和控件状态
if (safePath != null &&
safePath.PointCount > 0 &&
this.IsHandleCreated &&
!this.IsDisposed)
{
this.Invoke((MethodInvoker)delegate {
try
{
// 委托内部再次验证safePath
if (safePath != null && safePath.PointCount > 0)
{
var validPath = safePath; // 确保非null
using (var region = new Region(validPath))
{
this.Region = region;
this.Refresh();
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"创建Region失败: {ex.Message}");
this.Region = null;
this.Refresh();
}
});
}
}
catch (Exception ex)
{
Debug.WriteLine($"初始化卡片路径失败: {ex.Message}");
}
}
private System.Drawing.Drawing2D.GraphicsPath CalculatePathFallback(int width, int height, int radius)
{
try
{
var path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddArc(0, 0, radius * 2, radius * 2, 180, 90);
path.AddArc(width - radius * 2, 0, radius * 2, radius * 2, 270, 90);
path.AddArc(width - radius * 2, height - radius * 2, radius * 2, radius * 2, 0, 90);
path.AddArc(0, height - radius * 2, radius * 2, radius * 2, 90, 90);
path.CloseFigure();
return path;
}
catch
{
// 绝对回退方案 - 返回最小有效路径
var path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddRectangle(new Rectangle(0, 0, width, height));
return path;
}
} }
public void UpdateDisplay() public void UpdateDisplay()
@@ -65,20 +315,40 @@ namespace AppStore
} }
private void DownloadBtn_Click(object sender, EventArgs e) private void DownloadBtn_Click(object sender, EventArgs e)
{
if (sender == null || e == null) return;
if (!string.IsNullOrEmpty(DownloadUrl))
{ {
try try
{ {
string fileName = $"{AppName.Replace(" ", "_")}.exe"; // 更严格的null检查
// 更严格的null检查包括DownloadManager.Instance和其方法
// 全面的null和状态检查
if (sender == null || e == null ||
string.IsNullOrWhiteSpace(DownloadUrl) ||
string.IsNullOrWhiteSpace(AppName) ||
!this.IsHandleCreated ||
this.IsDisposed ||
DownloadManager.Instance == null ||
DownloadManager.Instance.DownloadItems == null ||
DownloadManager.Instance.StartDownload == null)
{
return;
}
string safeAppName = AppName ?? "未知应用";
string fileName = $"{safeAppName.Replace(" ", "_")}.exe";
DownloadManager.Instance.StartDownload(fileName, DownloadUrl); DownloadManager.Instance.StartDownload(fileName, DownloadUrl);
MessageBox.Show($"已开始下载: {AppName}", "下载中", MessageBoxButtons.OK, MessageBoxIcon.Information);
string message = $"已开始下载: {safeAppName}";
this.Invoke((MethodInvoker)delegate {
MessageBox.Show(this, message, "下载中", MessageBoxButtons.OK, MessageBoxIcon.Information);
});
} }
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show($"下载失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); Debug.WriteLine($"下载按钮点击处理失败: {ex.Message}");
} this.Invoke((MethodInvoker)delegate {
MessageBox.Show(this, "下载处理发生错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
});
} }
} }
} }

View File

@@ -16,13 +16,19 @@
<ItemGroup> <ItemGroup>
<None Include="help.txt" /> <None Include="help.txt" />
<None Include="resource\aria2c.exe"> <None Include="resource\*.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="img\png\WindowsCleaner.png"> <None Include="img\png\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="img\ico\icon.ico"> <None Include="img\jpg\*.jpg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="img\resource\png\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="img\ico\*.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
</ItemGroup> </ItemGroup>

128
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, 和 experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, 和 sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, 和 personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
3872006562.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

12
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,12 @@
# 贡献准则
你可以进行任何(确保安全的前提下)的修改
我会对贡献进行审核,速度很快的
我会定时查看PR
你可以通过Fork到自己的仓库
然后上传软件图标,修改代码
然后提PR
你就可以做出贡献了
当然你也可以进行其他形式的修改
Remeber it!整个世界都在为你而闪耀

View File

@@ -2,6 +2,7 @@ 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.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
@@ -9,6 +10,16 @@ namespace AppStore
{ {
public class DownloadManager public class DownloadManager
{ {
[DllImport("shell32.dll")]
private static extern int SHGetKnownFolderPath(
[MarshalAs(UnmanagedType.LPStruct)] Guid rfid,
uint dwFlags,
IntPtr hToken,
out IntPtr ppszPath);
private static DownloadManager instance = null!; private static DownloadManager instance = null!;
public static DownloadManager Instance => instance ??= new DownloadManager(); public static DownloadManager Instance => instance ??= new DownloadManager();
@@ -77,11 +88,36 @@ namespace AppStore
try try
{ {
// 设置下载目录为用户文件夹中的Downloads // 设置下载目录为用户文件夹中的Downloads
var downloadsDir = Path.Combine( // 获取系统下载文件夹路径
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), // 获取系统下载文件夹路径
"Downloads"); string downloadsDir;
IntPtr pathPtr = IntPtr.Zero;
try
{
// 使用SHGetKnownFolderPath API获取下载文件夹
var downloadsFolderGuid = new Guid("374DE290-123F-4565-9164-39C4925E467B");
if (SHGetKnownFolderPath(downloadsFolderGuid, 0, IntPtr.Zero, out pathPtr) != 0)
{
throw new Exception("无法获取下载文件夹路径");
}
downloadsDir = Marshal.PtrToStringUni(pathPtr);
}
catch
{
throw new Exception("无法确定下载文件夹位置,请手动指定下载路径");
}
finally
{
if (pathPtr != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(pathPtr);
}
}
Directory.CreateDirectory(downloadsDir); Directory.CreateDirectory(downloadsDir);
// 构建aria2c路径 // 构建aria2c路径
var aria2cPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "resource", "aria2c.exe"); var aria2cPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "resource", "aria2c.exe");
@@ -95,7 +131,7 @@ namespace AppStore
var uri = new Uri(url); var uri = new Uri(url);
var originalFileName = Path.GetFileName(uri.LocalPath); var originalFileName = Path.GetFileName(uri.LocalPath);
var arguments = $"--out=\"{originalFileName}\" --dir=\"{downloadsDir}\" --split=16 --max-connection-per-server=16 {url}"; var arguments = $"--out=\"{originalFileName}\" --dir=\"{downloadsDir}\" --split=16 --max-connection-per-server=16 {url}";
Console.WriteLine($"下载目录: {downloadsDir}");
currentProcess = new Process currentProcess = new Process
{ {
@@ -134,7 +170,7 @@ namespace AppStore
{ {
if (!string.IsNullOrEmpty(e.Data)) if (!string.IsNullOrEmpty(e.Data))
{ {
Console.WriteLine($"输出: {e.Data}");
// 重置超时计时器 // 重置超时计时器
progressTimer.Stop(); progressTimer.Stop();
@@ -147,7 +183,7 @@ namespace AppStore
.Split('(')[0].Trim(); .Split('(')[0].Trim();
if (long.TryParse(sizeStr, out totalSize)) if (long.TryParse(sizeStr, out totalSize))
{ {
Console.WriteLine($"检测到文件总大小: {totalSize} bytes");
} }
} }
@@ -175,7 +211,7 @@ namespace AppStore
{ {
if (!string.IsNullOrEmpty(e.Data)) if (!string.IsNullOrEmpty(e.Data))
{ {
Console.WriteLine($"错误: {e.Data}");
downloadItem.Status = $"错误: {e.Data}"; downloadItem.Status = $"错误: {e.Data}";
DownloadProgressChanged?.Invoke(downloadItem); DownloadProgressChanged?.Invoke(downloadItem);
} }
@@ -202,11 +238,11 @@ namespace AppStore
if (File.Exists(downloadPath)) if (File.Exists(downloadPath))
{ {
Console.WriteLine($"文件下载完成: {downloadPath}");
} }
else else
{ {
Console.WriteLine("警告: 下载完成但文件不存在");
} }
// 触发界面更新 // 触发界面更新
@@ -222,7 +258,7 @@ namespace AppStore
var mainForm = Application.OpenForms[0]; var mainForm = Application.OpenForms[0];
mainForm.Invoke((MethodInvoker)delegate { mainForm.Invoke((MethodInvoker)delegate {
MessageBox.Show(mainForm, MessageBox.Show(mainForm,
$"文件 {downloadItem.FileName} 已成功下载到:\n{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", downloadItem.FileName)}", $"文件 {downloadItem.FileName} 已成功下载到:\n{Path.Combine(downloadsDir, downloadItem.FileName)}",
"下载完成", "下载完成",
MessageBoxButtons.OK, MessageBoxButtons.OK,
MessageBoxIcon.Information); MessageBoxIcon.Information);
@@ -230,12 +266,11 @@ namespace AppStore
} }
else else
{ {
Console.WriteLine("下载完成提示:无法找到主窗体");
} }
} }
catch (Exception ex) catch
{ {
Console.WriteLine($"显示下载完成提示时出错:{ex}");
} }
} }
else else
@@ -263,8 +298,7 @@ namespace AppStore
downloadItem.UpdateDisplay(); downloadItem.UpdateDisplay();
}; };
Console.WriteLine($"启动aria2c: {aria2cPath}");
Console.WriteLine($"参数: {arguments}");
if (!currentProcess.Start()) if (!currentProcess.Start())
{ {
@@ -278,8 +312,8 @@ namespace AppStore
catch (Exception ex) catch (Exception ex)
{ {
downloadItem.Status = $"下载错误: {ex.Message}"; downloadItem.Status = $"下载错误: {ex.Message}";
Console.WriteLine($"下载错误: {ex}");
DownloadCompleted?.Invoke(downloadItem); DownloadCompleted?.Invoke(downloadItem);
} }
} }
@@ -304,7 +338,6 @@ namespace AppStore
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine($"取消下载时出错: {ex}");
item.Status = $"取消失败: {ex.Message}"; item.Status = $"取消失败: {ex.Message}";
DownloadProgressChanged?.Invoke(item); DownloadProgressChanged?.Invoke(item);
} }

BIN
ImageCompressor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 KiB

190
ImageCompressorForm.cs Normal file
View File

@@ -0,0 +1,190 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace AppStore
{
public class ImageCompressorForm : Form
{
private Button btnSelectInput = new Button();
private Button btnSelectOutput = new Button();
private Button btnCompress = new Button();
private TextBox txtInput = new TextBox();
private TextBox txtOutput = new TextBox();
private RadioButton rbLossy = new RadioButton();
private RadioButton rbLossless = new RadioButton();
private TrackBar tbQuality = new TrackBar();
private Label lblQuality = new Label();
private CheckBox cbKeepExif = new CheckBox();
private ProgressBar progressBar = new ProgressBar();
public ImageCompressorForm()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.Text = "图片压缩工具";
this.Size = new Size(500, 350);
this.StartPosition = FormStartPosition.CenterScreen;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
// 输入文件选择
btnSelectInput.Text = "选择...";
btnSelectInput.Location = new Point(400, 20);
btnSelectInput.Click += (s, e) => SelectFile(txtInput);
this.Controls.Add(btnSelectInput);
txtInput.Location = new Point(20, 20);
txtInput.Size = new Size(370, 20);
txtInput.ReadOnly = true;
this.Controls.Add(txtInput);
Label lblInput = new Label();
lblInput.Text = "输入文件:";
lblInput.Location = new Point(20, 0);
this.Controls.Add(lblInput);
// 输出文件选择
btnSelectOutput.Text = "选择...";
btnSelectOutput.Location = new Point(400, 70);
btnSelectOutput.Click += (s, e) => SelectFile(txtOutput, true);
this.Controls.Add(btnSelectOutput);
txtOutput.Location = new Point(20, 70);
txtOutput.Size = new Size(370, 20);
this.Controls.Add(txtOutput);
Label lblOutput = new Label();
lblOutput.Text = "输出文件:";
lblOutput.Location = new Point(20, 50);
this.Controls.Add(lblOutput);
// 压缩类型
rbLossy.Text = "有损压缩 (JPEG)";
rbLossy.Location = new Point(20, 110);
rbLossy.Checked = true;
this.Controls.Add(rbLossy);
rbLossless.Text = "无损压缩 (PNG)";
rbLossless.Location = new Point(20, 135);
this.Controls.Add(rbLossless);
// 质量设置
tbQuality.Minimum = 1;
tbQuality.Maximum = 1000;
tbQuality.Value = 800;
tbQuality.Location = new Point(20, 190);
tbQuality.Size = new Size(300, 50);
tbQuality.Scroll += (s, e) => lblQuality.Text = $"压缩质量: {tbQuality.Value}";
this.Controls.Add(tbQuality);
lblQuality.Text = $"压缩质量: {tbQuality.Value}";
lblQuality.Location = new Point(20, 170);
this.Controls.Add(lblQuality);
// EXIF选项
cbKeepExif.Text = "保留EXIF信息";
cbKeepExif.Location = new Point(20, 240);
this.Controls.Add(cbKeepExif);
// 压缩按钮
btnCompress.Text = "开始压缩";
btnCompress.Location = new Point(20, 280);
btnCompress.Size = new Size(460, 30);
btnCompress.Click += BtnCompress_Click;
this.Controls.Add(btnCompress);
// 调整窗体大小
this.Size = new Size(500, 370);
}
private void SelectFile(TextBox target, bool isSave = false)
{
var dialog = isSave ? new SaveFileDialog() : new OpenFileDialog() as FileDialog;
dialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.bmp|所有文件|*.*";
if (dialog.ShowDialog() == DialogResult.OK)
{
target.Text = dialog.FileName;
}
}
private void BtnCompress_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtInput.Text) || !File.Exists(txtInput.Text))
{
MessageBox.Show("请选择有效的输入文件", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (string.IsNullOrEmpty(txtOutput.Text))
{
MessageBox.Show("请指定输出文件", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
btnCompress.Enabled = false;
try
{
string toolPath = Path.Combine(Application.StartupPath, "resource", "image_compressor.exe");
if (!File.Exists(toolPath))
{
MessageBox.Show("图片压缩工具未找到", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
string args = $"\"{txtInput.Text}\" \"{txtOutput.Text}\"";
args += $" -t {(rbLossy.Checked ? "lossy" : "lossless")}";
args += $" -q {tbQuality.Value}";
if (cbKeepExif.Checked) args += " -e";
var process = new Process();
process.StartInfo.FileName = toolPath;
process.StartInfo.Arguments = args;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.OutputDataReceived += (s, ev) => {
if (!string.IsNullOrEmpty(ev.Data))
Console.WriteLine(ev.Data);
};
process.ErrorDataReceived += (s, ev) => {
if (!string.IsNullOrEmpty(ev.Data))
Console.Error.WriteLine(ev.Data);
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
if (process.ExitCode == 0)
{
MessageBox.Show("图片压缩完成", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("图片压缩失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
MessageBox.Show($"压缩过程中发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
btnCompress.Enabled = true;
progressBar.Visible = false;
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,9 +2,22 @@
小立一个flag从不接受广告不停更新 小立一个flag从不接受广告不停更新
![image](https://github.com/user-attachments/assets/7c269d0c-b008-43eb-af19-91d1bacbd360) ## 项目开源行为
1. 项目代码开源,允许任何人使用、修改、分发、商用,但必须注明原作者。
2. 项目文档开源,允许任何人使用、修改、分发、商用,但必须注明原作者。
3. 项目图标、截图等资源开源,允许任何人使用、修改、分发、商用,但必须注明原作者。
4. 项目的任何衍生品包括但不限于网站、APP、插件等必须遵循以上开源协议。
5. 项目不接受任何形式的广告,不得在任何地方投放广告。
6. 项目不接受任何形式的捐赠。
7. 项目不接受任何形式的赞助。
8. 项目可以进行PR欢迎任何形式的PR不提交issue也可以
9. 本项目可以PR一些你自己的项目如果star数量不到1k都会被删除
## 项目简介
一个简单的Windows应用商店应用提供软件下载和管理功能。 一个简单的Windows应用商店应用提供软件下载和管理功能。
提供软件管理、下载管理、内置工具使用等功能
## 功能特点 ## 功能特点
@@ -12,6 +25,7 @@
- 下载进度管理 - 下载进度管理
- 支持后台下载 - 支持后台下载
- 美观的应用卡片展示 - 美观的应用卡片展示
- 功能化、结构化的代码处理
## 构建与打包 ## 构建与打包
@@ -43,7 +57,7 @@ bin\Release\net8.0-windows\[platform]\publish
## 项目结构 ## 项目结构
``` ```
AppStore/ kortapp-z/
├── MainForm.cs # 主窗体逻辑 ├── MainForm.cs # 主窗体逻辑
├── DownloadManager.cs # 下载管理 ├── DownloadManager.cs # 下载管理
├── AppCard.cs # 应用卡片控件 ├── AppCard.cs # 应用卡片控件
@@ -64,12 +78,30 @@ AppStore/
MIT License MIT License
Copyright (c) 2025 kortapp-z项目组 Copyright (c) 2025 zsyg
## 其他网站
gitee镜像仓库:https://gitee.com/chr_super/kortapp-z (目前已经停止维护)
## 维护 ## 维护
由于gitee我没怎么用而且操作麻烦gitee镜像将不会继续同步有懂得人可以帮我搞下镜像吗qq 3872006562也可以b站直接私信我会在readme中鸣谢的谢谢各位
由于和Daye发生了矛盾所以windowscleaner将永远不上架我要自己努力
提示由于github上传文件的限制img/png/NET.png请改名为.NET.png否则程序可能出现无法预料的问题
每一个人都可以通过PR添加属于自己的合法软件 每一个人都可以通过PR添加属于自己的合法软件
作者邮箱:
```
3872006562@qq.com
```
作者qq号:
```
3872006562
```
qq群 qq群
``` ```
1043867176 1043867176

135
README/de-DE_README.md Normal file
View File

@@ -0,0 +1,135 @@
# Kortapp-z - Windows App Store
**Open-Source, kostenlos, werbefrei**
Grundsatz: Keine Werbung, kontinuierliche Updates
## Open-Source-Richtlinien
1. **Open-Source-Code**: Nutzung, Modifikation, Verbreitung und kommerzielle Nutzung erlaubt, mit Pflicht zur Nennung des Originalautors.
2. **Open-Source-Dokumentation**: Gleiche Bedingungen wie für Code.
3. **Open-Source-Ressourcen** (Icons, Screenshots): Gleiche Bedingungen.
4. Alle abgeleiteten Produkte (Websites, Apps, Erweiterungen etc.) müssen diese Lizenz einhalten.
5. **Keine Werbung** in keiner Form.
6. **Keine Spenden** werden angenommen.
7. **Keine Sponsoring** wird angenommen.
8. **Pull Requests (PR) sind willkommen**, auch ohne vorheriges Issue.
9. Eigene Projekte können per PR eingereicht werden, aber solche mit unter **1000 Stars** werden gelöscht.
## Projektbeschreibung
Eine einfache Windows-App zum Herunterladen und Verwalten von Software.
**Hauptfunktionen:**
- Softwareverwaltung
- Download-Manager
- Integrierte Tools
## Hauptmerkmale
- Minimalistische Download-Oberfläche
- Download-Fortschrittsverfolgung
- Hintergrund-Downloads
- Visuell ansprechende App-Karten
- Sauberer und strukturierter Code
## Build und Packaging
### Systemanforderungen
- **.NET 8.0 SDK**
- **Windows 10/11**
### Build-Befehle
#### 32-Bit-Version
```bash
dotnet publish -c Release -r win-x86 -p:PublishSingleFile=true
```
#### 64-Bit-Version
```bash
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true
```
Erstellte Dateien werden unter folgendem Pfad abgelegt:
```
bin\Release\net8.0-windows\[Plattform]\publish
```
### Zusätzliche Optionen
- `--self-contained true` eigenständige Builds (größere Dateien)
- `-p:PublishTrimmed=true` Größenreduzierung (experimentell)
## Projektstruktur
```
kortapp-z/
├── MainForm.cs # Hauptfenster-Logik
├── DownloadManager.cs # Download-Manager
├── AppCard.cs # App-Karte
├── DownloadItem.cs # Download-Element
├── img/ # Grafiken
│ ├── ico/ # Icons
│ └── png/ # Screenshots
└── resource/ # Ressourcen
└── aria2c.exe # Download-Tool
```
## Laufzeitanforderungen
- **.NET 8.0 Runtime** (bei Framework-abhängiger Build)
- **Windows 10 oder neuer**
## Lizenz
**MIT License**
Copyright (c) 2025 zsyg
## Andere Plattformen
**Gitee-Mirror**: [https://gitee.com/chr_super/kortapp-z](https://gitee.com/chr_super/kortapp-z) (nicht mehr gewartet)
## Wartung
Der Gitee-Repository wird nicht mehr synchronisiert. Hilfe beim Mirroring ist willkommen:
- **QQ**: 3872006562
- **Bilibili (Direktnachricht)**: Zayisynth
**Wichtig:**
- Aufgrund eines Konflikts mit Daye wird **windowscleaner** nie hinzugefügt.
- Benennen Sie `img/png/NET.png` in `.NET.png` um, um Fehler zu vermeiden (GitHub-Beschränkungen).
## Mitwirken
Jeder kann legale Software per Pull Request vorschlagen.
## Kontakt
📧 **Email**:
```
3872006562@qq.com
```
📱 **QQ**:
```
3872006562
```
👥 **QQ-Gruppe**:
```
1043867176
```
🎥 **Bilibili**:
```
Zayisynth
```
---
### Wie sollte die deutsche README benannt werden?
Empfohlene Optionen:
1. **de-DE_README.md** (IETF-Standard)
2. **README_de.md** (kürzere Variante)
3. **DE_README.md** (explizite Sprachkennung)
Am besten halten Sie sich an das Format `[Sprachcode]_README.md`, wie bei anderen Übersetzungen.

123
README/fr-FR_README.md Normal file
View File

@@ -0,0 +1,123 @@
# Kortapp-z - Microsoft Store -- Logiciel open source, gratuit et sans publicité
Engagement : aucune publicité acceptée, mises à jour continues
## Politique open source
1. Code open source : utilisation, modification, distribution et usage commercial autorisés, avec mention de l'auteur original obligatoire.
2. Documentation open source : mêmes conditions que le code.
3. Ressources graphiques (icônes, captures d'écran) open source : mêmes conditions.
4. Tout produit dérivé (sites web, apps, extensions...) doit respecter cette licence.
5. Aucune publicité n'est acceptée, sous aucune forme.
6. Aucun don n'est accepté.
7. Aucun sponsoring n'est accepté.
8. Les Pull Requests (PR) sont bienvenues, même sans issue préalable.
9. Vous pouvez soumettre vos projets via PR, mais ceux avec moins de 1k stars seront supprimés.
## Présentation
Une application simple de boutique Windows pour télécharger et gérer des logiciels.
Fonctionnalités :
- Gestion de logiciels
- Gestion de téléchargements
- Outils intégrés
## Fonctionnalités clés
- Interface épurée pour le téléchargement
- Gestion de la progression des téléchargements
- Téléchargements en arrière-plan
- Présentation sous forme de cartes visuelles
- Code structuré et modulaire
## Compilation et packaging
### Prérequis
- SDK .NET 8.0
- Windows 10/11
### Commandes
#### Version 32-bit
```bash
dotnet publish -c Release -r win-x86 -p:PublishSingleFile=true
```
#### Version 64-bit
```bash
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true
```
Fichiers générés :
```
bin\Release\net8.0-windows\[platform]\publish
```
### Options avancées
- `--self-contained true` : package autonome (taille plus importante)
- `-p:PublishTrimmed=true` : réduction de taille (expérimental)
## Structure du projet
```
kortapp-z/
├── MainForm.cs # Logique de la fenêtre principale
├── DownloadManager.cs # Gestion des téléchargements
├── AppCard.cs # Contrôle des cartes d'applications
├── DownloadItem.cs # Contrôle des éléments de téléchargement
├── img/ # Ressources visuelles
│ ├── ico/ # Icônes
│ └── png/ # Captures d'écran
└── resource/ # Fichiers ressources
└── aria2c.exe # Outil de téléchargement
```
## Prérequis d'exécution
- Runtime .NET 8.0 (si version dépendante du framework)
- Windows 10 ou supérieur
## Licence
MIT License
Copyright (c) 2025 zsyg
## Autres plateformes
Dépôt miroir Gitee : https://gitee.com/chr_super/kortapp-z (maintenance arrêtée)
## Maintenance
Le dépôt Gitee n'étant plus maintenu par manque d'utilisation, toute aide pour la synchronisation est bienvenue.
Contact : QQ 3872006562 ou message privé sur Bilibili (mention dans le README en remerciement).
Note : Suite à un conflit avec Daye, l'application windowscleaner ne sera jamais publiée ici.
Important : Renommez `img/png/NET.png` en `.NET.png` pour éviter des problèmes (limitations GitHub).
## Contributions
Tout utilisateur peut ajouter des logiciels légaux via PR.
## Contacts
Email :
```
3872006562@qq.com
```
QQ :
```
3872006562
```
Groupe QQ :
```
1043867176
```
Compte Bilibili :
```
Zayisynth
```

135
README/ru-RU_README.md Normal file
View File

@@ -0,0 +1,135 @@
# Kortapp-z — Магазин приложений Windows
**Открытое ПО, бесплатно, без рекламы**
Обещание: никакой рекламы, постоянные обновления
## Политика открытого кода
1. **Открытый исходный код**: можно использовать, изменять, распространять и применять в коммерческих целях с обязательным указанием автора.
2. **Открытая документация**: те же условия, что и для кода.
3. **Открытые ресурсы** (иконки, скриншоты): те же условия.
4. Все производные продукты (сайты, приложения, расширения и т. д.) должны соблюдать эту лицензию.
5. **Никакой рекламы** — ни в какой форме.
6. **Не принимаются пожертвования**.
7. **Не принимается спонсорская поддержка**.
8. **Pull Requests (PR) приветствуются**, даже без предварительного issue.
9. Можно предлагать свои проекты через PR, но те, у которых меньше **1000 звёзд**, будут удалены.
## Описание проекта
Простое приложение для Windows, позволяющее скачивать и управлять программами.
**Основные функции:**
- Управление установленными приложениями
- Менеджер загрузок
- Встроенные инструменты
## Ключевые особенности
- Минималистичный интерфейс загрузки
- Отслеживание прогресса загрузки
- Фоновые загрузки
- Красивые карточки приложений
- Чистый и структурированный код
## Сборка и упаковка
### Системные требования
- **.NET 8.0 SDK**
- **Windows 10/11**
### Команды сборки
#### 32-битная версия
```bash
dotnet publish -c Release -r win-x86 -p:PublishSingleFile=true
```
#### 64-битная версия
```bash
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true
```
Собранные файлы появятся в:
```
bin\Release\net8.0-windows\[платформа]\publish
```
### Дополнительные опции
- `--self-contained true` — автономная сборка (больший размер)
- `-p:PublishTrimmed=true` — уменьшение размера (экспериментально)
## Структура проекта
```
kortapp-z/
├── MainForm.cs # Логика главного окна
├── DownloadManager.cs # Менеджер загрузок
├── AppCard.cs # Карточка приложения
├── DownloadItem.cs # Элемент загрузки
├── img/ # Графика
│ ├── ico/ # Иконки
│ └── png/ # Скриншоты
└── resource/ # Ресурсы
└── aria2c.exe # Утилита загрузки
```
## Требования для запуска
- **.NET 8.0 Runtime** (если используется зависимая сборка)
- **Windows 10 или новее**
## Лицензия
**MIT License**
Copyright (c) 2025 zsyg
## Другие платформы
**Зеркало на Gitee**: [https://gitee.com/chr_super/kortapp-z](https://gitee.com/chr_super/kortapp-z) (поддержка прекращена)
## Поддержка
Репозиторий на Gitee больше не синхронизируется. Если кто-то может помочь с зеркалированием — пишите:
- **QQ**: 3872006562
- **Bilibili (личные сообщения)**: Zayisynth
**Важно**:
- Из-за конфликта с Daye приложение **windowscleaner** никогда не будет добавлено.
- Переименуйте `img/png/NET.png` в `.NET.png`, иначе возможны ошибки (ограничения GitHub).
## Участие
Любой может предложить легальное ПО через Pull Request.
## Контакты
📧 **Email**:
```
3872006562@qq.com
```
📱 **QQ**:
```
3872006562
```
👥 **QQ-группа**:
```
1043867176
```
🎥 **Bilibili**:
```
Zayisynth
```
---
### Как назвать файл README на русском?
Рекомендуемые варианты:
1. **ru-RU_README.md** (стандартный IETF-код)
2. **README_ru.md** (более короткий вариант)
3. **RUS_README.md** (если предпочитаете явное обозначение)
Лучше всего придерживаться формата `[язык]_README.md`, как в других переводах.

7
SECURITY.md Normal file
View File

@@ -0,0 +1,7 @@
# 安全准则
# 安全提醒
应用商店的软件我们无法保证绝对性的安全
在下载和使用、安装之前请为该软件做足充足的功课
如果出现系统无法打开,我们无法负责,只能悲哀

53
SettingsForm.cs Normal file
View File

@@ -0,0 +1,53 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace AppStore
{
public class SettingsUserControl : UserControl
{
private Button btnCleanLogs;
public SettingsUserControl()
{
this.Dock = DockStyle.Fill;
this.BackColor = Color.White;
// 设置顶部内边距
this.Padding = new Padding(0, 30, 0, 0);
btnCleanLogs = new Button();
btnCleanLogs.Text = "清理日志";
btnCleanLogs.Size = new Size(150, 40);
btnCleanLogs.Location = new Point((this.Width - 150) / 2, 50); // 调整Y坐标为50靠近顶部
btnCleanLogs.Font = new Font("Microsoft YaHei", 10);
btnCleanLogs.Anchor = AnchorStyles.Top; // 添加顶部锚点
btnCleanLogs.Click += (s, e) => CleanLogs();
this.Controls.Add(btnCleanLogs);
}
private void CleanLogs()
{
try
{
string logCleanerPath = Path.Combine("resource", "log_cleaner.exe");
if (File.Exists(logCleanerPath))
{
Process.Start(logCleanerPath);
MessageBox.Show("日志清理程序已启动", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("日志清理程序未找到", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
Logger.LogError("清理日志时出错", ex);
MessageBox.Show($"清理日志时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

77
ToolCard.cs Normal file
View File

@@ -0,0 +1,77 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace AppStore
{
public class ToolCard : UserControl
{
private PictureBox iconBox = new PictureBox();
private Label nameLabel = new Label();
public string ToolName { get; set; } = string.Empty;
public Image ToolIcon { get; set; } = SystemIcons.Shield.ToBitmap();
// 自定义点击事件初始化为空委托
public event EventHandler ToolCardClicked = delegate {};
public ToolCard()
{
// 启用双缓冲
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw, true);
InitializeComponent();
}
private void InitializeComponent()
{
this.Size = new Size(240, 220);
this.BackColor = Color.White;
this.Padding = new Padding(5);
this.BorderStyle = BorderStyle.FixedSingle;
// 工具图标
iconBox = new PictureBox();
iconBox.Size = new Size(80, 80);
iconBox.Location = new Point((Width - 80) / 2, 15);
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
this.Controls.Add(iconBox);
// 工具名称
nameLabel = new Label();
nameLabel.AutoSize = false;
nameLabel.Size = new Size(Width - 20, 30);
nameLabel.Location = new Point(10, 100);
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
this.Controls.Add(nameLabel);
// 打开按钮
var openButton = new Button();
openButton.Text = "打开工具";
openButton.Size = new Size(100, 30);
openButton.Location = new Point((Width - 100) / 2, 140);
openButton.BackColor = Color.FromArgb(0, 120, 215);
openButton.ForeColor = Color.White;
openButton.FlatStyle = FlatStyle.Flat;
openButton.FlatAppearance.BorderSize = 0;
openButton.Cursor = Cursors.Hand;
// 按钮点击直接触发ToolCardClicked事件
openButton.Click += (s, e) => {
ToolCardClicked?.Invoke(this, e);
};
this.Controls.Add(openButton);
// 设置按钮悬停效果
openButton.BackColor = Color.FromArgb(0, 120, 215);
openButton.FlatAppearance.MouseOverBackColor = Color.FromArgb(0, 100, 180);
openButton.FlatAppearance.MouseDownBackColor = Color.FromArgb(0, 80, 160);
}
public void UpdateDisplay()
{
nameLabel.Text = ToolName;
iconBox.Image = ToolIcon;
}
}
}

64
border_renderer.cpp Normal file
View File

@@ -0,0 +1,64 @@
#include <windows.h>
#include <vector>
#include <fstream>
#include <cmath>
#include <d2d1.h>
// 高性能边框路径生成
void GenerateBorderPath(int width, int height, int radius, const char* outputPath) {
std::ofstream out(outputPath);
const float pi = 3.1415926f;
const int segments = 24; // 高分段数确保平滑
std::vector<POINTFLOAT> points;
// 优化后的圆角路径生成
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),
cy + radius * sinf(angle)
});
}
};
// 左上角
addArc(pi, 3*pi/2, radius, radius);
// 右上角
addArc(3*pi/2, 2*pi, width - radius, radius);
// 右下角
addArc(0, pi/2, width - radius, height - radius);
// 左下角
addArc(pi/2, pi, radius, height - radius);
// 闭合路径
points.push_back(points[0]);
// 写入优化格式
if (out.is_open()) {
for (const auto& p : points) {
out << p.x << "," << p.y << "\n";
}
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
int argc;
LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
if (argc != 5) return 1;
int width = _wtoi(argv[1]);
int height = _wtoi(argv[2]);
int radius = _wtoi(argv[3]);
char outputPath[MAX_PATH];
wcstombs(outputPath, argv[4], MAX_PATH);
GenerateBorderPath(width, height, radius, outputPath);
return 0;
}

90
card_calculator.cpp Normal file
View File

@@ -0,0 +1,90 @@
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <windows.h>
using namespace std;
struct Point {
float x;
float y;
};
void WritePathToFile(const vector<Point>& path, const string& filename) {
ofstream outFile(filename);
if (!outFile) {
cerr << "无法打开输出文件: " << filename << endl;
return;
}
for (const auto& point : path) {
outFile << point.x << "," << point.y << "\n";
}
outFile.close();
}
vector<Point> CalculateRoundedRectPath(int width, int height, int radius) {
vector<Point> pathPoints;
const int segments = 10;
const float angleStep = 3.1415926f / (2 * segments);
// 左上角
for (int i = 0; i <= segments; i++) {
float angle = 3.1415926f + i * angleStep;
pathPoints.push_back({
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({
width - radius + radius * cosf(angle),
radius + radius * sinf(angle)
});
}
// 右下角
for (int i = 0; i <= segments; i++) {
float angle = 0 + i * angleStep;
pathPoints.push_back({
width - 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({
radius + radius * cosf(angle),
height - radius + radius * sinf(angle)
});
}
// 闭合路径
pathPoints.push_back(pathPoints[0]);
return pathPoints;
}
int main(int argc, char* argv[]) {
if (argc != 5) {
cout << "用法: card_calculator [宽度] [高度] [圆角半径] [输出文件]" << endl;
return 1;
}
int width = stoi(argv[1]);
int height = stoi(argv[2]);
int radius = stoi(argv[3]);
string outputFile = argv[4];
auto path = CalculateRoundedRectPath(width, height, radius);
WritePathToFile(path, outputFile);
return 0;
}

2
del.bat Normal file
View File

@@ -0,0 +1,2 @@
rmdir bin /s /q
rmdir obj /s /q

49
docs/about.html Normal file
View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>关于kortapp-z</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>关于kortapp-z</h1>
<p>了解我们的项目和团队</p>
</header>
<main>
<section class="about-project">
<h2>项目简介</h2>
<p>kortapp-z是一个专为Windows系统设计的实用工具集合旨在提供一站式的系统优化和管理解决方案。</p>
<p>项目始于2025年由热爱效率工具的开发者创建。</p>
</section>
<section class="team">
<h2>开发团队</h2>
<p>我们的团队由经验丰富的开发人员组成,专注于创建高质量的系统工具。</p>
<ul>
<li>核心开发者: 1人</li>
<li>UI设计师: 1人</li>
<li>测试工程师: 1人</li>
</ul>
</section>
<section class="contact">
<h2>联系我们</h2>
<p>如有任何问题或建议欢迎通过GitHub提交issue或pull request。</p>
<a href="https://github.com/zs-yg/kortapp-z/issues" target="_blank">提交反馈</a>
</section>
</main>
<footer>
<nav>
<a href="index.html">首页</a>
<a href="features.html">功能</a>
</nav>
<p>&copy; 2025 kortapp-z 团队</p>
</footer>
<script src="script.js"></script>
</body>
</html>

49
docs/features.html Normal file
View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>kortapp-z功能详情</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>kortapp-z功能详情</h1>
<p>探索我们强大的工具集</p>
</header>
<main>
<section class="feature-list">
<h2>核心功能</h2>
<article class="feature">
<h3>应用程序管理</h3>
<p>批量安装、卸载(目前没有)和更新应用程序(目前没有),管理启动项(目前没有)。</p>
<p>优势:集中管理所有应用,节省时间,避免系统臃肿。</p>
</article>
<article class="feature">
<h3>资源监控(之后可能在内置工具里有)</h3>
<p>实时监控CPU、内存、磁盘和网络使用情况。</p>
<p>优势:直观的图表展示,及时发现资源瓶颈。</p>
</article>
<article class="feature">
<h3>文件管理(之后可能在内置工具里有)</h3>
<p>高级文件搜索、批量重命名和快速文件分类。</p>
<p>优势:提升文件管理效率,支持正则表达式搜索。</p>
</article>
</section>
</main>
<footer>
<nav>
<a href="index.html">首页</a>
<a href="about.html">关于</a>
</nav>
<p>&copy; 2025 kortapp-z 团队</p>
</footer>
<script src="script.js"></script>
</body>
</html>

42
docs/index.html Normal file
View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>kortapp-z - Windows实用工具</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>欢迎使用kortapp-z</h1>
<p>您的一站式Windows实用工具</p>
</header>
<main>
<section class="features">
<h2>主要功能</h2>
<ul>
<li>内置工具</li>
<li>应用程序下载</li>
<li>更多实用功能</li>
</ul>
</section>
<section class="github">
<h2>项目GitHub地址</h2>
<p>查看源代码并参与贡献:</p>
<a href="https://github.com/zs-yg/kortapp-z" target="_blank">GitHub仓库</a>
</section>
</main>
<footer>
<nav>
<a href="about.html">关于</a>
<a href="features.html">功能</a>
</nav>
<p>&copy; 2025 zsyg</p>
</footer>
<script src="script.js"></script>
</body>
</html>

31
docs/script.js Normal file
View File

@@ -0,0 +1,31 @@
// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', function() {
// 获取当前年份并更新页脚版权信息
const yearElement = document.querySelector('footer p');
if (yearElement) {
const currentYear = new Date().getFullYear();
yearElement.textContent = yearElement.textContent.replace('2025', currentYear);
}
// 为所有导航链接添加点击效果
const navLinks = document.querySelectorAll('nav a');
navLinks.forEach(link => {
link.addEventListener('click', function(e) {
// 可以在这里添加页面切换动画或其他效果
console.log('导航到: ' + this.getAttribute('href'));
});
});
// 功能列表项悬停效果
const featureItems = document.querySelectorAll('.features li');
featureItems.forEach(item => {
item.addEventListener('mouseover', function() {
this.style.transform = 'translateX(5px)';
this.style.transition = 'transform 0.3s ease';
});
item.addEventListener('mouseout', function() {
this.style.transform = '';
});
});
});

71
docs/style.css Normal file
View File

@@ -0,0 +1,71 @@
/* 全局样式 */
body {
font-family: 'Microsoft YaHei', sans-serif;
line-height: 1.6;
margin: 0;
padding: 0;
color: #333;
background-color: #f5f5f5;
}
/* 页眉样式 */
header {
background-color: #2c3e50;
color: white;
text-align: center;
padding: 2rem 0;
}
header h1 {
margin: 0;
font-size: 2.5rem;
}
header p {
margin: 0.5rem 0 0;
font-size: 1.2rem;
}
/* 主体内容样式 */
main {
max-width: 1200px;
margin: 2rem auto;
padding: 0 1rem;
}
section {
background: white;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
padding: 2rem;
margin-bottom: 2rem;
}
h2 {
color: #2c3e50;
border-bottom: 2px solid #eee;
padding-bottom: 0.5rem;
}
/* 链接样式 */
a {
color: #3498db;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* 页脚样式 */
footer {
text-align: center;
padding: 1rem 0;
background-color: #2c3e50;
color: white;
}
footer nav a {
color: white;
margin: 0 1rem;
}

115
en-US_README.md Normal file
View File

@@ -0,0 +1,115 @@
# Kortapp-z - Windows App Store -- Advocating for Open Source, Free Software, and No Ads
Setting a small flag: Never accept ads, continuously update.
## Open Source Practices
1. The project code is open source, allowing anyone to use, modify, distribute, or commercialize it, but the original author must be credited.
2. The project documentation is open source, allowing anyone to use, modify, distribute, or commercialize it, but the original author must be credited.
3. Project resources such as icons and screenshots are open source, allowing anyone to use, modify, distribute, or commercialize them, but the original author must be credited.
4. Any derivatives of the project (including but not limited to websites, apps, plugins, etc.) must adhere to the above open-source license.
5. The project does not accept any form of advertising, and ads must not be placed anywhere.
6. The project does not accept any form of donations.
7. The project does not accept any form of sponsorship.
8. The project welcomes PRs (Pull Requests) in any form. Submitting issues is not required.
9. You can submit PRs for your own projects. However, if the star count is below 1k, they will be deleted.
## Project Overview
A simple Windows app store application that provides software download and management features.
Offers software management, download management, built-in tools, and more.
## Features
- Clean software download interface
- Download progress management
- Supports background downloads
- Beautiful app card display
- Functional and structured code handling
## Build and Packaging
### System Requirements
- .NET 8.0 SDK
- Windows 10/11
### Packaging Commands
#### 32-bit Version
```bash
dotnet publish -c Release -r win-x86 -p:PublishSingleFile=true
```
#### 64-bit Version
```bash
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true
```
The packaged executable will include the specified application icon and be output to:
```
bin\Release\net8.0-windows\[platform]\publish
```
### Advanced Options
- Add `--self-contained true` to generate a standalone package (larger size).
- Add `-p:PublishTrimmed=true` to reduce package size (experimental).
## Project Structure
```
kortapp-z/
├── MainForm.cs # Main form logic
├── DownloadManager.cs # Download management
├── AppCard.cs # App card control
├── DownloadItem.cs # Download item control
├── img/ # Image resources
│ ├── ico/ # Icon files
│ └── png/ # App screenshots
└── resource/ # Resource files
└── aria2c.exe # Download tool
```
## Runtime Requirements
- .NET 8.0 runtime (if using framework-dependent deployment)
- Windows 10 or later
## License
MIT License
Copyright (c) 2025 zsyg
## Other Websites
Gitee Mirror Repository: https://gitee.com/chr_super/kortapp-z (Currently no longer maintained)
## Maintenance
Since I rarely use Gitee and find it cumbersome to operate, the Gitee mirror will no longer be synced. If anyone knows how to set up a mirror, please help. Contact me via QQ: 3872006562 or DM me on Bilibili. I will acknowledge your help in the README. Thank you!
Due to a conflict with Daye, Windowscleaner will never be listed. I will strive on my own.
Note: Due to GitHub file upload restrictions, rename `img/png/NET.png` to `.NET.png`; otherwise, the program may encounter unexpected issues.
Anyone can add their own legal software via PR.
Author's Email:
```
3872006562@qq.com
```
Author's QQ:
```
3872006562
```
QQ Group:
```
1043867176
```
Bilibili Account:
```
Zayisynth
```

BIN
img/ico/PyDebloatX.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
img/jpg/D.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
img/jpg/Min.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/jpg/NDM.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
img/jpg/Twinkstar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

BIN
img/jpg/github.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
img/jpg/pcl2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
img/jpg/vs.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
img/jpg/wx.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
img/png/ABDM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
img/png/BongoCat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
img/png/DWMBlurGlass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

BIN
img/png/Ditto.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
img/png/Dnest.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

BIN
img/png/DropPoint.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
img/png/FDM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 B

BIN
img/png/FileBrowser.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
img/png/GalaceanEngine.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/png/Go.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
img/png/Keypirinha.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
img/png/Maxun.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
img/png/NET.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 796 B

BIN
img/png/SSM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
img/png/SeelenUI.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
img/png/SpaceSniffer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
img/png/Umi-OCR.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
img/png/Winmerge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
img/png/XDM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
img/png/brave.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
img/png/cloudreve.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
img/png/code-server.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
img/png/codium_cnl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
img/png/daytona.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

BIN
img/png/glance.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 B

BIN
img/png/java.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
img/png/lockpass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
img/png/mingw-64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/png/n8n.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/png/nanazip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
img/png/nodejs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/png/omi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
img/png/openark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
img/png/openlist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
img/png/python.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
img/png/ruby.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
img/png/rust.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
img/png/trivy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 950 B

BIN
img/png/yt-dlp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 KiB

BIN
img/resource/png/QRcode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 KiB

64
inno/innosetup_x64.iss Normal file
View File

@@ -0,0 +1,64 @@
; 脚本由 Inno Setup 脚本向导生成。
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
#define MyAppName "kortapp-z"
#define MyAppVersion "1.0.8"
#define MyAppPublisher "zsyg"
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
#define MyAppExeName "kortapp.exe"
#define MyAppAssocName MyAppName + ""
#define MyAppAssocExt ".exe"
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
[Setup]
; 注意AppId 的值唯一标识此应用程序。不要在其他应用程序的安装程序中使用相同的 AppId 值。
; (若要生成新的 GUID请在 IDE 中单击 "工具|生成 GUID"。)
AppId={{8020EC01-6133-40BB-8B8B-0EB71E49696C}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
UninstallDisplayIcon={app}\{#MyAppExeName}
; "ArchitecturesAllowed=x64compatible" 指定安装程序无法运行
; 除 Arm 上的 x64 和 Windows 11 之外的任何平台上。
ArchitecturesAllowed=x64compatible
; "ArchitecturesInstallIn64BitMode=x64compatible" 要求
; 安装可以在 x64 或 Arm 上的 Windows 11 上以“64 位模式”完成,
; 这意味着它应该使用本机 64 位 Program Files 目录和
; 注册表的 64 位视图。
ArchitecturesInstallIn64BitMode=x64compatible
ChangesAssociations=yes
DisableProgramGroupPage=yes
LicenseFile=C:\Users\Administrator\Downloads\LICENSE.txt
; 取消注释以下行以在非管理安装模式下运行 (仅为当前用户安装)。
;PrivilegesRequired=lowest
OutputDir=D:\C#\kortapp-z_Release\setup
OutputBaseFilename=kortapp-z_setup_x64
SolidCompression=yes
WizardStyle=modern
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "D:\C#\kortapp-z_Release\x64_inno\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\C#\kortapp-z_Release\x64_inno\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意:不要在任何共享系统文件上使用 "Flags: ignoreversion"
[Registry]
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

56
inno/innosetup_x86.iss Normal file
View File

@@ -0,0 +1,56 @@
; 脚本由 Inno Setup 脚本向导生成。
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
#define MyAppName "kortapp-z"
#define MyAppVersion "1.0.8"
#define MyAppPublisher "zsyg"
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
#define MyAppExeName "kortapp.exe"
#define MyAppAssocName MyAppName + ""
#define MyAppAssocExt ".exe"
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
[Setup]
; 注意AppId 的值唯一标识此应用程序。不要在其他应用程序的安装程序中使用相同的 AppId 值。
; (若要生成新的 GUID请在 IDE 中单击 "工具|生成 GUID"。)
AppId={{BF1944C3-CD0C-4119-A340-49C54961D48B}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
UninstallDisplayIcon={app}\{#MyAppExeName}
ChangesAssociations=yes
DisableProgramGroupPage=yes
LicenseFile=C:\Users\Administrator\Downloads\LICENSE.txt
; 取消注释以下行以在非管理安装模式下运行 (仅为当前用户安装)。
;PrivilegesRequired=lowest
OutputDir=D:\C#\kortapp-z_Release\setup
OutputBaseFilename=kortapp-z_setup_x86
SolidCompression=yes
WizardStyle=modern
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "D:\C#\kortapp-z_Release\x86_inno\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\C#\kortapp-z_Release\x86_inno\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意:不要在任何共享系统文件上使用 "Flags: ignoreversion"
[Registry]
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

65
log_cleaner.cpp Normal file
View File

@@ -0,0 +1,65 @@
#include <iostream>
#include <filesystem>
#include <chrono>
namespace fs = std::filesystem;
int main() {
try {
auto start = std::chrono::high_resolution_clock::now();
// 定义日志目录路径
fs::path logDir;
#ifdef _WIN32
// Windows系统获取AppData路径
char* appData = nullptr;
size_t len = 0;
if (_dupenv_s(&appData, &len, "APPDATA") == 0 && appData != nullptr) {
logDir = fs::path(appData) / "zsyg" / "kortapp-z" / ".logs";
free(appData);
} else {
std::cerr << "无法获取APPDATA环境变量" << std::endl;
return 1;
}
#else
// 非Windows系统使用默认路径
logDir = fs::path(getenv("HOME")) / ".zsyg" / "kortapp-z" / ".logs";
#endif
size_t deletedCount = 0;
size_t errorCount = 0;
// 检查目录是否存在
if (fs::exists(logDir) && fs::is_directory(logDir)) {
// 遍历并删除所有日志文件
for (const auto& entry : fs::directory_iterator(logDir)) {
try {
if (fs::is_regular_file(entry)) {
fs::remove(entry);
deletedCount++;
}
} catch (const std::exception& e) {
std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
errorCount++;
}
}
} else {
std::cout << "日志目录不存在,无需清理" << std::endl;
return 0;
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "日志清理完成: " << std::endl;
std::cout << "删除文件数: " << deletedCount << std::endl;
std::cout << "错误数: " << errorCount << std::endl;
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
} catch (const std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
return 1;
}
return 0;
}

63
logger.cs Normal file
View File

@@ -0,0 +1,63 @@
using System;
using System.IO;
using System.Text;
namespace AppStore
{
public static class Logger
{
private static readonly string LogsDirectory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"zsyg", "kortapp-z", ".logs");
private static readonly object LockObject = new object();
static Logger()
{
try
{
// 确保logs目录存在
if (!Directory.Exists(LogsDirectory))
{
Directory.CreateDirectory(LogsDirectory);
}
}
catch (Exception ex)
{
Console.WriteLine($"无法创建日志目录: {LogsDirectory}, 错误: {ex.Message}");
throw;
}
}
public static void Log(string message)
{
lock (LockObject)
{
try
{
string fileName = $"{DateTime.Now:yyyyMMddHHmmss}.log";
string filePath = Path.Combine(LogsDirectory, fileName);
using (StreamWriter writer = new StreamWriter(filePath, true, Encoding.UTF8))
{
writer.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}");
}
}
catch (Exception ex)
{
// 日志记录失败时输出到控制台
Console.WriteLine($"日志记录失败: {ex.Message}");
}
}
}
public static void LogError(string message, Exception? ex = null)
{
string errorMessage = $"ERROR: {message}";
if (ex != null)
{
errorMessage += $"\nException: {ex}\nStackTrace: {ex.StackTrace}";
}
Log(errorMessage);
}
}
}

View File

@@ -0,0 +1,43 @@
# 编译器设置
CC = gcc
CFLAGS = -Wall -Wextra -Iinclude -static
LDFLAGS = -static -mwindows -Wl,--subsystem,windows \
-L"C:/msys64/ucrt64/lib" \
-L"C:/msys64/ucrt64/x86_64-w64-mingw32/lib" \
-lws2_32 -lole32 -loleaut32 -luuid \
-Wl,-Bstatic -lstdc++ -lgcc -lwinpthread
# 目录设置
SRC_DIR = src
OBJ_DIR = obj
BUILD_DIR = build
INCLUDE_DIR = include
# 源文件和目标文件
SRCS = $(wildcard $(SRC_DIR)/*.c)
OBJS = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRCS))
EXEC = $(BUILD_DIR)/system_info.exe
# 默认目标
all: $(EXEC)
# 链接目标文件生成可执行文件
$(EXEC): $(OBJS) | $(BUILD_DIR)
$(CC) $(LDFLAGS) -o $@ $^
# 编译源文件生成目标文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
# 创建必要的目录
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
$(OBJ_DIR):
mkdir -p $(OBJ_DIR)
# 清理生成的文件
clean:
rm -rf $(OBJ_DIR) $(BUILD_DIR)
.PHONY: all clean

View File

@@ -0,0 +1,8 @@
#ifndef ABOUT_DIALOG_H
#define ABOUT_DIALOG_H
#include <windows.h>
void show_about_dialog(HWND hParent);
#endif // ABOUT_DIALOG_H

View File

@@ -0,0 +1,10 @@
#ifndef CONFIG_H
#define CONFIG_H
#define APP_NAME "系统信息查看器"
#define APP_VERSION "1.0"
#define MAX_DISKS 26
#define MAX_ADAPTERS 10
#define UPDATE_INTERVAL 5000 // 5秒
#endif // CONFIG_H

View File

@@ -0,0 +1,15 @@
#ifndef DISK_INFO_H
#define DISK_INFO_H
#include <windows.h>
typedef struct {
char driveLetter;
DWORD64 totalBytes;
DWORD64 freeBytes;
char fileSystem[32];
} DiskInfo;
void get_disk_info(DiskInfo* disks, int* count);
#endif // DISK_INFO_H

View File

@@ -0,0 +1,15 @@
#ifndef LOGGING_H
#define LOGGING_H
#include <windows.h>
typedef enum {
LOG_DEBUG,
LOG_INFO,
LOG_WARNING,
LOG_ERROR
} LogLevel;
void log_message(LogLevel level, const char* format, ...);
#endif // LOGGING_H

View File

@@ -0,0 +1,9 @@
#ifndef MAIN_WINDOW_H
#define MAIN_WINDOW_H
#include <windows.h>
#include "system_info.h"
void update_main_window(HWND hWnd, SystemInfo* sysInfo);
#endif // MAIN_WINDOW_H

View File

@@ -0,0 +1,23 @@
#ifndef NETWORK_INFO_H
#define NETWORK_INFO_H
#include <windows.h>
#include <iphlpapi.h>
// 确保GetAdaptersInfo函数声明
#ifndef _IPHLPAPI_
#define _IPHLPAPI_
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen);
#endif
typedef struct {
char adapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
char ipAddress[16];
char macAddress[18];
ULONG speed; // in Mbps
} NetworkAdapterInfo;
void get_network_adapters(NetworkAdapterInfo* adapters, int* count);
#endif // NETWORK_INFO_H

View File

@@ -0,0 +1,26 @@
#ifndef PERFORMANCE_INFO_H
#define PERFORMANCE_INFO_H
#include <windows.h>
#include <pdh.h>
// 确保PDH函数声明
#ifndef _PDH_H_
#define _PDH_H_
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 PdhCollectQueryData(PDH_HQUERY hQuery);
PDH_STATUS PdhGetFormattedCounterValue(PDH_HCOUNTER hCounter, DWORD dwFormat, LPDWORD lpdwType, PPDH_FMT_COUNTERVALUE pValue);
#endif
typedef struct {
DWORD cpuUsage; // CPU使用率百分比
DWORD memoryUsage; // 内存使用率百分比
DWORD processesCount; // 进程数量
DWORD threadsCount; // 线程数量
DWORD handlesCount; // 句柄数量
} PerformanceInfo;
void get_performance_info(PerformanceInfo* perfInfo);
#endif // PERFORMANCE_INFO_H

View File

@@ -0,0 +1,11 @@
#ifndef RESOURCE_H
#define RESOURCE_H
#define IDI_MAIN_ICON 101
#define IDR_MAIN_MENU 102
#define IDM_EXIT 1001
#define IDM_ABOUT 1002
#define IDM_SHOW_INFO 1003
#endif // RESOURCE_H

View File

@@ -0,0 +1,21 @@
#ifndef SYSTEM_INFO_H
#define SYSTEM_INFO_H
#include <windows.h>
typedef struct {
char cpuName[256];
DWORD cpuCores;
DWORD cpuThreads;
MEMORYSTATUSEX memoryStatus;
SYSTEM_INFO systemInfo;
OSVERSIONINFOEX osVersion;
} SystemInfo;
// 初始化系统信息
void init_system_info(SystemInfo* sysInfo);
// 创建主窗口
int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage);
#endif // SYSTEM_INFO_H

View File

@@ -0,0 +1,13 @@
#ifndef SYSTEM_TRAY_H
#define SYSTEM_TRAY_H
#include <windows.h>
#define WM_TRAYICON (WM_USER + 1)
#define ID_TRAYICON 100
void create_tray_icon(HWND hWnd, HICON hIcon);
void update_tray_icon(HWND hWnd, HICON hIcon, LPCTSTR tooltip);
void remove_tray_icon(HWND hWnd);
#endif // SYSTEM_TRAY_H

View File

@@ -0,0 +1,18 @@
#ifndef UTILS_H
#define UTILS_H
#include <windows.h>
// 安全释放内存
#define SAFE_FREE(ptr) if (ptr) { free(ptr); ptr = NULL; }
// 宽字符转多字节字符串
char* wchar_to_mb(const wchar_t* wstr);
// 多字节字符串转宽字符
wchar_t* mb_to_wchar(const char* str);
// 获取当前时间字符串
char* get_current_time_string();
#endif // UTILS_H

View File

@@ -0,0 +1,16 @@
#ifndef WINDOW_UTILS_H
#define WINDOW_UTILS_H
#include <windows.h>
#include "system_info.h"
// 窗口过程函数
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// 创建主窗口
int create_main_window(HINSTANCE hInstance, SystemInfo* sysInfo, UINT codePage);
// 注册窗口类
BOOL register_window_class(HINSTANCE hInstance);
#endif // WINDOW_UTILS_H

Some files were not shown because too many files have changed in this diff Show More