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

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

0x00 说在前面的废话


本文暂不适合Rust新手观看!!!


2021年10月5日这一天注定是不寻常的一天......因为“巨硬”发布了Windows 11。本人在第一时间装了Windows 11。体验还算不错,下面是windows 11的开始菜单啦。感觉又要适应一段时间了。但是发现了一个问题,这货!任务栏不能改!位!置!这难不倒我吧,,上网查资料发现可以通过修改注册表来更改任务栏的位置。看到这里,要不咱们就用Rust来大干一场,正好练习下Rust的winapi。后来......就有了这篇文章。


本文也正好借此机会说下Rust使用winapi的一些坑。如果您是一直从事winapi开发的大佬,恳请大佬批评改正。本人对winapi也不是很熟悉,且Rust版的winapi也没有文档,只能通过C++的文档来写了,难免存在不足之处。

微信图片_20230107144951.jpg

 

0x01 自定义windows11的任务栏位置


微软虽然没有提供修改任务栏位置的设置项,但是仍然可以通过修改注册表来达到改变任务栏的位置。操作注册表前建议备份注册表。打开注册表编辑器,定位到:\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3,然后双击 Settings 打开。

0a2653c851af460fa595bd959398a8f1.png

在打开的二进制编辑器中,找到红框标注的 03(FE 下方的那个),将其修改为 00(左)、01(上)、02(右),接着使用软媒魔方重启 Windows 资源管理器,即可改变任务栏位置。

微信图片_20230107144951.jpg

经过本人的亲测,任务栏在上下方式没有任何问题的,但是在左右两侧,会导致中间的图标显示不出来。下面是效果图。

微信图片_20230107144951.jpg

 

0x02 操作注册表的常用方法


要操作Windows注册表一定需要winapi,本节课所使用的winapi库是0.3.9版本(截至写这篇文章时是最新的)。操作注册表无非就是增、删、改、查这四个方法啦。在winapi里面分别对应RegCreateKeyRegDeleteKeyRegSetValueRegQueryValue,最后再加上一个创建方法RegOpenKey


简单介绍下这几个常用的相关方法吧。 

RegCreateKeyExW


该方法是用来创建一个项。这个方法有9个参数,不要被吓到。有很多参数默认就可以。第一个是HKEY类型,可以传微软默认的5个值之一。这里以HKEY_CURRENT_USER为例。第二个参数是创建的项的名称(该字段是LPCWSTR类型,后面会介绍如何构建这个类型),第三到第五个参数,以及第七个参数按照下方默认来写即可。第六个参数,是创建子键后的结果,是一个HKEY类型。

let mut hkey: HKEY = null_mut();
let mut lp: Vec<u16> = OsStr::new("Software\\360\\333").encode_wide().chain(once(0)).collect();
let create_result = RegCreateKeyExW(HKEY_CURRENT_USER, lp.as_ptr(), 0, null_mut(), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, null_mut(), &mut hkey, null_mut());


RegDeleteKeyExW


该方法是用来删除一个项。请谨慎使用该方法,一旦删除,将不可逆转。这个方法有4个参数,第一个参数同RegCreateKeyExW方法的第一个参数。第二个参数是要删除项的名称。第三和第四按照以下代码默认即可。

let mut lp: Vec<u16> = OsStr::new("Software\\360\\333").encode_wide().chain(once(0)).collect();
let result = RegDeleteKeyExW(HKEY_CURRENT_USER, lp.as_ptr(), KEY_ALL_ACCESS, 0);


RegSetValueExW


该方法是用来修改一个键值。请谨慎使用该方法,一旦修改,将不可逆转。该方法有6个参数,第一个参数是HKEY类型的参数,通常传递RegOpenKey方法返回的参数。第二个参数是要修改值的键名。第三个参数默认0即可。第四个参数是你要修改值的类型,通常有REG_SZREG_BINARYREG_DWORDREG_DWORD_LITTLE_ENDIANREG_DWORD_BIG_ENDIAN等10多种类型。第五个参数就是要修改的值了。第六个参数则是新值的占内存的长度了。

let mut lp: Vec<u16> = OsStr::new("Software\\360\\333").encode_wide().chain(once(0)).collect();
let mut val: Vec<u16> = OsStr::new("ABCD").encode_wide().chain(once(0)).collect();
let result = RegSetValueExW(hkey, key.as_ptr(), 0, REG_SZ, val.as_ptr() as *const u8, (size_of_val(&val) as u32));


RegQueryValueExW


该方法是用来查询一个键的当前值内容。该方法也拥有6个参数。第一个参数是HKEY类型的参数,通常传递RegOpenKey方法返回的参数。第二个参数是要修改值的键名称。第三个参数模式为null_mut(),第四个参数是保存当前查询值的类型。第五个参数是保存当前值的数据内容。第六个参数是保存当前数据的长度。此方法需要调用两次。第一次是仅获取返回的数据长度,第二次调用时收集数据。因此第一次调用时,第五个参数可以为null_mut(),第二次调用时则是一个带有长度的数组了。


let mut dword: DWORD = 0;
let mut dtype: DWORD = 0;
//查询
let status = RegQueryValueExW(*hkey, lp.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);
    }


RegOpenKeyW


该方法用来打开一个注册表项。这个方法很简单,该方法有三个参数。第一个参数是HKEY类型的参数,第二个是子项的名称,第三个是打开后保存的HKEY结果。


let mut hkey: HKEY = null_mut();
let mut lp: Vec<u16> = OsStr::new("Software\\360\\333").encode_wide().chain(once(0)).collect();
let status = RegOpenKeyW(HKEY_CURRENT_USER, lp.as_ptr(), &mut hkey);


0x03 小结


本节课简单介绍了下使用Rust来操作注册表常用的几个参数。其实跟C++大同小异,有一点儿要注意的是Windows的16字宽的编码,下节再讲解。另外我们离windows11注册表修改的工具还比较远,希望大家耐心读文章。 

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