本文档提供了一份全面的指南,用于开发新的 PowerToys 模块,包括模块接口要求、集成点和开发工作流。它涵盖了创建与 PowerToys 运行器和设置系统无缝集成的 PowerToy 所需的技术实现细节。
有关创建 PowerToys Run 插件的详细信息,请参阅创建 PowerToys Run 插件。有关通用构建设置说明,请参阅从源文件构建。有关模块加载系统如何工作的详细信息,请参阅模块加载系统。
PowerToys 系统遵循模块化架构,其中各个实用程序作为独立的模块实现,由主运行器进程动态加载。
来源: src/runner/main.cpp149-200 src/runner/settings_window.cpp40-55 src/modules/interface/powertoy_module_interface.h src/runner/powertoy_module.h
每个 PowerToy 模块都必须实现 PowertoyModuleIface 接口,该接口定义了运行器和各个模块之间的契约。
来源: src/modules/interface/powertoy_module_interface.h src/runner/powertoy_module.h
运行器维护一个已知的模块列表,这些模块在启动时加载。新模块必须添加到此列表中才能被系统识别。
来源: src/runner/main.cpp149-200 src/runner/powertoy_module.cpp
遵循已建立的目录结构模式创建您的模块
src/modules/yourmodule/
├── dll/ # Main module DLL project
│ ├── YourModule.vcxproj # C++ project for module interface
│ ├── dllmain.cpp # DLL entry point and powertoy_create()
│ └── pch.h # Precompiled headers
├── lib/ # Optional: shared library code
├── ui/ # Optional: UI components (WPF/WinUI3)
└── tests/ # Unit tests
创建实现 PowertoyModuleIface 的主模块类
| 方法 | 目的 | 必需的实现 |
|---|---|---|
get_key() | 唯一的模块标识符 | 返回常量字符串,例如 L"YourModule" |
get_config() | 当前模块设置 | 返回 JSON 配置对象 |
set_config() | 应用新设置 | 解析 JSON 并更新模块状态 |
enable()/disable() | 模块生命周期 | 启动/停止模块功能 |
is_enabled() | 状态检查 | 返回当前启用状态 |
get_hotkeys() | 热键注册 | 返回模块热键的向量 |
call_custom_action() | 设置操作 | 处理来自设置 UI 的自定义命令 |
在您的 DLL 中实现必需的工厂函数
工厂函数必须使用 C 语言链接导出,并创建您的模块类实例。模块加载器在启动过程中会调用此函数。
来源: src/runner/main.cpp186-188 src/modules/*/dll/dllmain.cpp
在运行器的已知模块列表中注册您的模块
来源: src/runner/main.cpp149-180
PowerToys 模块通过 JSON 配置和运行器与设置 UI 之间的 IPC 通信与设置系统集成。
来源: src/runner/settings_window.cpp150-168 src/runner/settings_window.cpp170-246
新模块必须包含在安装程序配置中才能随 PowerToys 一起部署。
将您的模块文件添加到安装程序中的相应组件组
在安装程序的 heat 文件或手动组件定义中为您的模块文件创建组件定义。
来源: installer/PowerToysSetup/Product.wxs54-83 installer/PowerToysSetup/*.wxs
将运行器项目设置为您的启动项目,并使用开发指南中记录的调试技术。如果您的模块 DLL 位于已知的模块列表中,运行器将自动加载它。
来源: doc/devdocs/readme.md124-134 src/runner/main.cpp96-99
PowerToys 提供了一个项目模板来引导新的模块开发。该模板包括基本项目结构、接口实现存根和构建配置。