tech.guitarrapc.cóm

Technical updates

WindowsエクスプローラーのコンテキストメニューからOpen with Visual Studioを消す

Visual Studioを使っていて、フォルダのコンテキストメニュー(右クリックメニュー)に「Open with Visual Studio」が出て邪魔だなと思ったことはありませんか?Visual Studiは起動パスに.vs/を作るのですが、これで差分ができて悲しい思いを何度かしています。 事故らないようにコンテキストメニューから消してみましょう。1

image

Open with Visual Studioのメニュー実体

コンテキストメニューはレジストリに設定が登録されています。今回はフォルダの右クリックなので鍵になるのはHKEY_CLASSES_ROOT\Directory\Shellです。

image

含まれるデータは次の通りです。

$ Get-Item "registry::HKEY_CLASSES_ROOT\Directory\Background\shell\AnyCode"

    Hive: HKEY_CLASSES_ROOT\Directory\Background\shell

Name                           Property
----                           --------
AnyCode                        (default) : @C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\1033\VSLauncherUI.dll,-1002
                               Icon      : C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\VSLauncher.exe,-105
$ Get-Item "registry::HKEY_CLASSES_ROOT\Directory\shell\AnyCode"

    Hive: HKEY_CLASSES_ROOT\Directory\shell

Name                           Property
----                           --------
AnyCode                        (default) : @C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\1033\VSLauncherUI.dll,-1002
                               Icon      : C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\VSLauncher.exe,-105

いろいろな削除方法

regeditで削除する方法と、C#やPowerShellで削除する方法を紹介します。

regeditで削除する

以下の方法でregeditから削除できます。

  1. regeditを起動
  2. HKEY_CLASSES_ROOT\Directory\Background\shellを開く
  3. AnyCodeキーを削除
  4. HKEY_CLASSES_ROOT\Directory\shell\を開く
  5. AnyCodeキーを削除

C#で削除する

以下のコードを実行すると、AnyCodeキーを削除できます。管理者権限から実行する必要があるので注意です。

// Program.cs (要管理者権限)
using Microsoft.Win32;

string[] keys = ["Directory\\Shell", "Directory\\Background\\shell"];
foreach (var key in keys)
{
    using var reg = Registry.ClassesRoot.OpenSubKey(key, writable: true);
    if (reg is not null)
    {
        reg.DeleteSubKeyTree("AnyCode", throwOnMissingSubKey: true);
    }
}

PowerShellで削除する

PowerShellからの削除はサブツリー削除に難があるので、C#コードをそのまま持ってくるのが安定です。

# 要管理者権限
$keys = @("Directory\shell", "Directory\Background\shell")
foreach ($key in $keys) {
  $reg = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey($key, $true)
  if ($null -ne $reg) {
    $reg.DeleteSubKeyTree("AnyCode", $true)
  }
}

削除できない例

PowerShellはレジストリPS Providerからアクセスが可能なので、ネイティブなコマンドレットで削除すると次のようになりますが、肝心のAnyCodeキーのサブキー削除がうまくいかないようです。残念ながら、これ対処がない感じです。

# 要管理者権限
$keys = @("registry::HKEY_CLASSES_ROOT\Directory\shell\AnyCode", "registry::HKEY_CLASSES_ROOT\Directory\Background\shell\AnyCode")
foreach ($key in $keys) {
  if (Test-Path "$key") {
    foreach ($sub in $(Get-ChildItem "$key").Name) {
      foreach ($prop in (Get-Item "$key").Property) {
          echo "Deleting $prop in $key"
          Remove-ItemProperty "$key" -Name "$prop"
      }
    }
    Remove-Item "$key" -Force -Recurse
  }
}
Line |
   9 |      Remove-Item "$key" -Force -Recurse
     |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot delete a subkey tree because the subkey does not exist.

削除後

無事に削除できましたね。

image

Explorerも再起動不要です。

image

メニューを戻す

Visual Studio Installerを起動してRepair(修復)を実行すると、コンテキストメニューにOpen with Visual Studioが戻ります。

image

Repiarの実行後は再起動不要です。

image


  1. 私がVisual Studioを起動するときは、.slnから起動StreamDeckから起動タスクバーにピンしたVisual Studioから起動のいずれかを使っています。