3

目标效果

image.png

实现原理

分别修改注册表的以下位置:

  1. HKEY_CLASSES_ROOT\CLSID
  2. 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标题
InfoTipREG_SZ鼠标悬浮提示
System.ItemAuthorsREG_SZ副标题
TileInfoREG_SZprop:System.ItemAuthors

image.png

3 创建子项,用于入口图标设置
在HKEY_CLASSES_ROOT\CLSID{cb7e1bbb-e695-49fc-8c57-222e35132aae}上右键创建一个项,命名为DefaultIcon,类型为可拓展的字符串,值为图标的绝对路径(格式为.ico)。
image.png

4 再次创建子项,用于设置入口对应的执行程序
在HKEY_CLASSES_ROOT\CLSID{cb7e1bbb-e695-49fc-8c57-222e35132aae}上右键创建一个项,命名为Shell,在Shell上创建Open项,再在Open上创建Command项,均为字符串类型。最后修改Command的值为目标程序的绝对路径。
image.png

4 在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace创建一个字符串项,名称用上面的{uuid}
值为空
image.png

5 验收成果
image.png

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 验收成果
注意:上面的部分操作需要管理员权限才能执行成功,所以你执行的控制台要以管理员方式启动。

如何修改名称为(默认)项的值?

如下图中的默认:
image.png

网上的资料是,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,然后保存。
image.png


热饭班长
3.7k 声望434 粉丝

先去做,做出一坨狗屎,再改进。