目标效果
实现原理
分别修改注册表的以下位置:
- HKEY_CLASSES_ROOT\CLSID
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace
手动操作版本
1 在HKEY_CLASSES_ROOT\CLSID创建一个项
项的名称为{uuid},uuid可以去这里生成:
https://www.uuidgenerator.net/version4
创建好大概是这个样子:
HKEY_CLASSES_ROOT\CLSID{cb7e1bbb-e695-49fc-8c57-222e35132aae}
2 给这个项创建属性,用于入口文案设置
包括默认生成的属性在内,一共四个,
名称 | 类型 | 数值 |
---|---|---|
(默认) | REG_SZ | 标题 |
InfoTip | REG_SZ | 鼠标悬浮提示 |
System.ItemAuthors | REG_SZ | 副标题 |
TileInfo | REG_SZ | prop:System.ItemAuthors |
3 创建子项,用于入口图标设置
在HKEY_CLASSES_ROOT\CLSID{cb7e1bbb-e695-49fc-8c57-222e35132aae}上右键创建一个项,命名为DefaultIcon,类型为可拓展的字符串,值为图标的绝对路径(格式为.ico)。
4 再次创建子项,用于设置入口对应的执行程序
在HKEY_CLASSES_ROOT\CLSID{cb7e1bbb-e695-49fc-8c57-222e35132aae}上右键创建一个项,命名为Shell,在Shell上创建Open项,再在Open上创建Command项,均为字符串类型。最后修改Command的值为目标程序的绝对路径。
4 在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace创建一个字符串项,名称用上面的{uuid}
值为空
5 验收成果
nodejs操作版本
1 首先你需要安装一个nodejs包用来修改注册表,这里推荐使用winreg
2 创建CLSID子项
import Registry from 'winreg'
// 设置文案
new Registry({ hive: Registry.HKCR, key: 'CLSID\\{cb7e1bbb-e695-49fc-8c57-222e35132aae}' })
.set('', Registry.REG_SZ, '标题', (err) => {
console.log('err', err)
})
.set('System.ItemAuthors', Registry.REG_SZ, '副标题', (err) => {
console.log('err', err)
})
.set('TileInfo', Registry.REG_SZ, 'prop:System.ItemAuthors', (err) => {
console.log('err', err)
})
.set('InfoTip', Registry.REG_SZ, '鼠标悬浮提示', (err) => {
console.log('err', err)
})
// 设置图标
new Registry({ hive: Registry.HKCR, key: 'CLSID\\{cb7e1bbb-e695-49fc-8c57-222e35132aae}\\DefaultIcon' })
.set('', Registry.REG_EXPAND_SZ, 'F:\\icon.ico', (err) => {
console.log('err', err)
})
// 设置执行程序
new Registry({ hive: Registry.HKCR, key: 'CLSID\\{cb7e1bbb-e695-49fc-8c57-222e35132aae}\\Shell\\Open\\Command' })
.set('', Registry.REG_SZ, 'F:\\xx.exe', (err) => {
console.log('err', err)
})
3 创建NameSpace子项
new Registry({ hive: Registry.HKCU, key: '\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{cb7e1bbb-e695-49fc-8c57-222e35132aae}' })
4 验收成果
注意:上面的部分操作需要管理员权限才能执行成功,所以你执行的控制台要以管理员方式启动。
如何修改名称为(默认)项的值?
如下图中的默认:
网上的资料是,key传空字符串,能够修改这个默认的值,但我最开始使用的是regedit这个库,结果会报错
import regedit from "regedit";
const promisifiedRegedit = regedit.promisified;
// 会创建一个默认项,但是值为空,如何修改他的值和类型呢?
await promisifiedRegedit.createKey([
'HKCR\\CLSID\\{cb7e1bbb-e695-49fc-8c57-222e35132aae}\\DefaultIcon',
])
// 报错Error: expected to have groups of 4 arguments for each value that is written to the registry
promisifiedRegedit.putValue({
[`HKCR\\CLSID\\{cb7e1bbb-e695-49fc-8c57-222e35132aae}\\DefaultIcon`]: {
"": {
value: valueData,
type: 'REG_EXPAND_SZ',
},
}
});
后来发现是这个regedit库的问题,换成winreg,能够成功
import Registry from 'winreg'
const regKey = new Registry({
hive: Registry.HKCR,
key: '\\CLSID\\{cb7e1bbb-e695-49fc-8c57-222e35132aae}\\DefaultIcon'
})
const valueData = 'C:\\Users\\gaoqi\\Desktop\\icon.ico';
// 第一个字符串传空字符
regKey.set('', 'REG_EXPAND_SZ', valueData)
在注册表中写入U盘中的文件路径,结果无效的问题
文件是存在的,但就是无效
F:\test\icon.ico
尝试改成电脑磁盘位置,有效
C:\test\icon.ico
尝试把图标移到U盘根目录,有效
F:\icon.ico
看来结果是,非U盘根目录是需要双引号才行
F:\test\icon.ico
批处理版本
里面有中文,需要以UTF-8编码保存。
@echo off
chcp 65001 > nul
set "current_path=%~dp0"
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{cb7e1bbb-e695-49fc-8c57-222e35132aae}" /f
reg add "HKEY_CLASSES_ROOT\CLSID\{cb7e1bbb-e695-49fc-8c57-222e35132aae}" /ve /t REG_SZ /d "标题" /f
reg add "HKEY_CLASSES_ROOT\CLSID\{cb7e1bbb-e695-49fc-8c57-222e35132aae}" /v "System.ItemAuthors" /t REG_SZ /d "副标题" /f
reg add "HKEY_CLASSES_ROOT\CLSID\{cb7e1bbb-e695-49fc-8c57-222e35132aae}" /v "TileInfo" /t REG_SZ /d "prop:System.ItemAuthors" /f
reg add "HKEY_CLASSES_ROOT\CLSID\{cb7e1bbb-e695-49fc-8c57-222e35132aae}" /v "InfoTip" /t REG_SZ /d "鼠标悬浮提示" /f
reg add "HKEY_CLASSES_ROOT\CLSID\{cb7e1bbb-e695-49fc-8c57-222e35132aae}\DefaultIcon" /ve /t REG_EXPAND_SZ /d "%current_path%icon.ico" /f
reg add "HKEY_CLASSES_ROOT\CLSID\{cb7e1bbb-e695-49fc-8c57-222e35132aae}\Shell\Open\Command" /ve /t REG_SZ /d "%current_path%xxx.exe" /f
@pause
批处理里面使用中文会导致命令无法识别
使用chcp命令修改字符编码为UTF-8
chcp 65001 > nul
批处理写入中文到注册表,会变成乱码
使用chcp命令修改字符编码为UTF-8(就算你的批处理文件是以UTF-8编码保存的,也要加这个命令,因为批处理的默认编码是由cmd或者powershell决定的,这里的命令是修改当前cmd或者powershell的字符编码。)
chcp 65001 > nul
使用chcp语法导致下两行的命令被吃掉部分字符
是由于换行的问题,批处理需要用\r\n
换行,所以你需要修改你的编辑器换行行为crlf,然后保存。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。