# ExplorerPlusPlusNG **Repository Path**: ginkdu/ExplorerPlusPlusNG ## Basic Information - **Project Name**: ExplorerPlusPlusNG - **Description**: 养老版 Explorer++ 增加双面板,以及对UI及功能进行深化设计。 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-29 - **Last Updated**: 2026-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Explorer++(养老版) > 本项目是基于 [BDib/ExplorerPlusPlusNG](https://github.com/BDib/ExplorerPlusPlusNG) 的二次定制版本,在保留上游全部功能的基础上,对**用户界面与图标**进行了重新设计。 Explorer++ 是一款轻量、快速、开源的 Windows 文件管理器,支持便携使用,是 Windows 资源管理器的绝佳替代品。 本定制版在原版基础上重点优化了视觉体验与交互效率,新增了斑马纹、可配置图标大小、快速筛选、双面板等多项功能。 *** ## ✨ 养老版修改 ### 1. 全新 Fluent 风格图标 * 使用一套 **Fluent 风格**的统一图标(位于 `Explorer++/Explorer++/res/icons/custom/`),替换了上游默认的 Windows 10 图标主题; * 更新了应用主程序图标 `Explorer++.ico`,风格统一、细节更清晰。 ### 2. 可配置的工具栏图标大小 * 针对显示 shell 图标(驱动器工具栏、应用程序工具栏)的工具栏,新增图标大小选项: * 小号(16 px) * 中号(24 px) * 大号(32 px) * 超大(48 px) * 在 **工具 → 选项 → 窗口** 界面中通过下拉框设置; * 设置值支持写入注册表或配置文件,且基于 96 DPI 存储,自动适配不同分辨率。 ### 3. 可配置的标签栏高度 * 新增标签栏**额外高度**设置(0 \~ 24 px),用于加高顶部标签,改善点击区分度与美观度; * 在 **选项 → 选项卡** 界面中输入数值; * 高度以「额外偏移」方式存储,会跟随字体大小自动调整,DPI 无关; * 输入值会自动被约束在安全范围内(0 \~ 24),从配置文件中注入的越界值也会被夹紧。 ### 4. 驱动器工作栏图标显示修复 * 修复了**部分分区(尤其是系统分区、网络驱动器)在工作栏不显示图标**的问题; * 根因:当图标尺寸与系统列表不匹配时,工具栏会拷贝系统图列表生成「缩放快照」。该快照在驱动按钮查询图标之前生成、且不随系统列表增长而更新,于是**索引较高、在快照后才被系统惰性加入的图标**(如系统分区、网络驱动器)在快照中缺失,按钮指向越界索引而显示空白; * 修复方案(位于 `ToolbarView.cpp`): * 缩放拷贝遇到空槽时补透明占位图标,保证槽位索引不偏移; * 当按钮所需的系统图标索引超出工具栏当前列表范围时,从**实时系统列表**取回图标并补入工具栏列表,同时缓存“系统索引→工具栏索引”映射,避免刷新时重复添加; * 驱动器新增 / 热插拔刷新同样走该逻辑; * 对基于 `ToolbarView` 的工具栏(驱动器、应用程序、书签)通用生效。 ### 5. 显示窗格(Display Window)优化 * **默认配色改为冰晶蓝渐变**:显示窗格背景自左上角淡冰蓝 `RGB(232,246,255)` 向四周通透水晶蓝 `RGB(150,205,238)` 平滑晕开,取代原先「白 → 深蓝」,观感更清爽协调; * **首行名称后附带完整路径**:选中单个文件或未选中项(文件夹)时,显示窗格第一行由原来的仅名称,改为「名称 `|` 完整文件夹路径」的格式,便于直接查看当前所处位置; * **默认字体高度调整**:默认字体仍为 Segoe UI,字符高度(`lfHeight`)调整为 `-15`,与本地配置实测相符。 > 配色、字体与字号均可通过 **工具 → 选项 → 显示颜色** 调整,默认值随代码一并更新。 ### 6. 双面板(Dual Pane) * **默认开启双面板**:启动即并排显示两个文件面板,无需任何命令行动作;如不需要可在 **查看 → 双窗格** 中关闭; * **左右面板相互独立**:每个面板拥有各自的标签栏与文件列表,布局为固定 **50/50 等分**,中间以 3 像素垂直分隔条分隔,可分别独立浏览不同目录; * **切换活动面板**:在指定面板内选择文件或标签时,会自动将该面板设为活动面板,显示窗格随之联动预览对应内容; * **每面板独立驱动器工具栏**:驱动器工具栏从顶部 rebar 中移出,改为**每个面板上方各设一个**(单面板模式下同样位于面板上方);点击某侧工具栏的盘符只会在**该侧面板**导航或新建标签,点哪边哪边即成为活动面板;显示/隐藏仍由 **查看 → 工具栏 → 驱动器** 统一控制,两侧同步显隐; * **状态持久化**:退出时左右面板会分别保存当前打开的标签与选中标签,下次启动自动还原,并记忆当前活动面板; * **单面板回归一致**:关闭双面板后,行为与开启该功能前的单面板模式完全一致。 ### 7. 斑马纹(交替行着色) * 在 **详细信息** 视图下,列表行交替显示白色和浅灰色背景,显著提升长列表的视觉可读性; * 交替着色仅在**非深色模式**下生效,选中行保持系统高亮色,不与斑马纹冲突; * 默认开启,可在 **选项 → 文件/文件夹** 中关闭; * 不同于网格线(默认已关闭),斑马纹采用纯背景色渲染,视觉更柔和。 ### 8. 可配置的文件图标大小 * 在 **查看 → 图标大小** 子菜单中,可选择图标视图下文件的显示尺寸: * **16 px** — 小巧紧凑 * **24 px** — 适中 * **32 px** — 大图标(默认) * **48 px** — 超大图标 * 设置对所有标签页全局生效,切换后自动刷新; * 使用 WIC(Windows Imaging Component)对系统图标进行高质量缩放,确保 24 px、48 px 等非标准尺寸清晰锐利。 ### 9. 快速筛选(Quick Filter) * 在文件列表中**直接键入任意字符**,即可即时筛选出文件名包含该文本的文件和文件夹,无需打开筛选对话框; * 筛选范围同时覆盖**文件和文件夹**(与筛选对话框仅筛文件不同); * 底部显示筛选栏,左侧为当前输入文本,右侧为匹配数/总数(如 `12/45`); * 按 **Backspace** 删除末位字符,按 **Escape** 退出筛选并恢复完整列表; * 输入停止 300 毫秒后自动执行筛选,避免频繁操作卡顿; * 快速筛选与筛选对话框互斥,激活快速筛选时自动关闭已有筛选。 ### 10. 默认配置变更 * **默认语言**改为简体中文(`LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED`); * **默认图标集**改为 `Fluent`(`IconSet::Fluent`),使用定制 Fluent 图标; * **配置存储**强制使用 XML 配置文件(`config.xml`),不再回退到注册表,确保便携一致; * **默认网格线**关闭(`showGridlines = false`),由斑马纹替代视觉分隔功能; * **默认视图**改为**详细信息**(`ViewMode::Details`); * **默认图标大小**为 **32 px**(`iconSize = 32`)。 * **默认目录变更通知模式**改为文件系统级(`changeNotifyMode = Filesystem`,虚拟文件夹自动回退 Shell 模式),详见第 12 节。 ### 11. 详细信息视图默认列宽自适应 * **首次显示详细信息视图时列宽自动铺满面板**:名称列宽度 = 列表面板宽度 − 其余可见列宽度之和,修改日期(150 px)、大小(85 px)、类型(170 px)、名称四列总宽恰好等于面板宽度,无横向留白或滚动条; * **对所有文件夹类型通用**:按当前文件夹的实际列集合统计其余列宽之和(普通文件夹、「此电脑」、回收站等列集合不同也能正确计算),不再依赖固定的列宽组合; * **尊重用户定制**:仅当名称列宽度未被用户调整(仍为默认值)时才应用动态宽度,用户手动改过列宽后不再覆盖; * **消除切换 / 加载闪屏**:切换视图与切换文件夹期间暂时挂起列表重绘,刷新完成后再恢复,列表不再反复闪烁。 ### 12. 目录变更监听:默认文件系统级通知(虚拟文件夹自动回退) * **默认改用 `ReadDirectoryChangesW` 文件系统级监听**(`Config.h` 中 `changeNotifyMode` 默认 `Filesystem`):任何方式创建的文件都能即时显示,无需手动 F5 刷新; * 解决了上游默认 Shell 模式(`SHChangeNotifyRegister`)的固有缺陷:该模式是被动的广播订阅机制,**只有创建文件的程序主动调用 `SHChangeNotify` 才会收到通知**。第三方程序(如 PDF 编辑器拖出页面、部分下载工具)用普通文件 API 静默直写时,文件夹视图不会更新; * **虚拟文件夹自动回退**:「此电脑」、回收站等无文件系统路径的位置创建监听失败时,自动回退到原 Shell 机制(`DirectoryWatcherFactoryImpl.cpp`),行为与上游一致,父目录删除 / 重命名检测同样保留; * 对文件夹视图、左侧目录树等所有监听点统一生效;对 NTFS / FAT32 / exFAT 本地盘及 SMB 网络盘均有效; * 资源开销可忽略:每个标签页 1 个目录句柄 + 4 KB 缓冲区,无专用线程,空转时 CPU 占用为 0; * 仍可用命令行参数 `--notify shell` 强制切回纯 Shell 模式(见 `Documentation/CommandLine.md`)。 ### 13. 左右箭头键目录导航 * **右箭头(→)进入文件夹**:在文件列表中选中单个文件夹后按右箭头键,即可在当前标签页进入该文件夹,无需回车或双击;选中文件、多选或无选中时保持列表视图默认的箭头行为(移动焦点/水平滚动),互不干扰; * **左箭头(←)返回上一级**:按左箭头键直接退到上一级目录,与退格键(Backspace)行为一致; * 按住 Ctrl / Shift / Alt 时均不触发,与现有的 `Alt+←`(后退)、`Alt+→`(前进)、`Alt+↑`(向上)快捷键不冲突; * 实现位于 `ShellBrowser/ListView.cpp` 的 `OnListViewKeyDown`,对左右面板所有标签页统一生效。 ### 14. 文件操作后台化(删除 / 复制移动 / 粘贴不再卡界面) * **根因**:上游在 **UI 线程上同步调用** `IFileOperation::PerformOperations()`(`Helper/FileOperations.cpp`),该调用在操作完成前不返回。删除大容量文件夹进回收站时,shell 要枚举全部文件并做回收站簿记,主线程长时间卡在调用内,消息循环停摆,整个窗口无法操作;粘贴走的 shell `paste` 动词同理。且 UI 线程被堵期间 OLE 剪贴板跨单元封送所需的消息泵中断,其他粘贴操作也会超时失败; * **修复方案**:将删除、复制 / 移动到文件夹、粘贴(`paste` 动词)统一移到项目内置的 `ComStaThreadPoolExecutor`(STA 线程池,线程自带消息泵)上执行,配合 concurrencpp 协程 + `ResumeOnUiThread` 回 UI 线程收尾,与 `DirectoryModificationHandler` 的既有异步模式一致: * PIDL 克隆后按值传入工作线程,不借用列表项内部指针,操作期间切换目录也安全; * 删除确认框仍以主窗口为 owner 正常弹出,确认后的删除过程界面全程可操作,进度框可取消; * 删除完成后回到 UI 线程再写入撤销栈(`FileActionHandler::RecordDeletedItems`),并通过 `WeakPtr` 校验对象存活,中途关闭标签页 / 窗口不会崩溃; * **覆盖入口**:文件列表与左侧目录树的删除(Delete / Shift+Delete)、「复制到文件夹 / 移动到文件夹」、列表与目录树的粘贴(Ctrl+V); * **已知取舍**:列表视图粘贴后不再自动选中新粘贴的项(该功能依赖的 `FolderView` site 为非 agile 接口,不能跨线程调用),粘贴本身功能不受影响; * 未改动:拖放(drag-drop)、文本 / 图片等非 shell 数据的粘贴、重命名与新建文件夹等本身很快的操作。 ### 15. 撤销删除(Undo Delete)修复 * **修复现象**:删除文件到回收站后,右键空白处菜单顶部的「撤销删除」点击后无任何反应,文件不恢复,菜单项也不会消失; * **根因**:撤销时(`Helper/FileActionHandler.cpp` 的 `UndoDeleteOperation`)用删除前记录的**纯文件名**与回收站项的显示名做严格相等比较,而在较新的 Windows 版本上,回收站项的显示名返回的是**完整原始路径**(如 `C:\...\test.txt`)而非文件名,匹配永远失败,函数静默返回,撤销栈也不弹出; * **修复方案**:匹配前先用 `PathFindFileNameW` 从回收站项名字中提取文件名部分再比较——新系统(返回完整路径)与旧系统(返回文件名)两种形态均可正确匹配,文件成功恢复到原位置、原名不变。 *** ## 🔧 原版核心特性 * **完全便携**:配置可保存在注册表或配置文件(支持带参数的配置文件),免安装即可使用 * **标签式浏览**:方便地管理多个文件夹 * **文件预览**:选中文件时在显示窗格中实时预览 * **易记的快捷键**:快速导航 * **可自定义用户界面** * **完整拖放支持**:可与包括 Windows 资源管理器在内的其他应用交互 * **高级文件操作**:支持文件合并与拆分 * **修改文件日期与属性** * **保存目录列表** * **书签标签** * **搜索**:按文件名与属性搜索 * **多种视图**:图标、列表、详细信息、缩略图、平铺视图自由切换 * **文件筛选** * **ARM64 支持** * **现代化构建系统**:支持 WiX v5 与 CMake *** ## 🚀 构建 ### 使用 PowerShell(推荐) 运行脚本 `.\build.ps1` 可一键构建多平台 / 多配置版本: ```powershell # 构建全部平台与配置(默认) .\build.ps1 # 仅构建指定平台/配置 .\build.ps1 -Platforms x64 -Configurations Release # 清理 BIN 目录 .\build.ps1 -Clean ``` 参数说明: * `-Platforms`:`x64` / `Win32` / `ARM64`,默认三者全构建; * `-Configurations`:`Release` / `Debug`,默认两者全构建; * `-Clean`:构建前清理 `BIN` 目录。 ### 快速迭代脚本 如需快速验证代码改动,可用 `build-x64-release.bat`: ```bat build-x64-release.bat fast rem 仅构建主程序(推荐,速度快) build-x64-release.bat rem 全量构建(含约 30 个翻译 DLL) ``` ### 使用 Visual Studio * 打开 `Explorer++\Explorer++.sln` 直接构建; * 产物输出到 `BIN\` 目录。 ### 使用 CMake ```bash mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=C:/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake cmake --build . ``` *** ## 📦 目录结构 ``` Explorer++ ├── Explorer++/ # 主程序工程 │ └── Explorer++/res/icons/ │ ├── custom/ # 本定制版的 Fluent 风格图标(新增) │ └── windows-10/ # 上游默认图标(已由 custom 替换) ├── Plugins/ # 插件 ├── Translations/ # 多语言翻译 ├── Scripts/ ├── Documentation/ ├── build.ps1 # 一键构建脚本 └── build-x64-release.bat # 快速构建脚本 ``` *** ## 📄 文档 上游在线文档:[Read the Docs](https://explorerplusplus.readthedocs.io/en/latest/) *** ## 🙏 致谢 本项目基于上游 [BDib/ExplorerPlusPlusNG](https://github.com/BDib/ExplorerPlusPlusNG) 修改,原作者及所有贡献者: * David Erceg * Google/Jules * B Dib * 以及其他所有上游贡献者 *** ## 📃 许可证 上游 Explorer++ 采用 GPL-3.0 许可证。本定制版继续遵循相同的开源许可证发布,详情请见 `LICENSE`。