mirror of
https://github.com/zs-yg/kortapp-z.git
synced 2025-12-06 16:10:42 +08:00
366 lines
14 KiB
C#
366 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows.Forms;
|
|
using System.Drawing;
|
|
using System.Security;
|
|
using System.IO;
|
|
using AppStore.Tools.IconExtractor;
|
|
|
|
namespace AppStore
|
|
{
|
|
public class SelfStartingManagerForm : Form
|
|
{
|
|
private DataGridView dataGridView = new DataGridView();
|
|
private Button refreshButton = new Button();
|
|
private Button addButton = new Button();
|
|
private Button removeButton = new Button();
|
|
|
|
public SelfStartingManagerForm()
|
|
{
|
|
InitializeComponent();
|
|
LoadStartupItems();
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
this.Text = "自启动项管理";
|
|
this.Size = new Size(600, 400);
|
|
this.StartPosition = FormStartPosition.CenterParent;
|
|
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
|
this.MaximizeBox = false;
|
|
|
|
this.SuspendLayout();
|
|
|
|
// 主表格
|
|
dataGridView.Dock = DockStyle.Fill;
|
|
dataGridView.Margin = new Padding(10);
|
|
dataGridView.ReadOnly = true;
|
|
dataGridView.AllowUserToAddRows = false;
|
|
dataGridView.AllowUserToDeleteRows = false;
|
|
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
|
|
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
|
dataGridView.BackgroundColor = SystemColors.Window;
|
|
dataGridView.BorderStyle = BorderStyle.Fixed3D;
|
|
|
|
// 添加图标列
|
|
var iconColumn = new DataGridViewImageColumn
|
|
{
|
|
HeaderText = "图标",
|
|
Name = "Icon",
|
|
ImageLayout = DataGridViewImageCellLayout.Zoom,
|
|
FillWeight = 10
|
|
};
|
|
|
|
var nameColumn = new DataGridViewTextBoxColumn();
|
|
nameColumn.HeaderText = "名称";
|
|
nameColumn.Name = "Name";
|
|
nameColumn.FillWeight = 25;
|
|
|
|
var pathColumn = new DataGridViewTextBoxColumn();
|
|
pathColumn.HeaderText = "路径";
|
|
pathColumn.Name = "Path";
|
|
pathColumn.FillWeight = 65;
|
|
|
|
dataGridView.Columns.AddRange(iconColumn, nameColumn, pathColumn);
|
|
|
|
// 按钮面板
|
|
var buttonPanel = new Panel();
|
|
buttonPanel.Dock = DockStyle.Bottom;
|
|
buttonPanel.Height = 60;
|
|
buttonPanel.BackColor = SystemColors.Control;
|
|
buttonPanel.Padding = new Padding(10);
|
|
|
|
// 按钮样式
|
|
var buttonStyle = new Size(90, 32);
|
|
var buttonFont = new Font("Microsoft YaHei", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
|
|
|
// 刷新按钮
|
|
refreshButton.Text = "刷新";
|
|
refreshButton.Size = buttonStyle;
|
|
refreshButton.Font = buttonFont;
|
|
refreshButton.Click += (s, e) => LoadStartupItems();
|
|
|
|
// 添加按钮
|
|
addButton.Text = "添加";
|
|
addButton.Size = buttonStyle;
|
|
addButton.Font = buttonFont;
|
|
addButton.Click += AddButton_Click;
|
|
|
|
// 删除按钮
|
|
removeButton.Text = "删除";
|
|
removeButton.Size = buttonStyle;
|
|
removeButton.Font = buttonFont;
|
|
removeButton.Click += RemoveButton_Click;
|
|
|
|
// 布局按钮
|
|
var flowLayout = new FlowLayoutPanel();
|
|
flowLayout.Dock = DockStyle.Fill;
|
|
flowLayout.FlowDirection = FlowDirection.LeftToRight;
|
|
flowLayout.Controls.AddRange(new Control[] { refreshButton, addButton, removeButton });
|
|
flowLayout.WrapContents = false;
|
|
flowLayout.AutoSize = true;
|
|
|
|
buttonPanel.Controls.Add(flowLayout);
|
|
|
|
// 主布局
|
|
var mainPanel = new Panel();
|
|
mainPanel.Dock = DockStyle.Fill;
|
|
mainPanel.Padding = new Padding(10);
|
|
mainPanel.Controls.Add(dataGridView);
|
|
mainPanel.Controls.Add(buttonPanel);
|
|
|
|
this.Controls.Add(mainPanel);
|
|
this.ResumeLayout(false);
|
|
|
|
// 初始加载
|
|
LoadStartupItems();
|
|
}
|
|
|
|
|
|
|
|
private void LoadStartupItems()
|
|
{
|
|
dataGridView.Rows.Clear();
|
|
dataGridView.Enabled = false;
|
|
refreshButton.Enabled = false;
|
|
|
|
try
|
|
{
|
|
Cursor = Cursors.WaitCursor;
|
|
var items = SelfStartingManager.GetAllStartupItems();
|
|
|
|
if (items.Count == 0)
|
|
{
|
|
dataGridView.Rows.Add("未找到自启动项", "");
|
|
}
|
|
else
|
|
{
|
|
foreach (var item in items)
|
|
{
|
|
Image? iconImage = null;
|
|
try
|
|
{
|
|
Logger.Log($"正在处理自启动项: {item.Key} = {item.Value}");
|
|
|
|
if (!string.IsNullOrEmpty(item.Value))
|
|
{
|
|
// 详细路径调试信息
|
|
Logger.Log($"正在检查文件路径: {item.Value}");
|
|
Logger.Log($"当前工作目录: {Environment.CurrentDirectory}");
|
|
Logger.Log($"完整路径: {Path.GetFullPath(item.Value)}");
|
|
|
|
// 清理路径,移除参数
|
|
string cleanPath = PathHelper.CleanExecutablePath(item.Value);
|
|
var fullPath = Path.GetFullPath(cleanPath);
|
|
|
|
if (System.IO.File.Exists(fullPath))
|
|
{
|
|
Logger.Log($"文件存在,尝试提取图标: {fullPath}");
|
|
try
|
|
{
|
|
var icon = IconExtractor.ExtractIconFromFile(cleanPath);
|
|
// 转换为Bitmap并保持高DPI显示质量
|
|
iconImage = new Bitmap(icon.ToBitmap(),
|
|
new Size(32, 32));
|
|
Logger.Log($"成功提取并转换图标: {item.Value} ({icon.Width}x{icon.Height})");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError($"图标提取失败: {item.Value}", ex);
|
|
iconImage = SystemIcons.Application.ToBitmap();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Logger.LogWarning($"文件不存在: {item.Value}");
|
|
iconImage = SystemIcons.Application.ToBitmap();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Logger.LogWarning("自启动项路径为空");
|
|
iconImage = SystemIcons.WinLogo.ToBitmap();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError($"加载程序图标失败: {item.Value}", ex);
|
|
iconImage = new Bitmap(16, 16);
|
|
using (Graphics g = Graphics.FromImage(iconImage))
|
|
{
|
|
g.Clear(Color.Red);
|
|
}
|
|
}
|
|
|
|
dataGridView.Rows.Add(iconImage!, item.Key, item.Value);
|
|
}
|
|
}
|
|
}
|
|
catch (SecurityException ex)
|
|
{
|
|
MessageBox.Show($"权限不足,无法读取注册表: {ex.Message}", "权限错误",
|
|
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show($"加载自启动项失败: {ex.Message}", "错误",
|
|
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
finally
|
|
{
|
|
dataGridView.Enabled = true;
|
|
refreshButton.Enabled = true;
|
|
Cursor = Cursors.Default;
|
|
}
|
|
}
|
|
|
|
private void AddButton_Click(object sender, EventArgs e)
|
|
{
|
|
using (var dialog = new AddStartupItemDialog())
|
|
{
|
|
if (dialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
if (SelfStartingManager.AddStartupItem(dialog.ItemName, dialog.ItemPath))
|
|
{
|
|
MessageBox.Show("添加成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
LoadStartupItems();
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("添加失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void RemoveButton_Click(object sender, EventArgs e)
|
|
{
|
|
if (dataGridView.SelectedRows.Count == 0)
|
|
{
|
|
MessageBox.Show("请先选择要删除的项", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return;
|
|
}
|
|
|
|
var selectedItem = dataGridView.SelectedRows[0].Cells["Name"].Value?.ToString() ?? "";
|
|
if (MessageBox.Show($"确定要删除 '{selectedItem}' 吗?", "确认删除",
|
|
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
|
|
{
|
|
if (SelfStartingManager.RemoveStartupItem(selectedItem))
|
|
{
|
|
MessageBox.Show("删除成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
LoadStartupItems();
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("删除失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class AddStartupItemDialog : Form
|
|
{
|
|
public string ItemName { get; private set; } = "";
|
|
public string ItemPath { get; private set; } = "";
|
|
|
|
private TextBox nameTextBox = new TextBox();
|
|
private TextBox pathTextBox = new TextBox();
|
|
private Button browseButton = new Button();
|
|
private Button okButton = new Button();
|
|
private Button cancelButton = new Button();
|
|
|
|
public AddStartupItemDialog()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
this.Text = "添加自启动项";
|
|
this.Size = new Size(400, 200);
|
|
this.StartPosition = FormStartPosition.CenterParent;
|
|
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
|
this.MaximizeBox = false;
|
|
|
|
// 名称标签和文本框
|
|
var nameLabel = new Label();
|
|
nameLabel.Text = "名称:";
|
|
nameLabel.Location = new Point(20, 20);
|
|
nameLabel.Size = new Size(60, 20);
|
|
|
|
nameTextBox.Location = new Point(90, 20);
|
|
nameTextBox.Size = new Size(280, 20);
|
|
|
|
// 路径标签和文本框
|
|
var pathLabel = new Label();
|
|
pathLabel.Text = "路径:";
|
|
pathLabel.Location = new Point(20, 50);
|
|
pathLabel.Size = new Size(60, 20);
|
|
|
|
pathTextBox.Location = new Point(90, 50);
|
|
pathTextBox.Size = new Size(200, 20);
|
|
|
|
// 浏览按钮
|
|
browseButton.Text = "浏览...";
|
|
browseButton.Location = new Point(300, 50);
|
|
browseButton.Size = new Size(70, 23);
|
|
browseButton.Click += BrowseButton_Click;
|
|
|
|
// 确定按钮
|
|
okButton.Text = "确定";
|
|
okButton.DialogResult = DialogResult.OK;
|
|
okButton.Location = new Point(150, 100);
|
|
okButton.Size = new Size(80, 30);
|
|
okButton.Click += OkButton_Click;
|
|
|
|
// 取消按钮
|
|
cancelButton.Text = "取消";
|
|
cancelButton.DialogResult = DialogResult.Cancel;
|
|
cancelButton.Location = new Point(250, 100);
|
|
cancelButton.Size = new Size(80, 30);
|
|
|
|
// 添加控件
|
|
this.Controls.Add(nameLabel);
|
|
this.Controls.Add(nameTextBox);
|
|
this.Controls.Add(pathLabel);
|
|
this.Controls.Add(pathTextBox);
|
|
this.Controls.Add(browseButton);
|
|
this.Controls.Add(okButton);
|
|
this.Controls.Add(cancelButton);
|
|
}
|
|
|
|
private void BrowseButton_Click(object sender, EventArgs e)
|
|
{
|
|
using (var dialog = new OpenFileDialog())
|
|
{
|
|
dialog.Filter = "可执行文件 (*.exe)|*.exe|所有文件 (*.*)|*.*";
|
|
if (dialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
pathTextBox.Text = dialog.FileName;
|
|
if (string.IsNullOrEmpty(nameTextBox.Text))
|
|
{
|
|
nameTextBox.Text = System.IO.Path.GetFileNameWithoutExtension(dialog.FileName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OkButton_Click(object sender, EventArgs e)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(nameTextBox.Text))
|
|
{
|
|
MessageBox.Show("请输入名称", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return;
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(pathTextBox.Text))
|
|
{
|
|
MessageBox.Show("请选择路径", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return;
|
|
}
|
|
|
|
ItemName = nameTextBox.Text;
|
|
ItemPath = pathTextBox.Text;
|
|
}
|
|
}
|
|
} |