From a8f1bfeaab40cad4e647b20ba24b1b50336097a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Thu, 14 May 2026 22:27:20 +0800 Subject: [PATCH] =?UTF-8?q?build:=20=E8=BF=81=E7=A7=BB=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=87=B3CMake=EF=BC=8C=E9=87=8D=E5=86=99READ?= =?UTF-8?q?ME=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将GNU Makefile构建系统迁移到CMake 3.15+,新增CLAUDE.md项目指南, 重写README.md补充项目结构、工作原理和详细构建说明。 Co-Authored-By: Claude Opus 4.7 --- .gitignore | 1 + CLAUDE.md | 54 ++++++++++++++++ CMakeLists.txt | 33 ++++++++++ README.md | 149 +++++++++++++++++++++++++++++---------------- bin/PathEditor.exe | Bin 219081 -> 220414 bytes 5 files changed, 183 insertions(+), 54 deletions(-) create mode 100644 CLAUDE.md create mode 100644 CMakeLists.txt diff --git a/.gitignore b/.gitignore index 7d97e76..8151579 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /.trae/ /.vscode/ /build/ +/build*/ *.o *.obj diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d66d1be --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,54 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## 项目概述 + +Path Editor 是一个 Windows 系统环境变量 PATH 编辑器,使用 C 语言和 IUP 图形库开发。通过读写注册表 `HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path` 来管理系统 PATH。 + +## 构建与运行 + +```bash +# 编译(需要 MinGW-w64 在 PATH 中) +mingw32-make + +# 清理构建产物 +mingw32-make clean + +# 运行(必须以管理员身份) +bin/PathEditor.exe +``` + +编译器为 MinGW-w64 GCC,使用 `windres` 编译资源文件(图标)。IUP 3.31 库已包含在 `libs/` 目录下,无需额外安装。 + +## 打包 + +使用 Inno Setup 6 生成安装包。先编译生成 exe,再用 Inno Setup 编译 `dist/installer.iss`。 + +## 架构 + +``` +src/ + main.c 入口,构建 UI 布局(IupDialog + IupFlatList + 按钮) + callbacks.c 所有按钮回调 + 自定义输入对话框 + registry.c 注册表读写:load_path() / save_path() + utils.c 编码转换 + 管理员权限检测 + 斑马纹刷新 +include/ + globals.h 全局 Ihandle* 指针和注册表路径常量 + callbacks.h 回调函数声明 + registry.h 注册表操作声明 + utils.h 工具函数声明 +``` + +**数据流**: `load_path()`(注册表 → 列表) → 用户操作(按钮回调) → `save_path()`(列表 → 注册表 → `WM_SETTINGCHANGE` 广播) + +**编码约定**: IUP 使用 UTF-8,Windows 注册表 API 使用 UTF-16 (wide char)。`utils.c` 提供 `wide_to_utf8()` 和 `utf8_to_wide()` 完成转换。 + +**全局控件**: 所有 IUP 控件句柄(`dlg`, `list_path`, `lbl_status`, 各按钮)在 `main.c` 定义并通过 `globals.h` 声明为 `extern`,回调函数和工具函数直接访问它们。 + +## 关键约束 + +- 必须以管理员身份运行才能保存更改(`check_admin()` 通过尝试以 `KEY_WRITE` 打开注册表来检测) +- IUP 的 `UTF8MODE` 必须在 `IupOpen()` 之前通过 `putenv("IUP_UTF8MODE=YES")` 设置 +- `IupFlatList` 的数据操作(`APPEND` 等属性)必须在控件 Map 之后(`IupShowXY` 之后)才能生效 +- PATH 使用 `REG_EXPAND_SZ` 类型以支持 `%SystemRoot%` 等变量展开 diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d738ade --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.15) +project(PathEditor LANGUAGES C) + +set(IUP_DIR "${CMAKE_SOURCE_DIR}/libs/iup-3.31_Win64_dllw6_lib") + +add_executable(PathEditor + src/main.c + src/utils.c + src/registry.c + src/callbacks.c + ico/resources.rc +) + +target_include_directories(PathEditor PRIVATE + ${IUP_DIR}/include + include +) + +target_link_directories(PathEditor PRIVATE ${IUP_DIR}) + +target_link_libraries(PathEditor + iup iupcd gdi32 comdlg32 comctl32 uuid ole32 advapi32 +) + +target_compile_definitions(PathEditor PRIVATE _WIN32 UNICODE _UNICODE) + +target_compile_options(PathEditor PRIVATE -Wall -O2 -fexec-charset=UTF-8) + +target_link_options(PathEditor PRIVATE -mwindows) + +set_target_properties(PathEditor PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin" +) diff --git a/README.md b/README.md index 48e8c1a..348746f 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,123 @@ -# Path Editor (系统环境变量编辑器) +# Path Editor — Windows 系统环境变量编辑器 -一个简单、轻量级的 Windows 系统环境变量(PATH)编辑器,基于 C 语言和 IUP 图形库开发。 +一个轻量级的 Windows 系统环境变量(PATH)编辑器,使用 C 语言和 [IUP](https://www.tecgraf.puc-rio.br/iup/) 图形库开发。 -## ✨ 功能特点 +## 项目结构 -* **可视化编辑**:直观地查看和管理系统 PATH 环境变量。 -* **安全操作**:必须以管理员身份运行才能保存更改,防止误操作。 -* **便捷管理**: - * ➕ **新建**:添加新路径到列表。 - * 📂 **浏览**:直接从文件资源管理器选择目录添加。 - * ✏️ **编辑**:修改现有路径。 - * 🗑️ **删除**:移除不需要的路径。 - * ⬆️⬇️ **排序**:上移/下移调整路径优先级。 -* **轻量级**:原生 C 语言编写,运行速度快,占用资源少。 +``` +PathEditor/ +├── src/ +│ ├── main.c # 程序入口,构建 UI 布局 +│ ├── callbacks.c # 按钮回调 + 自定义输入对话框 +│ ├── registry.c # 注册表读写操作 +│ └── utils.c # 编码转换 + 权限检测 + 斑马纹样式 +├── include/ +│ ├── globals.h # 全局控件句柄与常量 +│ ├── callbacks.h +│ ├── registry.h +│ └── utils.h +├── libs/ # IUP 3.31 库文件(预编译) +├── ico/ # 应用图标与资源文件 +├── dist/ +│ └── installer.iss # Inno Setup 安装包脚本 +├── ManagePath.bat # 备用的命令行 PATH 管理脚本 +├── CMakeLists.txt # CMake 构建配置 +├── Makefile # GNU Make 构建配置(备用) +└── CLAUDE.md # Claude Code 项目指南 +``` -## 📦 下载与安装 +## 功能特点 -您可以从 [Releases](https://github.com/LHY0125/PathEditor/releases) 页面下载最新的安装包 (`PathEditorSetup.exe`)。 +- **可视化编辑** — 以列表形式直观查看和管理系统 PATH 变量 +- **增删改查** — 新建、编辑、删除条目,支持从文件管理器直接选择目录 +- **拖拽排序** — 上移/下移按钮调整路径优先级 +- **权限检测** — 非管理员模式自动切换为只读,防止误操作 +- **自定义输入框** — 支持超长路径的编辑(80 字符可见宽度) +- **斑马纹列表** — 交替行背景色,方便阅读 +- **双击编辑** — 双击列表项直接编辑对应路径 +- **即时广播** — 保存后通过 `WM_SETTINGCHANGE` 通知系统 -安装完成后,请**以管理员身份运行**程序以确保能够保存对系统环境变量的修改。 +## 工作原理 -## 🛠️ 构建指南 +程序直接读写 Windows 注册表键: -如果您想从源码构建本项目,请按照以下步骤操作: +``` +HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path +``` + +PATH 值使用 `REG_EXPAND_SZ` 类型,支持 `%SystemRoot%` 等环境变量展开。 + +**编码转换**:IUP 控件使用 UTF-8,Windows 注册表 API 使用 UTF-16,`utils.c` 提供 `wide_to_utf8()` 和 `utf8_to_wide()` 完成双向转换。 + +## 下载与安装 + +从 [Releases](https://github.com/LHY0125/PathEditor/releases) 页面下载 `PathEditorSetup.exe` 安装包。 + +> **注意:** 安装后必须以管理员身份运行,否则只能查看,无法保存更改。 + +## 从源码构建 ### 环境要求 -* Windows 操作系统 -* GCC 编译器 (推荐 MinGW-w64) -* Make 工具 -* IUP 库 (已包含在 `libs` 目录下) +| 工具 | 说明 | +|------|------| +| Windows 操作系统 | 需 Windows API 支持 | +| MinGW-w64 (GCC) | 编译器,路径 `D:\settings\Language\C\mingw64` | +| CMake 3.15+ | 构建工具 | +| IUP 3.31 | GUI 库(已包含在 `libs/` 中) | -### 编译步骤 +### 编译 -1. 克隆仓库: +```bash +git clone https://github.com/LHY0125/PathEditor.git +cd PathEditor - ```bash - git clone https://github.com/LHY0125/PathEditor.git - cd PathEditor - ``` +# 配置(MinGW Makefiles 生成器) +cmake -B build -G "MinGW Makefiles" -2. 编译项目: +# 编译 +cmake --build build +``` - ```bash - mingw32-make - ``` +编译产出在 `bin/PathEditor.exe`。 -3. 运行: - 编译成功后,可执行文件位于 `bin/PathEditor.exe`。 +**其他 CMake 选项:** -### 打包 (可选) +```bash +# Debug 模式(带调试符号) +cmake -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug +cmake --build build -本项目使用 Inno Setup 生成安装包。 +# Release 优化 +cmake -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release +cmake --build build +``` -1. 确保已安装 [Inno Setup 6](https://jrsoftware.org/isdl.php)。 -2. 编译项目生成 exe 文件。 -3. 使用 Inno Setup 编译 `dist/installer.iss` 脚本。 +### 打包安装程序 -## 📝 使用说明 +使用 [Inno Setup 6](https://jrsoftware.org/isdl.php) 生成 `.exe` 安装包: -1. **启动**:右键点击程序图标,选择“以管理员身份运行”。 -2. **查看**:程序启动后会自动加载当前的系统 PATH 变量。 -3. **修改**:使用右侧按钮栏进行添加、删除、移动等操作。 -4. **保存**:操作完成后,务必点击底部的【确定】按钮保存更改。 -5. **生效**:保存后,某些正在运行的程序可能需要重启才能识别新的环境变量。CMD 或 PowerShell 窗口需要重新打开。 +1. 确保已安装 Inno Setup 6 +2. 先编译项目生成 `bin/PathEditor.exe` 及所需 DLL +3. 用 Inno Setup 编译 `dist/installer.iss` +4. 安装包输出至 `dist/dist/PathEditorSetup.exe` -## 👤 作者信息 +## 使用说明 -* **作者**:LHY -* **邮箱**:<3364451258@qq.com> -* **GitHub**:[https://github.com/LHY0125/PathEditor](https://github.com/LHY0125/PathEditor) +1. **启动** — 右键程序图标,选择「以管理员身份运行」 +2. **查看** — 程序启动后自动加载当前系统 PATH 到列表 +3. **新建** — 点击「新建」按钮,输入路径后确认,新条目追加到列表末尾 +4. **编辑** — 选中条目后点击「编辑」,或直接双击条目 +5. **浏览** — 点击「浏览」打开文件夹选择器,选中目录后自动添加 +6. **删除** — 选中条目后点击「删除」 +7. **排序** — 选中条目后点击「上移」或「下移」调整顺序 +8. **保存** — 操作完成后点击「确定」写入注册表并广播变更 +9. **生效** — CMD / PowerShell 窗口需要重新打开才能识别新变量;部分程序可能需要重启 -如果您觉得这个工具对您有帮助,请给我的 GitHub 仓库点个 Star ⭐️! +**命令行备选方案:** 项目附带 `ManagePath.bat` 脚本,提供导出、导入和备份 PATH 的功能,无需 GUI 也可操作。 -## 📄 许可证 +## 许可证 -本项目基于 MIT 许可证开源,您可以在遵守许可证条款的前提下自由使用、修改和分发本项目的代码。 +本项目基于 [MIT License](LICENSE) 开源。 -详细信息请参阅 [LICENSE](LICENSE) 文件。 - -Copyright © 2026 LHY. All Rights Reserved. +Copyright (c) 2026 LHY diff --git a/bin/PathEditor.exe b/bin/PathEditor.exe index 68d21bf968bc991fc2c6ea93c1b1bfde44a060c4..011da746b4ace9444c096e81ca08b002a0faa0d3 100644 GIT binary patch delta 26018 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 delta 24692 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