[feat] more hw info including gpu + refactor fpstest
This commit is contained in:
@@ -11,6 +11,7 @@ use std::path::Path;
|
||||
use std::io::{BufRead, BufReader};
|
||||
use tauri::path::BaseDirectory;
|
||||
use tauri::Manager;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
// use tauri_plugin_shell::ShellExt;
|
||||
|
||||
@@ -368,9 +369,45 @@ pub async fn get_computer_info() -> Result<serde_json::Value, String> {
|
||||
return Ok(serde_json::json!({}));
|
||||
}
|
||||
|
||||
let json: serde_json::Value = serde_json::from_str(cleaned)
|
||||
let mut json: serde_json::Value = serde_json::from_str(cleaned)
|
||||
.map_err(|e| format!("解析 JSON 失败: {},原始输出: {}", e, cleaned))?;
|
||||
|
||||
// 对于 Windows 11,优先使用 OSDisplayVersion 获取版本代码(如 25H2)
|
||||
// 如果 OSDisplayVersion 存在且包含版本代码,提取它
|
||||
if let Some(os_display_version) = json.get("OSDisplayVersion").and_then(|v| v.as_str()) {
|
||||
// OSDisplayVersion 格式可能是 "25H2" 或 "Windows 11 版本 25H2" 等
|
||||
// 尝试提取版本代码(如 25H2)
|
||||
if let Some(capture) = regex::Regex::new(r"(\d+H\d+)")
|
||||
.ok()
|
||||
.and_then(|re| re.captures(os_display_version))
|
||||
{
|
||||
if let Some(version_code) = capture.get(1) {
|
||||
json["ReleaseId"] = serde_json::Value::String(version_code.as_str().to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果没有从 OSDisplayVersion 获取到版本代码,尝试从注册表获取 ReleaseId
|
||||
if !json.get("ReleaseId").and_then(|v| v.as_str()).is_some() {
|
||||
let release_id_output = Command::new("powershell")
|
||||
.args(&[
|
||||
"-NoProfile",
|
||||
"-Command",
|
||||
"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; try { (Get-ItemProperty -Path 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion').ReleaseId } catch { $null }"
|
||||
])
|
||||
.output()
|
||||
.await;
|
||||
|
||||
if let Ok(release_output) = release_id_output {
|
||||
if release_output.status.success() {
|
||||
let release_str = String::from_utf8_lossy(&release_output.stdout).trim().to_string();
|
||||
if !release_str.is_empty() {
|
||||
json["ReleaseId"] = serde_json::Value::String(release_str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(json)
|
||||
}
|
||||
|
||||
@@ -379,4 +416,63 @@ pub async fn get_computer_info() -> Result<serde_json::Value, String> {
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
pub async fn get_computer_info() -> Result<serde_json::Value, String> {
|
||||
Ok(serde_json::json!({}))
|
||||
}
|
||||
|
||||
/// GPU 信息结构体
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct GpuInfo {
|
||||
vendor: String,
|
||||
model: String,
|
||||
family: String,
|
||||
device_id: String,
|
||||
total_vram: u64,
|
||||
used_vram: u64,
|
||||
load_pct: u32,
|
||||
temperature: f64,
|
||||
}
|
||||
|
||||
/// 辅助函数:格式化字节数
|
||||
fn format_bytes(bytes: u64) -> String {
|
||||
let gb = bytes as f64 / 1024.0 / 1024.0 / 1024.0;
|
||||
if gb >= 1.0 {
|
||||
format!("{:.2}GB", gb)
|
||||
} else {
|
||||
let mb = bytes as f64 / 1024.0 / 1024.0;
|
||||
format!("{:.2}MB", mb)
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取 GPU 信息
|
||||
#[tauri::command]
|
||||
pub fn get_gpu_info() -> Result<Option<GpuInfo>, String> {
|
||||
use gfxinfo::active_gpu;
|
||||
|
||||
match active_gpu() {
|
||||
Ok(gpu) => {
|
||||
let info = gpu.info();
|
||||
let temp = info.temperature() as f64 / 1000.0;
|
||||
|
||||
Ok(Some(GpuInfo {
|
||||
vendor: gpu.vendor().to_string(),
|
||||
model: gpu.model().to_string(),
|
||||
family: gpu.family().to_string(),
|
||||
device_id: gpu.device_id().to_string(),
|
||||
total_vram: info.total_vram(),
|
||||
used_vram: info.used_vram(),
|
||||
load_pct: info.load_pct(),
|
||||
temperature: temp,
|
||||
}))
|
||||
}
|
||||
Err(e) => {
|
||||
println!("✗ GPU 信息获取失败: {}", e);
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取显示器信息(非 Windows 平台返回空)
|
||||
#[tauri::command]
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
pub async fn get_monitor_info() -> Result<Vec<MonitorInfo>, String> {
|
||||
Ok(vec![])
|
||||
}
|
||||
@@ -170,6 +170,8 @@ fn main() {
|
||||
cmds::download_app_update,
|
||||
cmds::install_app_update,
|
||||
cmds::get_computer_info,
|
||||
cmds::get_gpu_info,
|
||||
cmds::get_monitor_info,
|
||||
on_button_clicked
|
||||
])
|
||||
.run(ctx)
|
||||
|
||||
Reference in New Issue
Block a user