如何正确使用RegGetValueW?Rust读取注册表常量来源问询
关于Windows注册表常量与windows-rs的使用解答
一、常量的原生来源
这些常量均为Windows原生API的标准定义:
HKEY_CURRENT_USER:注册表根键句柄常量,定义于Windows SDK的winreg.h头文件,指向当前用户的注册表分支RRF_RT_REG_DWORD:RegGetValueW函数的参数常量,指定读取的注册表值类型为DWORD,同样来自winreg.hERROR_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
相关产品推荐
相关产品推荐

