Skip to main content

右键菜单

右键菜单

根键全称简写描述
HKEY_CLASSES_ROOTHKCR包含了文件类型(扩展名)与应用程序之间的关联信息,以及这些应用程序的上下文菜单项(右键菜单)等。
HKEY_CURRENT_USERHKCU包含了当前登录用户的配置信息,如桌面设置、网络连接等。
HKEY_LOCAL_MACHINEHKLM包含了计算机上所有用户的配置信息,以及系统的硬件和软件配置。
HKEY_USERSHKU包含了计算机上所有用户的配置信息,但通常不直接访问,而是通过HKCU或特定的用户SID来访问。
HKEY_CURRENT_CONFIGHKCC包含了系统当前的硬件配置信息,是HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current的一个快捷方式。

对应位置

相关路径说明备注
HKEY_CLASSES_ROOT\*\shell\文件右键使用"%1"获取当前右键的文件
HKEY_CLASSES_ROOT\Directory\Background\shell\目录右键使用"%W"可以获取当前目录
HKLM\SOFTWARE\Classes\Directory\background\shell\ 系统软件目录?
HKCR\*系统所有文件,右键系统任一文件都会添加右键菜单
HKCR\AllFilesystemObjects系统所有文件和文件夹,右键任一文件或者文件夹都会添加右键菜单
HKCR\Folder系统所有文件夹,右键系统任一文件夹都会添加右键菜单
HKCR\Directory系统所有目录,右键系统任一文件夹都会添加右键菜单
HKCR\Directory\Background系统文件夹空白处右键,在文件夹内空白处右键都会添加右键菜单

分类

  • 桌面右键:HKEY_CLASSES_ROOT\DesktopBackground\Shell\
  • 文件夹右击空白处弹出菜单:HKEY_CLASSES_ROOT\Directory\shell\
  • 右击单个文件弹出菜单:HKEY_CLASSES_ROOT\.testHKEY_CLASSES_ROOT\*
  • 右击多个文件弹出菜单:
  • 右击单个文件夹弹出菜单:
  • 右击多个文件夹弹出菜单:
  • 右击文件和文件夹组合时弹出菜单:

注册表参数

参数和解释

参数解释
%*所有参数,我测试结果是快捷方式的参数
%0、%1文件路径
%2 - %9第二到第九个参数,快捷方式的参数
%D当前目录路径
%H意义不明,但测试结果都是0
%I意义不明,每次都是:num:num格式,每次都会改变
%L%1,不过是固定长路径,所以都说这个更好
%S意义不明,但测试结果都是1
%V文件路径
%W当前文件的父目录的路径

多级菜单

多级菜单的

HKEY_CLASSES_ROOT\*\shell\为例,如果需要在这里添加一个含有二级菜单的右键选项名称定为一级菜单

创建多级菜单HKEY_CLASSES_ROOT*\shell\一级菜单`,然后添加一个字段: SubCommands={二级菜单1};{二级菜单2}

其中这里面的{二级菜单1~2}意思是关联到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell下存放的对应子菜单

右键菜单配置(commamd)

配置键配置含义
icon菜单中显示的图标,一般用ico图标文件。也可以直接填exe可执行程序文件,此时直接用该可执行程序的图标。不填则不显示,文件不存在显示白板。
MuiVerb菜单显示名字,不填则默认用注册表的名字
SubCommands多级菜单时需要,子级菜单生成到以下位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
MultiSelectModel官方解释Single:右击单个文件、Document:最多选15个文件、Player:看文档,相当于没限制。经测试不要这一项用的Document限制

快速添加多级菜单(live-server)

以下脚本在注册表快速添加一级菜单和二级菜单

@REM @Author: CPS
@REM @email: 373704015@qq.com
@REM @Date: 2024-08-23 14:36:54.773666
@REM Last Modified by: CPS
@REM Last Modified time: 2024-08-23 14:36:54.773666
@REM Modified time: 2024-08-23 14:36:54.773666
@REM @file_path "W:\CPS\MyProject\projsect_persional\python-file-scripts\setup"
@REM @Filename "test.bat"

@echo off && setlocal enabledelayedexpansion
@chcp 65001

set "main_menu_name=Cps Scripts"
set "sub_menu_name=run-liver-server"

rem set "command_path=\"W:\CPS\python\python310_64\python.exe\""
rem set "srcript_path=\"W:\CPS\MyProject\projsect_persional\python-file-scripts\src\word2pdf\word_to_pdf_by_word.py\" \"%%W\""
rem set "command=!command_path! !srcript_path!"
set "command=cmd.exe /c live-server"

set "main_menu_SubCommands=!sub_menu_name!"
set "MAIN_MENU_KEY=HKCR\Directory\Background\shell\%main_menu_name%"
set "SUB_MENU_KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\%sub_menu_name%"
set "FOUND=false"

REM 预检查
reg query "%MAIN_MENU_KEY%" >nul 2>&1
if %ERRORLEVEL% equ 1 (
REM 如果键不存在(ERRORLEVEL 为 1 表示 reg query 没有找到指定的键)
echo "不存在"
reg add "%MAIN_MENU_KEY%" /ve /d "%main_menu_name%" /f
) else (
echo "存在"
)

REM 查看二级菜单是否有值
set "EMPTY=EMPTYYYYYY"
set "old_SubCommands=%EMPTY%"
for /f "tokens=3" %%i in ('reg query "%MAIN_MENU_KEY%" /v SubCommands') do (
set "value=%%i"
:: 去除值数据前后的引号(如果有的话)
set "value=!value:"=!"
rem echo The value of rem echo '这里创建二级菜单' is: !value!

rem 将新旧rem echo '这里创建二级菜单'进行合并

set "main_menu_SubCommands=!value!;!sub_menu_name!"
set "old_SubCommands=!value!"
)

REM 判断是否已存在相同的菜单
for /f "tokens=1* delims=;" %%a in ("%old_SubCommands%") do (
if "%%a"=="%sub_menu_name%" set "found=true"
if not "%%b"=="" (
echo.%%b | findstr \"^\" >nul && (
for /f "delims=;" %%i in ("%%b") do (
if "%%i"=="%sub_menu_name%" set "found=true"
)
)
)
)

if "%found%"=="true" (
echo "已经有一级菜单,进行二级菜单更新"
goto ADD_SUB_MENU_COMMAND
) else (
echo "未有菜单,进行更新"
)

:ADD_SUB_MENU
rem echo '这里创建一级菜单关联键'
reg add "%MAIN_MENU_KEY%" /v SubCommands /t REG_SZ /d !main_menu_SubCommands! /f

:ADD_SUB_MENU_COMMAND
rem echo '这里创建二级菜单'
reg add "%SUB_MENU_KEY%" /f
reg delete "%SUB_MENU_KEY%" /ve /f
reg add "%SUB_MENU_KEY%\command" /ve /d "%command%" /f

rem reg query "%SUB_MENU_KEY%" >nul 2>&1
rem if %ERRORLEVEL% equ 1 (
rem REM 如果键不存在(ERRORLEVEL 为 1 表示 reg query 没有找到指定的键)
rem reg add "%SUB_MENU_KEY%" /f
rem reg delete "%MAIN_MENU_KEY%" /ve /f
rem )

rem reg query "%SUB_MENU_KEY%\command" >nul 2>&1
rem if %ERRORLEVEL% equ 1 (
rem reg add "%SUB_MENU_KEY%\command" /ve /d "\"%command%\"" /f
rem )


:EXIT
pause
exit /b

快速新建脚本

任意目录右键

@echo off
@charset utf-8
chcp 65001 > nul

setlocal EnableDelayedExpansion

REM 定义变量
set "menu_name=CpsScripts Word转pdf"
set "command_path=\"W:\CPS\python\python310_64\python.exe\""
set "srcript_path=\"W:\CPS\MyProject\projsect_persional\python-file-scripts\src\word2pdf\word_to_pdf_by_word.py\" \"%%V\""

set "command=!command_path! !srcript_path!"

REM 添加任何目录的右键菜单中
reg add "HKCR\Directory\Background\shell\%menu_name%" /ve /d "%menu_name%" /f
reg add "HKCR\Directory\Background\shell\%menu_name%\command" /ve /d "!command!" /f

echo 添加右键菜单项完成!
exit /b

参阅文献