You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用RegGetValueW?Rust读取注册表常量来源问询

关于Windows注册表常量与windows-rs的使用解答

一、常量的原生来源

这些常量均为Windows原生API的标准定义:

  • HKEY_CURRENT_USER:注册表根键句柄常量,定义于Windows SDK的winreg.h头文件,指向当前用户的注册表分支
  • RRF_RT_REG_DWORD:RegGetValueW函数的参数常量,指定读取的注册表值类型为DWORD,同样来自winreg.h
  • ERROR_SUCCESS:Windows通用错误码,代表操作执行成功,定义于winerror.h头文件

二、能否通过windows-rs直接获取这些常量?

完全可以,windows-rs crate会完整绑定Windows原生API的所有常量,无需依赖其他crate:

  • HKEY_CURRENT_USER:可从windows::Win32::System::Registry模块中导入
  • RRF_RT_REG_DWORD:同样在windows::Win32::System::Registry模块下
  • ERROR_SUCCESS:定义在windows::Win32::Foundation模块中

以下是适配你需求的代码示例(读取主题相关DWORD值):

use windows::Win32::Foundation::{ERROR_SUCCESS};
use windows::Win32::System::Registry::{HKEY_CURRENT_USER, RegGetValueW, RRF_RT_REG_DWORD};

unsafe {
    let mut theme_value: u32 = 0;
    let mut value_size = std::mem::size_of::<u32>() as u32;
    // 读取"AppsUseLightTheme"值,判断系统主题模式
    let status = RegGetValueW(
        HKEY_CURRENT_USER,
        "Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize",
        "AppsUseLightTheme",
        RRF_RT_REG_DWORD,
        std::ptr::null_mut(),
        &mut theme_value as *mut _ as *mut _,
        &mut value_size,
    );

    if status == ERROR_SUCCESS {
        println!("当前系统主题:{}", if theme_value == 1 { "浅色模式" } else { "深色模式" });
    }
}

三、更简洁的高层封装方案

若觉得直接调用原生API繁琐,windows-rs还提供了RegistryKey类的高层封装,可简化注册表读取流程:

use windows::Win32::Foundation::{ERROR_SUCCESS, HANDLE};
use windows::Win32::System::Registry::{RegOpenKeyExW, KEY_READ, RegistryKey};
use windows::core::PCWSTR;
use windows::core::Result;

fn get_theme_mode() -> Result<()> {
    unsafe {
        let mut key_handle = HANDLE::default();
        if RegOpenKeyExW(
            HKEY_CURRENT_USER,
            PCWSTR::from_raw("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize".as_ptr()),
            0,
            KEY_READ,
            &mut key_handle,
        ) == ERROR_SUCCESS {
            let registry_key = RegistryKey::from_raw(key_handle)?;
            let light_mode_value: u32 = registry_key.GetValue("AppsUseLightTheme")?;
            println!("当前系统主题:{}", if light_mode_value == 1 { "浅色模式" } else { "深色模式" });
        }
        Ok(())
    }
}

内容的提问来源于stack exchange,提问作者Grayza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:32:12