Windows エクスプローラをレジストリでカスタマイズする

## はじめに

Windowsエクスプローラ関連のレジストリ覚書です。レジストリのことがよく分かっていない方は実施しないでください。  

## コンテキストメニューのカスタマイズ
[ASCII.jp：エクスプローラーの右クリックメニューをカスタマイズする (1/2)](https://ascii.jp/elem/000/000/953/953807/)  

|対象|レジストリキー|
|:----|:----|
|特定のファイル（拡張子）|`HKEY_CLASSES_ROOT\SystemFileAssociations\拡張子`|
|任意のファイル|`HKEY_CLASSES_ROOT\*`|
|全ファイル/フォルダ|`HKEY_CLASSES_ROOT\AllFilesystemObjects`|
|フォルダ|`HKEY_CLASSES_ROOT\Folder`（特殊フォルダを含む）<br>`HKEY_CLASSES_ROOT\Directory`（特殊フォルダは含まない）|
|ドライブ|`HKEY_CLASSES_ROOT\Drive`|
|デスクトップの背景|`HKEY_CLASSES_ROOT\DesktopBackground`|
|エクスプローラの余白|`HKEY_CLASSES_ROOT\Directory\Background`|

設定方法について  
[右クリックメニューにアイテムを追加する - Windows 10](https://www.billionwallet.com/goods/windows10/win10_mouse_rightclick.html)  

設定方法の詳細について    
[Windows レジストリ 解剖記: HKEY_CLASSES_ROOT - Programming Field](https://www.pg-fl.jp/program/winreg/classes.htm)  

## コンテキストメニューの階層化

### SubCommandsを使用

[ショートカット メニュー ハンドラーの作成 - Win32 apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/win32/shell/context-menu-handlers#creating-cascading-menus-with-the-subcommands-registry-entry)  

階層化の例  
![submenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/3e9fa50d-af49-b1be-4cc8-0be9bee7e20e.png)  
* `MUIVerb`にサブメニュー名を指定します。  
* `SubCommands`にサブメニューの中の項目を`;`で区切って指定します。  
* サブメニューの中の項目は`CommandStore`（場所は下記参照）内に作成します。  
```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\CascadeTest]
"MUIVerb"="サブメニュー"
"SubCommands"="submenu1;submenu2"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\submenu1]
@="メモ帳で開く"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\submenu1\command]
@="notepad.exe \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\submenu2]
@="ペイントで開く"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\submenu2\command]
@="mspaint.exe \"%1\""
```

### ExtendedSubCommandsKeyを使用

[右クリックに＊＊＊で実行を作る](http://var.blog.jp/archives/79111204.html)  

階層化の例  
![submenuext.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/23bf710a-f4ce-3454-72c5-be312f78b491.png)  
* `MUIVerb`にサブメニュー名を指定します。  
* `ExtendedSubCommandsKey`にサブメニュー項目を指定します。  
* サブメニュー項目を指定する場合は`HKEY_CLASSES_ROOT\`からの相対パスで指定します。例えばサブメニュー項目が`HKEY_CLASSES_ROOT\submenu1`にある場合は`submenu1`とします。  
* 指定したパスの`shell`配下のキーがサブメニューコマンドになります。例の場合は`HKEY_CLASSES_ROOT\submenu1\shell\***`がサブメニューコマンドになります。    
```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\CascadeTest]
"MUIVerb"="親メニュー"
"ExtendedSubCommandsKey"="submenu1"

[HKEY_CLASSES_ROOT\submenu1]

[HKEY_CLASSES_ROOT\submenu1\shell]

[HKEY_CLASSES_ROOT\submenu1\shell\notepad]
@="メモ帳"
"Icon"="\"C:\\Windows\\System32\\notepad.exe\""

[HKEY_CLASSES_ROOT\submenu1\shell\notepad\command]
@="notepad.exe \"%1\""

[HKEY_CLASSES_ROOT\submenu1\shell\paint]
@="ペイントブラシ"
"Icon"="mspaint.exe"

[HKEY_CLASSES_ROOT\submenu1\shell\paint\command]
@="mspaint.exe \"%1\""

[HKEY_CLASSES_ROOT\submenu1\shell\submenu]
"MUIVerb"="サブメニュー"
"ExtendedSubCommandsKey"="submenu2"
"CommandFlags"=dword:00000020

[HKEY_CLASSES_ROOT\submenu2]

[HKEY_CLASSES_ROOT\submenu2\shell]

[HKEY_CLASSES_ROOT\submenu2\shell\cmd]
@="コマンドプロンプト"
"Icon"="cmd.exe"

[HKEY_CLASSES_ROOT\submenu2\shell\cmd\command]
@="cmd.exe /s /k pushd \"%W\""
```

以下でも同じことができます。同じ階層にサブメニュー項目を配置しているので、こちらのほうがシンプルでよいかもしれません。
```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\CascadeTest]
"MUIVerb"="親メニュー"
"ExtendedSubCommandsKey"="*\\shell\\CascadeTest\\submenu1"

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu1]

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu1\shell]

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu1\shell\notepad]
@="メモ帳"
"Icon"="\"C:\\Windows\\System32\\notepad.exe\""

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu1\shell\notepad\command]
@="notepad.exe \"%1\""

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu1\shell\paint]
@="ペイントブラシ"
"Icon"="mspaint.exe"

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu1\shell\paint\command]
@="mspaint.exe \"%1\""

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu1\shell\submenu]
"MUIVerb"="サブメニュー"
"ExtendedSubCommandsKey"="*\\shell\\CascadeTest\\submenu2"
"CommandFlags"=dword:00000020

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu2]

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu2\shell]

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu2\shell\cmd]
@="コマンドプロンプト"
"Icon"="cmd.exe"

[HKEY_CLASSES_ROOT\*\shell\CascadeTest\submenu2\shell\cmd\command]
@="cmd.exe /s /k pushd \"%W\""
```


### ソフトウェアを使用（参考）

[pathcopyextensionの詳細情報 : Vector ソフトを探す！](https://www.vector.co.jp/soft/winnt/util/se525105.html)  

特定の拡張子のみにメニューを追加したい場合はソフトを使用するほうが楽です。  
![submenusoft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/fc2a013e-17c2-c8f2-4971-b24e0397df14.png)  
* `setting.xml`で拡張子ごとのメニューを設定します。以下は設定例です。  
```xml
<?xml version="1.0" encoding="utf-8"?>
<menus>
    <copypath>
        <enable>true</enable>
        <doublequotationmark>false</doublequotationmark>
        <lastNewLine>false</lastNewLine>
    </copypath>
    <extmenu ext=".txt">
        <menu name=".txt用メニュー">
            <button>
                <name>メモ帳で開く</name>
                <command>notepad.exe</command>
                <arg>__file__</arg>
                <each>true</each>
            </button>
	        <menu name="サブメニュー1">
	            <button>
	                <name>メモ帳で開く</name>
	                <command>notepad.exe</command>
	                <arg>__file__</arg>
	                <each>true</each>
	            </button>
		        <menu name="サブメニュー2">
		            <button>
		                <name>メモ帳で開く</name>
		                <command>notepad.exe</command>
		                <arg>__file__</arg>
		                <each>false</each>
		            </button>
		        </menu>
	        </menu>
        </menu>
    </extmenu>
    <extmenu ext=".csv">
        <button>
            <name>メモ帳で開く</name>
            <command>notepad.exe</command>
            <arg>__file__</arg>
            <each>true</each>
        </button>
    </extmenu>
</menus>
```
## コンテキストメニューにWindows標準メニューを追加する
以下のキーの配下にWindowsの標準メニューが存在します。例えばフォルダの新規作成であれば`Windows.newfolder`が該当します。  
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
```

例）「新しいフォルダ」を「エクスプローラの余白」を右クリックしたときに出てくるコンテキストメニューに追加したい場合は、  

1. レジストリエディタで対象のキー（今回は`Windows.newfolder`）を開きます。  
1. `Windows.newfolder`を右クリックして「エクスポート」を選択します。  
1. 適当に名前を付けて保存します。  
1. 保存したファイルを開いて`[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell`を`[HKEY_CLASSES_ROOT\Directory\Background\shell`に置換します。  
1. 保存したファイルを実行してレジストリに追加します。  

|キー|項目名|
|:----|:----|
|Windows.layout|レイアウト|
|Windows.previewpane|詳細ウィンドウ|
|Windows.readingpane|プレビュー ウィンドウ|
|Windows.navpane|ナビゲーション ウィンドウ|
|Windows.ShowFileExtensions|ファイル名拡張子|
|Windows.ShowHiddenFiles|隠しファイル|
|Windows.selectall|すべて選択|
|Windows.newfolder|新しいフォルダ|
|Windows.PinToHome|クイック アクセスにピン留めする|
|Windows.SizeAllColumns|すべての列のサイズを自動的に変更する|


## カレントディレクトリをPowerShellやコマンドプロンプトで開く

[カレントディレクトリをPowerShellやコマンドプロンプトで開く #Windows - Qiita](https://qiita.com/nekotadon/items/33ad68a5c692f7f36ea4)  

## ドライブレターの変更
[システム/ブート ドライブ文字を復元する - Windows Server | Microsoft Learn](https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/backup-and-storage/restore-system-boot-drive-letter)  

「ディスクの管理」から変更できない場合は、`HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices`を変更します。C:とD:を入れ替える場合は  
1. `\DosDevices\C:`を`\DosDevices\Z:`(未使用ドライブレターなら何でも可)に変更します。  
1. `\DosDevices\D:`を`\DosDevices\C:`に変更します。  
1. `\DosDevices\Z:`を`\DosDevices\D:`に変更します。  
1. Windowsを再起動します。  

## ドライブの非表示

[マイコンピュータのドライブを非表示にする | 日経クロステック（xTECH）](https://xtech.nikkei.com/it/pc/article/NPC/20060524/238879/)  

`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer`に`NoDrives`というDWORD値を作成し設定します。  

例）A,Fドライブを非表示にしたい場合は100001(2)。10進数に直して「33」を入力
```
隠したいドライブを1とする
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
```

## ユーザーフォルダの非表示
[エクスプローラーの「PC」に表示される、不要なユーザーフォルダを消す方法](https://so-zou.jp/software/tool/file/explorer/win10-thispc-folders/)  

`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\`配下の以下のキーの`ThisPCPolicy`の値をShowからHideに変更します。上記URLに一発で変更できるregファイルがあります。  
|対象|レジストリキー|
|:----|:----|
|ピクチャ|`{0ddd015d-b06c-45d5-8c4c-f59713854639}\PropertyBag`|
|ビデオ|`{35286a68-3c57-41a1-bbb1-0eae73d76c95}\PropertyBag`|
|ダウンロード|`{7d83ee9b-2244-4e70-b1f5-5393042af1e4}\PropertyBag`|
|ミュージック|`{a0c69a99-21c8-4671-8703-7934162fcf1d}\PropertyBag`|
|ドキュメント|`{f42ee2d3-909f-4907-8871-4c22fc0bf756}\PropertyBag`|
|デスクトップ|`{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}\PropertyBag`|
|3D オブジェクト|`{31C0DD25-9439-4F12-BF41-7FF4EDA38722}\PropertyBag`|

## アプリケーション実行可能ファイルの登録
[アプリケーションの登録 - Win32 apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/win32/shell/app-registration)  

登録するとパスを通すのと同じような状態になり、「アドレスバー」や「ファイル名を指定して実行」からファイル名のみで開くことができます。  

|対象|レジストリキー|
|:----|:----|
|実行ファイル(file.exe)|`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\file.exe`（全ユーザー）<br>`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\file.exe`（ユーザー毎）<br>`(既定)`に「file.exeへのフルパス」を設定|


## レジストリファイル(.reg)

[レジストリの特定のキーと値を一部/全部を削除する方法 - Windows 10](https://www.billionwallet.com/windows10/registry-delete.html)  

レジストリ登録時に日本語が文字化けしないように**UTF-16 LEで保存**します。  

登録する場合の例  
```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\memo]
@="メモ帳で開く"

[HKEY_CLASSES_ROOT\*\shell\memo\command]
@="notepad \"%1\""
```

値を削除する場合は値に「-」を指定します。  
```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\memo\command]
@=-
```
キーを削除する場合はキーの先頭に「-」を追加します。  
```
Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\*\shell\memo]
```

## regコマンド

[【Windows 10／11】regコマンドを使ってコマンドプロンプトからレジストリを操作する：Tech TIPS - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/0402/21/news005.html)  

|使用例|コマンド|
|:----|:----|
|キーや値を追加|`reg add <キー名> /v <値の名前> /t <値の種類> /d <値のデータ>`|
|確認なしでキーを削除|`reg delete <キー名> /f`|

詳細は[reg コマンド](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/reg)を参照願います。  


## その他参考

* [Registering Shell Extension Handlers - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/shell/reg-shell-exts)  
* [Windowsの右クリックメニューから複数ファイルをまとめて開く - Turgenev's Wiki](https://turgenev.cloudfree.jp/wiki/Windows%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E9%96%8B%E3%81%8F)  
* [不要なエクスプローラーの右クリックメニュー項目を削除してスッキリさせる【Windows 10】：Tech TIPS - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/0511/19/news016.html)  
* [Customizing a Shortcut Menu Using Dynamic Verbs - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/shell/shortcut-menu-using-dynamic-verbs)  
* [Creating Shell Extension Handlers - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/shell/handlers)  
* [Creating Shortcut Menu Handlers - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/shell/context-menu-handlers#creating-cascading-menus-with-the-subcommands-registry-entry)  
* [静的カスケード メニューの作成 - Win32 apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/win32/shell/creating-static-cascading-menus)  
* [How to Define Extended Verbs - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/shell/how-to-define-extended-verbs)  
* [Enhancing the "Open Command Prompt here" Context Menu experience | Microsoft Learn](https://learn.microsoft.com/en-us/archive/blogs/andrew_richards/enhancing-the-open-command-prompt-here-shift-right-click-context-menu-experience)  
* [Nonsubject: 8月 2011](http://nonsubject.arinco.org/2011/08/)