在开发桌面应用时,经常需要向用户展示当前运行环境的基本情况,比如操作系统版本、CPU 型号、内存大小、显示器分辨率等。这些信息在 Tauri 中可以很方便地获取,通常通过 Rust 后端调用系统 API 或成熟的跨平台 crate,再暴露给前端使用。
以下将以最常用的 sysinfo crate 为例,演示如何一次性获取系统版本、硬件信息和显示器信息。
1. 添加依赖
在 src-tauri/Cargo.toml 中添加:
[dependencies]
sysinfo = "0.31" # 截至编写时最新稳定版
tauri = { version = "2", features = [] }
如果你还需要直接获取显示器信息,可以额外使用 tauri 内置的窗口 API 或借助 display-info 等 crate。这里我们先用 sysinfo+系统命令,再补充一个显示器查询的简单方法。
2. 编写 Rust 命令
在 src-tauri/src/lib.rs(或你的主命令文件)中,定义两个命令:
use sysinfo::{Components, System};
use tauri::command;
#[command]
fn get_system_info() -> String {
let mut sys = System::new_all();
sys.refresh_all();
let os_name = System::long_os_version().unwrap_or_default();
let kernel = System::kernel_version().unwrap_or_default();
let cpu_name = sys.cpus()
.first()
.map(|cpu| cpu.brand().to_string())
.unwrap_or_else(|| "Unknown".into());
let cpu_count = sys.cpus().len();
let total_memory = sys.total_memory(); // 单位: KB
let used_memory = sys.used_memory();
serde_json::json!({
"os": os_name,
"kernel": kernel,
"cpu": cpu_name,
"cpu_count": cpu_count,
"total_memory_kb": total_memory,
"used_memory_kb": used_memory,
})
.to_string()
}
#[command]
fn get_monitor_info() -> Result<String, String> {
// 方式一: 使用 tauri 窗口 API 获取当前窗口所在显示器信息
// 需要在 invoke handler 中拿到 Window,见 tips 节
// 方式二: 使用 display-info crate (跨平台)
// 这里给出一个伪代码示例,需要添加 display-info 依赖
#[cfg(feature = "display-info")]
{
let displays = display_info::DisplayInfo::all()
.map_err(|e| e.to_string())?;
let info: Vec<_> = displays.iter().map(|d| {
serde_json::json!({
"name": d.name.clone(),
"width": d.width,
"height": d.height,
"refresh_rate": d.refresh_rate,
"is_primary": d.is_primary,
})
}).collect();
Ok(serde_json::json!(info).to_string())
}
#[cfg(not(feature = "display-info"))]
Err("display-info feature not enabled".into())
}
然后将这些命令注册到 Tauri 应用中:
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![
get_system_info,
get_monitor_info
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
3. 前端调用
在 React/Vue 或 HTML 中,通过 @tauri-apps/api 调用:
import { invoke } from '@tauri-apps/api/core';
async function loadSystemInfo() {
try {
const infoStr = await invoke('get_system_info');
const info = JSON.parse(infoStr);
console.log(info);
// info: { os, kernel, cpu, cpu_count, total_memory_kb, used_memory_kb }
} catch (e) {
console.error(e);
}
}
async function loadMonitorInfo() {
try {
const monitorsStr = await invoke('get_monitor_info');
const monitors = JSON.parse(monitorsStr);
console.log(monitors);
// array of { name, width, height, refresh_rate, is_primary }
} catch (e) {
console.error(e);
}
}
4. 实用细节
获取显示器信息的其他途径
- 使用
tauri::window::Window的available_monitors()方法
这种方法返回所有显示器的物理尺寸和工作区,但需要在一个命令中拿到 Window 对象。可以在 setup 钩子中获取主窗口并注入状态,或者让命令接受 app_handle:
use tauri::Manager;
#[command]
async fn get_monitors(app_handle: tauri::AppHandle) -> Result<String, String> {
let monitors = app_handle.available_monitors()
.map_err(|e| e.to_string())?;
let info: Vec<_> = monitors.iter().map(|m| {
serde_json::json!({
"name": m.name().unwrap_or_default(),
"size": { "width": m.size().width, "height": m.size().height },
"position": { "x": m.position().x, "y": m.position().y },
"scale_factor": m.scale_factor(),
"is_primary": m.is_primary().unwrap_or(false),
})
}).collect();
Ok(serde_json::to_string(&info).unwrap())
}
这种方式完全跨平台,不用额外依赖。
系统信息的实时刷新
sysinfo需要调用refresh_*方法才能更新数据。对于长期运行的应用,你可以定时刷新(例如每 10 秒),并通过 Tauri 的事件系统推送到前端。
权限与安全
- 获取系统信息一般不需要特殊权限,但某些具体细节(如进程列表、磁盘序列号)可能涉及隐私。Tauri 默认只允许你读取,不会自动泄露。如果你的应用需要这些功能,请在用户同意后使用。
5. 最终效果
假设你正在开发一个“设备信息”面板,使用上述代码后,前端页面可以清晰地展示:
- 操作系统:Windows 11 Pro 22H2
- 内核版本:19045.XXXX
- CPU:Intel Core i7-12700H(14 核)
- 内存:15.8 GB / 31.7 GB(已用 / 总计)
- 显示器:2 台,第一台 1920×1080@60Hz,第二台 2560×1440@144Hz
这些数据完全是真实的,来自用户设备,不需要任何第三方服务。
通过上述方法,你可以在 Tauri 应用中轻松获取系统版本、硬件和显示器信息,而且无需引入庞大依赖,内存占用依然保持极低水平。