菜单

进程间通信

相关源文件

目的与范围

本文档描述了 PowerToys 中用于协调主运行程序和设置 UI 应用程序的进程间通信 (IPC) 系统。这包括基于命名管道的通信机制、JSON 消息协议以及进程生命周期管理。

有关常规设置管理和配置存储的信息,请参阅 设置管理。有关模块加载系统详细信息,请参阅 模块加载系统

架构概述

PowerToys 使用双向命名管道 IPC 系统,以实现主 PowerToys 运行程序 (PowerToys.exe) 和设置 UI 应用程序 (PowerToys.Settings.exe) 之间的实时通信。此架构允许设置 UI 作为单独的进程运行,同时与正在运行的 PowerToys 模块保持同步的配置状态。

来源: src/runner/settings_window.cpp34-38 src/runner/settings_window.cpp489-490 src/runner/main.cpp84-94

命名管道实现

IPC 系统使用 UUID 创建两个命名管道,动态生成名称,以确保多个 PowerToys 实例之间的唯一性。

管道创建和命名

管道名称遵循以下模式:

  • 运行程序管道:\\.\pipe\powertoys_runner_{uuid}
  • 设置管道:\\.\pipe\powertoys_settings_{uuid}

来源: src/runner/settings_window.cpp344-365 src/runner/settings_window.cpp409-421

TwoWayPipeMessageIPC 类

核心 IPC 功能通过 TwoWayPipeMessageIPC 类实现,该类负责管理双向通信。

来源: src/runner/settings_window.cpp489-491 src/runner/settings_window.cpp520-527

消息类型和 JSON 协议

进程间的通信使用 JSON 消息,其中包含特定的消息类型,这些类型会触发接收进程中的不同行为。

核心消息类型

消息类型方向目的处理函数
general设置→运行程序应用常规设置更改apply_general_settings()
powertoys设置→运行程序更新模块配置dispatch_json_config_to_modules()
refresh设置→运行程序请求当前设置状态get_all_settings()
action设置→运行程序执行系统操作dispatch_json_action_to_module()
bugreport设置→运行程序启动 bug 报告工具launch_bug_report()
killrunner设置→运行程序终止 PowerToys 进程窗口关闭消息

来源: src/runner/settings_window.cpp185-244

JSON 消息结构

来源: src/runner/settings_window.cpp57-64 src/runner/settings_window.cpp170-246

进程生命周期管理

设置 UI 进程是按需启动的,并与运行程序保持持久通信,直到用户关闭设置窗口。

设置进程启动顺序

来源: src/runner/settings_window.cpp324-535 src/runner/tray_icon.cpp243-247

命令行参数

设置进程从运行程序接收以下参数:

  1. 可执行文件路径
  2. PowerToys 管道名称
  3. 设置管道名称
  4. PowerToys 进程 ID
  5. 主题设置(system / dark
  6. 提升状态(true / false
  7. 管理员状态(true / false
  8. 显示 OOBE 标志
  9. 显示 SCOOBE 标志
  10. 显示浮出窗口标志
  11. 设置窗口名称(可选)
  12. 浮出窗口坐标(可选)

来源: src/runner/settings_window.cpp409-435

消息分发和线程处理

IPC 系统在主 UI 线程上处理消息,以确保线程安全地更新 PowerToys 模块和 UI 状态。

线程安全的消息处理

来源: src/runner/settings_window.cpp248-259 src/runner/tray_icon.cpp49-62

实例间通信

PowerToys 还实现了更简单的 IPC 机制,用于通过 Windows 消息在多个 PowerToys 实例之间进行通信。

单实例强制执行

来源: src/runner/main.cpp84-94 src/runner/main.cpp392-397

安全性和错误处理

IPC 系统包含多项安全措施和错误处理机制,以确保稳健运行。

安全措施

  • 进程令牌验证:IPC 初始化需要有效的进程令牌。
  • 唯一的管道名称:基于 UUID 的命名可防止管道冲突。
  • 进程提升检查:设置 UI 尊重运行程序的提升级别。
  • 基于互斥体的实例控制:防止多个 PowerToys 实例。

错误恢复

  • 优雅的 IPC 清理:在设置 UI 进程终止时进行适当的清理。
  • 管道重新连接:自动处理管道断开连接的场景。
  • JSON 解析验证:格式错误的 JSON 消息将被记录并忽略。
  • 线程同步:用于 IPC 状态更改的互斥体保护。

来源: src/runner/settings_window.cpp482-533 src/runner/settings_window.cpp174-178 src/runner/settings_window.cpp35-36