PowerToys 中的模块加载系统负责动态加载、初始化和管理所有 PowerToys 工具的生命周期。它提供了一个插件架构,允许单独开发各个工具,同时与 PowerToys 运行程序保持一致的接口。
本页介绍了 PowerToys 如何发现、加载和与模块 DLL 进行交互。有关创建新 PowerToy 模块的信息,请参阅创建新 PowerToy。
PowerToys 使用模块化架构,其中每个工具都实现为一个单独的 DLL,并实现通用接口。PowerToys 运行程序 (PowerToys.exe) 负责:
来源
所有 PowerToys 模块都必须实现PowertoyModuleIface接口,该接口定义了运行程序和每个模块之间的契约。此接口在powertoy_module_interface.h中定义。
接口的关键方法包括:
| 方法 | 目的 |
|---|---|
get_name() | 返回模块的本地化显示名称 |
get_key() | 返回模块的非本地化唯一标识符 |
enable() | 激活模块的功能 |
disable() | 禁用模块的功能 |
is_enabled() | 返回模块当前是否已启用 |
get_config() | 以 JSON 格式返回模块的当前配置 |
set_config() | 将新的配置设置应用于模块 |
call_custom_action() | 处理从“设置” UI 触发的自定义操作 |
destroy() | 在模块卸载前清理资源 |
来源
PowerToys 运行程序维护一个已知模块列表,这些模块被定义为 DLL 路径数组。
来源
模块加载过程遵循以下步骤:
load_powertoy(),该函数会:powertoy_create()函数。PowertoyModuleIface接口的模块的指针。start_enabled_powertoys()来激活之前启用的模块。来源
已加载的模块存储在一个映射表中,其中:
get_key()返回)。PowertoyModuleIface实例的智能指针。该集合通过modules()函数访问,该函数返回此映射表的引用。
来源
enable()方法之前,模块将保持非活动状态。enable()方法时:disable()方法时:get_config()方法来检索模块的当前配置。set_config()方法来更新模块的配置。来源
destroy()方法。destroy()返回后,运行程序会释放其对该模块的引用。来源
要实现 PowerToy 模块,DLL 必须:
PowertoyModuleIface接口。powertoy_create()函数,该函数返回模块的实例。以下是模块 DLL 的典型结构。
PowerRename 是 PowerToy 模块实现的绝佳示例。
来源
加载模块时,运行程序会实现错误处理,以确保一个模块的故障不会影响其他模块。
来源
PowerToys 模块可以与 Windows 组策略设置集成,以允许管理员控制可用功能。
gpo_policy_enabled_configuration()方法。来源