Compare commits

...

3 Commits

Author SHA1 Message Date
Serendipity a8f1bfeaab build: 迁移构建系统至CMake,重写README文档
将GNU Makefile构建系统迁移到CMake 3.15+,新增CLAUDE.md项目指南,
重写README.md补充项目结构、工作原理和详细构建说明。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 22:27:20 +08:00
Serendipity f21d302565 refactor: 移除未使用的Windows平台头文件包含
清理main.c中已不再需要的条件编译头文件引入,简化代码结构。
2026-03-16 18:49:47 +08:00
Serendipity adbbe099b9 docs: 添加 MIT 许可证文件
为项目添加标准的 MIT 许可证,明确软件的使用、复制、修改和分发权限。
2026-03-16 18:48:19 +08:00
7 changed files with 204 additions and 59 deletions
+1
View File
@@ -1,6 +1,7 @@
/.trae/
/.vscode/
/build/
/build*/
*.o
*.obj
+54
View File
@@ -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-8Windows 注册表 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%` 等变量展开
+33
View File
@@ -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"
)
+21
View File
@@ -0,0 +1,21 @@
# MIT License
Copyright (c) 2026 LHY
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+93 -52
View File
@@ -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-8Windows 注册表 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
# 配置(MinGW Makefiles 生成器)
cmake -B build -G "MinGW Makefiles"
# 编译
cmake --build build
```
2. 编译项目:
编译产出在 `bin/PathEditor.exe`
**其他 CMake 选项:**
```bash
mingw32-make
# Debug 模式(带调试符号)
cmake -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug
cmake --build build
# Release 优化
cmake -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
3. 运行:
编译成功后,可执行文件位于 `bin/PathEditor.exe`。
### 打包安装程序
### 打包 (可选)
使用 [Inno Setup 6](https://jrsoftware.org/isdl.php) 生成 `.exe` 安装包:
本项目使用 Inno Setup 生成安装包。
1. 确保已安装 Inno Setup 6
2. 先编译项目生成 `bin/PathEditor.exe` 及所需 DLL
3. 用 Inno Setup 编译 `dist/installer.iss`
4. 安装包输出至 `dist/dist/PathEditorSetup.exe`
1. 确保已安装 [Inno Setup 6](https://jrsoftware.org/isdl.php)。
2. 编译项目生成 exe 文件。
3. 使用 Inno Setup 编译 `dist/installer.iss` 脚本。
## 使用说明
## 📝 使用说明
1. **启动** — 右键程序图标,选择「以管理员身份运行」
2. **查看** — 程序启动后自动加载当前系统 PATH 到列表
3. **新建** — 点击「新建」按钮,输入路径后确认,新条目追加到列表末尾
4. **编辑** — 选中条目后点击「编辑」,或直接双击条目
5. **浏览** — 点击「浏览」打开文件夹选择器,选中目录后自动添加
6. **删除** — 选中条目后点击「删除」
7. **排序** — 选中条目后点击「上移」或「下移」调整顺序
8. **保存** — 操作完成后点击「确定」写入注册表并广播变更
9. **生效** — CMD / PowerShell 窗口需要重新打开才能识别新变量;部分程序可能需要重启
1. **启动**:右键点击程序图标,选择“以管理员身份运行”
2. **查看**:程序启动后会自动加载当前的系统 PATH 变量。
3. **修改**:使用右侧按钮栏进行添加、删除、移动等操作。
4. **保存**:操作完成后,务必点击底部的【确定】按钮保存更改。
5. **生效**:保存后,某些正在运行的程序可能需要重启才能识别新的环境变量。CMD 或 PowerShell 窗口需要重新打开。
**命令行备选方案:** 项目附带 `ManagePath.bat` 脚本,提供导出、导入和备份 PATH 的功能,无需 GUI 也可操作
## 👤 作者信息
## 许可证
* **作者**LHY
* **邮箱**<3364451258@qq.com>
* **GitHub**[https://github.com/LHY0125/PathEditor](https://github.com/LHY0125/PathEditor)
本项目基于 [MIT License](LICENSE) 开源。
如果您觉得这个工具对您有帮助,请给我的 GitHub 仓库点个 Star ⭐️
## 📄 许可证
本项目基于 MIT 许可证开源,您可以在遵守许可证条款的前提下自由使用、修改和分发本项目的代码。
详细信息请参阅 [LICENSE](LICENSE) 文件。
Copyright © 2026 LHY. All Rights Reserved.
Copyright (c) 2026 LHY
Binary file not shown.
-5
View File
@@ -8,11 +8,6 @@
#include "registry.h"
#include "callbacks.h"
#ifdef _WIN32
#include <windows.h>
#include <direct.h>
#endif
// 全局控件定义
Ihandle *dlg, *list_path, *lbl_status;
Ihandle *btn_new, *btn_edit, *btn_browse, *btn_del, *btn_up, *btn_down;