在视频播放、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 处理,代码较长不推荐
}
这种方式需要手动适配三个平台,且容易在异常退出时忘记释放电源锁。除非有特殊定制需求,否则直接使用社区插件是最稳妥省心的实践。