【Rust 实战】注册表之自定义Windows11任务栏位置(下

简介: 【Rust 实战】注册表之自定义Windows11任务栏位置(下

0x00 写在前面的话


上节课了解了使用Rust才操作注册表的一些常用方法,这节课我们就用这些方法来实现“Windows11自定义任务栏位置”这个小工具。 


0x01 &str转LPCWSTR


上节介绍的方法中,所有参数都存在的一个LPCWSTR类型的参数。我们看源码可知,LPWSTR类型其实就是WCHAR类型的指针。WCHAR又是wchar_t类型,再继续看发现wchar_t原来就是一个无符号16位整数了。(下面内容截取自源码)

pub type LPCWSTR = *const WCHAR;
pub type WCHAR = wchar_t;
pub type wchar_t = u16;

其实这也是winapi里面带W方法所常用的Unicode编码类型了。那我们如何将&str类型转为所需的LPCWSTR类型呢。这就需要借助Rust提供的OsStr类型了。转换代码如下:

unsafe fn str_to_lpcwstr(str: &str) -> Vec<u16> {
    let result: Vec<u16> = OsStr::new(str).encode_wide().chain(once(0)).collect();
    return result;
}


0x02 封装注册表操作方法


为了便于操作注册表,在这里对相应的方法简单封装下。 


打开注册表


/// 打开注册表
/// [`main_hkey`] 是一个HKEY值,默认接收[`HKEY_CURRENT_USER`]等值
/// [`sub_key`] HKEY的子健
/// # Examples
/// Basic usage:
/// ```
/// let sub_key = "Software\\360\\333";
/// let hkey_result = reg_util::reg_open(HKEY_CURRENT_USER, sub_key);
/// ```
pub(crate) fn reg_open(main_hkey: HKEY, sub_key: &str) -> Result<HKEY, String> {
    unsafe {
        let mut hkey: HKEY = null_mut();
        let status = RegOpenKeyW(main_hkey,
                                 str_to_lpcwstr(sub_key).as_ptr(),
                                 &mut hkey);
        if status == SEC_E_OK {
            return Result::Ok(hkey);
        }
        return Result::Err(format!("status == {}", status));
    }
}


查询REG_BINARY的值


/// 查询注册表的REG_BINARY的值
pub(crate) fn reg_query_binary(hkey: &HKEY, key_name: &str) -> Vec<u8> {
    unsafe {
        let mut dword: DWORD = 0;
        let mut dtype: DWORD = 0;
        //查询
        let status = RegQueryValueExW(*hkey,
                                      str_to_lpcwstr(key_name).as_ptr(),
                                      null_mut(),
                                      &mut dtype,
                                      null_mut(),
                                      &mut dword);
        let mut data_binary: Vec<u8> = vec![0; dword as usize];
        if status == SEC_E_OK {
            // 存在值
            RegQueryValueExW(*hkey,
                             str_to_lpcwstr(key_name).as_ptr(),
                             null_mut(),
                             &mut dtype,
                             data_binary.as_mut_ptr(),
                             &mut dword);
        }
        return data_binary;
    }


保存REG_SZ类型的数据


/// 保存REG_SZ类型的数据
pub(crate) fn reg_save_binary(hkey: &HKEY, key_name: &str, value: &mut Vec<u8>) -> LSTATUS {
    unsafe {
        let status = RegSetValueExW(*hkey,
                                str_to_lpcwstr(key_name).as_ptr(),
                                0,
                                REG_BINARY,
                                value.as_mut_ptr(),
                                value.len() as u32);
        return status;
    }
}


0x03 开始编写小工具


打开注册表


首先,我们先打开相应的注册表。

const SUB_KEY: &str = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects3";
// 打开注册表
let hkey_result = reg_util::reg_open(HKEY_CURRENT_USER, SUB_KEY);


如果打开成功。我们再去查询当前的值。


查询注册表


我们即将查找的注册表是二进制值,判断第12个数据,如果是0x00 则表示左,0x01 则表示上,0x02 则表示右,0x03 则表示下。

let mut reg_value = reg_util::reg_query_binary(&hkey, ITEM_KEY);
let position_option = reg_value.get(12);
            match position_option {
                Some(LEFT) => {
                    println!("【当前任务栏的位置在屏幕左侧!】");
                }
                Some(RIGHT) => {
                    println!("【当前任务栏的位置在屏幕右侧!】");
                }
                Some(UP) => {
                    println!("【当前任务栏的位置在屏幕上方!】");
                }
                Some(DOWN) => {
                    println!("【当前任务栏的位置在屏幕下方!】");
                }
                Some(_) => {
                    println!("【读取任务栏的位置失败!UNKNOWN】");
                    return;
                }
                None => {
                    println!("【读取任务栏的位置失败!NONE】");
                    return;
                }
            }


修改注册表


我们接收键盘输入的数字,来修改注册表的值。这里仅接收0,1,2,3四个值。

let position = input_task_bar_position();
            if position > 3 {
                println!("输入错误!");
                return;
            }
            // 正确输入,构建二进制值
            reg_value[12] = position;
            // 保存注册表
            let status = reg_util::reg_save_binary(&hkey, ITEM_KEY, &mut reg_value);
            if status == SEC_E_OK {
                println!("修改成功!正在重启资源管理器......");
                reboot_explorer();
                println!("重启资源管理器成功!");
                exit(0);
            } else {
                println!("修改失败!");
            }


0x04 小结


至此,整个小工具就结束了。其实这里仅仅借此小工具来练习下使用Rust操作注册表。其实只要掌握如何使用Rust操作注册表的基本技巧,你们windows注册表的各种设置都不在话下了。

相关文章
|
6月前
|
Java 开发工具
鸿蒙Flutter实战:02-Windows环境搭建踩坑指南
本指南介绍如何搭建鸿蒙Flutter开发环境,包括下载Flutter SDK、配置环境变量(如FLUTTER_STORAGE_BASE_URL、PUB_HOSTED_URL、DEVECO_SDK_HOME等)和检查工具版本。还提到避免项目路径过深、与SDK同盘存放等注意事项,以及解决VsCode无法识别设备的方法。
165 0
|
5月前
|
Rust 安全 编译器
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第26天】Rust语言诞生于2006年,由Mozilla公司的Graydon Hoare发起。作为一门系统编程语言,Rust专注于安全和高性能。通过所有权系统和生命周期管理,Rust在编译期就能消除内存泄漏等问题,适用于操作系统、嵌入式系统等高可靠性场景。
293 2
|
5月前
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
344 1
|
6月前
|
人工智能 监控 安全
掌握Windows管理利器:WMI命令实战
本文介绍了Windows Management Instrumentation (WMI) 的基本概念和用途,通过多个实用的`wmic`命令示例,如获取CPU信息、查看操作系统详情、管理服务、检查磁盘空间等,展示了WMI在系统维护中的强大功能。适合IT专业人士学习和参考。
300 4
|
6月前
|
Rust 编译器 开发者
Rust宏之derive的设计及实战
【10月更文挑战第18天】在 Rust 中,`derive` 宏是一种自动生成代码的工具,可为结构体和枚举类型自动实现特定 trait,减少重复代码。它通过语法糖简化代码,支持 Debug、Clone、PartialEq 等 trait 的自动实现,并允许开发者自定义 `derive` 宏以扩展功能。
142 1
|
7月前
|
JSON Rust 安全
30天拿下Rust之实战Web Server
30天拿下Rust之实战Web Server
127 7
|
8月前
|
API Docker Windows
2024 Ollama 一站式解决在Windows系统安装、使用、定制服务与实战案例
这篇文章是一份关于Ollama工具的一站式使用指南,涵盖了在Windows系统上安装、使用和定制服务,以及实战案例。
2024 Ollama 一站式解决在Windows系统安装、使用、定制服务与实战案例
|
6月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
8月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
182 1
|
8月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境