Windows11のコンテキストメニューを旧仕様に戻す方法

# 概要

Windows11のコンテキストメニューをWindows10までの従来仕様に戻すスクリプトをまとめた話です。

ググれば同じ話はいくつも出てくるのでn番煎じ感が強いですが、PowerShellだけで行ってる例は少なかったので、そこは新規性があるかも？

# コンテキストメニューって？

エクスプローラやデスクトップ上などでファイルとか何もない場所を右クリックしたときに表示されるメニューのことです。

このコンテキストメニュー、Windows10までとWindows11で仕様が大きく異なります。

![Windows10とWindows11のコンテキストメニュー比較](https://www-tacos.github.io/qiita-images/20230818_change_context_menu/001.jpg)

Windows11では表示をすっきりさせるためなのか、従来のほとんどの操作は非表示になっています。

なので、例えば7zipでの解凍・VSCodeで開く・送るなどの操作をしたい場合は「その他のオプションを確認」をクリックして従来のコンテキストメニューを表示してから対象操作を選択する必要があります。とてもつらい。

ということで、レジストリをいじって仕様を戻しちゃいます。

※ちなみにWindows11でもバージョン22H2以上であればShiftキーを押しながら右クリックすれば旧仕様のコンテキストメニューを表示できます。

# 方法0 : レジストリエディタを操作する

レジストリエディタを起動してポチポチ操作していく方法です。

ただ、手作業は面倒なのでこの記事では説明は省きます。詳しくは「Windows11　右クリック　戻す」で検索すれば参考になるサイトがたくさん見つかると思います。（以下、参考になりそうなサイト例）

https://and-engineer.com/articles/Y6pL0xIAACIAbxZU

https://tanweb.net/2021/11/19/44083/#i-2

# 方法1 : レジストリエディタをコマンドラインから呼び出す

方法0をコマンド操作で実行する方法です。多分これが一番はやいと思います。

コマンドプロンプト / Windows PowerShell / Windows Terminal のどれでもいいでの開いて `reg.exe` にオプションをつけて実行すればOKです。

```cmd:旧仕様に変更する場合
reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
```

```cmd:Windows11の仕様に戻す場合
reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
```

レジストリ値を変更した後はPCを再起動するか、タスクマネージャからエクスプローラのプロセスを再起動する必要があります。

![タスクマネージャでエクスプローラを再起動](https://www-tacos.github.io/qiita-images/20230818_change_context_menu/002.jpg)

ちなみに、`{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}` がコンテキストメニューに関するレジストリキーなのですが、このキーやその配下が他の制御にも使われうるのかどうかよくわからないので、何も確認せずに削除するのは危険かもしれません。まぁ杞憂かもしれませんが。

# 方法2 : PowerShellでレジストリを操作する

PowerShellの標準コマンドレットを使ってレジストリを操作します。

（PowerShellでレジストリを変更しますと言ってreg.exeを呼んでるだけの記事とは違うことを強調したい！）

方法1との違いとして、レジストリキーに他のキーや値が設定されてないことの事前確認も念のため行っています。仮に存在する場合は自分で追加した値だけを消すようにしています。

```powershell:旧仕様に変更する場合
# レジストリキーの定義
$key = "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"

# レジストリキーが存在しなければ再帰的に作成
if (! (Test-Path ${key}) ) {
  New-Item ${key} -Force
}

# 既定プロパティにブランクを設定
Set-ItemProperty ${key} -Name "(default)" -Value ""

# Explorerの再起動
Stop-Process -Name explorer -Force
```

```powershell:Windows11の仕様に戻す場合
# レジストリキーとサブキーの定義
$keyparent = "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}"
$key = "${keyparent}\InprocServer32"

# 事前確認
# 1. 親キーのサブキーは InprocServer32 が1つだけのはず
$chk1 = (Get-Item ${keyparent}).SubKeyCount -eq 1

# 2. 親キーに値は存在しないはず
$chk2 = (Get-Item ${keyparent}).ValueCount -eq 0

# 3. キーにサブキーは存在しないはず
$chk3 = (Get-Item ${key}).SubKeyCount -eq 0

# 4. キーの値は (default) のみのはず
$chk4 = (Get-Item ${key}).ValueCount -eq 1

# 事前確認の結果表示
Write-Output "${chk1}, ${chk2}, ${chk3}, ${chk4}"

# 事前確認の結果に応じたレジストリ操作を実行
if ($chk1 -and $chk2 -and $chk3 -and $chk4) {
  # すべて True の場合、親キーごと削除する
  Remove-Item ${keyparent} -Force
} else {
  # 1つでも False が存在する場合、キーの既定プロパティのみを削除する
  Remove-ItemProperty ${key} -Name "(default)"
}

# Explorerの再起動
Stop-Process -Name explorer -Force
```

# さいごに

本記事を作成するにあたって以下のサイトを参考にさせてもらいました。ありがとうございます。

> レジストリエディタ(コマンド)でのコンテキストメニューの変更
> <https://www.suzu6.net/posts/336-windows11-right-click-menue/>
>
> コマンドレットでのレジストリ操作
> <https://qiita.com/mima_ita/items/1e6c74c7fb641852edff>
>
> 既定プロパティの設定
> <https://www.vwnet.jp/windows/PowerShell/SetValue2RegDefault.htm>

コンテキストメニューはサードパーティアプリによってごちゃごちゃになりがちなので整理したくなる気持ちもわかりますが、何を隠して何を表示するかは自分で選びたいですね。

本記事は以上です。さいごまで読んでいただきありがとうございました。