人人都会AI编程

10.5 系统信息获取:系统版本、硬件信息、显示器信息

更新时间:2026-07-11

在开发桌面应用时,经常需要向用户展示当前运行环境的基本情况,比如操作系统版本、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::Windowavailable_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 应用中轻松获取系统版本、硬件和显示器信息,而且无需引入庞大依赖,内存占用依然保持极低水平。