人人都会AI编程

13.7 电源管理、屏幕息屏控制

更新时间:2026-07-11

在视频播放、PPT 演示或长期运行的监控面板中,不少应用需要临时阻止操作系统进入屏幕关闭或系统休眠状态。Tauri 内核没有内置电源管理 API,但可通过 Rust 调用系统底层接口或直接使用社区插件安全完成。

推荐插件:tauri-plugin-prevent-screen-sleep

该插件由 Tauri 社区维护,封装了三大桌面平台的防休眠机制,调用方式统一、安全可靠。

  • Windows:调用 SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED),持续告知系统“正在执行重要任务”。
  • macOS:后台启动 caffeinate 进程,阻止系统进入睡眠期。
  • Linux:通过 D-Bus 向桌面环境(GNOME、KDE 等)发送 Inhibit 请求,兼容主流发行版。

安装与注册

src-tauri 目录下执行:

cargo add tauri-plugin-prevent-screen-sleep

然后修改 src-tauri/src/lib.rs,在 Builder 上挂载该插件:

fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_prevent_screen_sleep::init())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

前端控制

插件会自动暴露两个命名空间命令,前端仅需 invoke 即可:

import { invoke } from '@tauri-apps/api/core';

// 阻止屏幕息屏 / 系统休眠
await invoke('plugin:prevent-screen-sleep|prevent');

// 恢复正常电源管理策略
await invoke('plugin:prevent-screen-sleep|release');

实际应用建议

  • 在视频播放页或长时间渲染任务开始时调用 prevent,任务结束或页面卸载时务必调用 release,避免过度耗电。
  • 该插件内部维护一个计数器,多个 prevent 对应一次 release,因此只需在组件卸载时执行一次清理即可。
  • 对于不使用标准桌面环境的 Linux 发行版(如 i3wm),插件可能无法生效。此时可通过 tauri-plugin-shell 直接执行 systemd-inhibit --what=idle --why="app working" sleep infinity 作为备用方案,但并不推荐频繁启动外部进程。

手写 Rust 替代方案

如果对包体积极度敏感,也可以自行编写 Rust 命令来控制系统电源。以 Windows 为例:

#[cfg(windows)]
use windows::Win32::System::Power::SetThreadExecutionState;
use windows::Win32::System::Power::ES_CONTINUOUS;
use windows::Win32::System::Power::ES_SYSTEM_REQUIRED;
use windows::Win32::System::Power::ES_DISPLAY_REQUIRED;

#[tauri::command]
fn keep_awake() {
    #[cfg(windows)]
    unsafe {
        SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED);
    }
    #[cfg(target_os = "macos")]
    std::process::Command::new("caffeinate").arg("-d").spawn().ok();
    // Linux 可自行通过 dbus 或 systemd-inhibit 处理,代码较长不推荐
}

这种方式需要手动适配三个平台,且容易在异常退出时忘记释放电源锁。除非有特殊定制需求,否则直接使用社区插件是最稳妥省心的实践。