🙄

コンテキストメニューをカスタマイズするアプリを作った

に公開

はじめに

Windowsの右クリックで表示される「コンテキストメニュー」、実はアクセス性抜群の便利機能なんですよね。ここに自分好みの項目を追加できたら、最短ルートでアプリを起動できる“理想のランチャー”になると思いませんか?
タスクバーにショートカットを並べるのもいいけれど、右クリック一発で目的のアプリにアクセスできたら、もっとスマート。そんな発想から、コンテキストメニューに自由に項目を追加できるアプリを作りました。
日々の作業をちょっと快適に、ちょっと楽しく。
そんな思いで開発しましたので、作成の経緯をメモです

欲しい機能

  • よく使うツールやスクリプトを即起動できる
  • ファイルやフォルダへのショートカットも追加できる
    作業手順も簡易になって便利ですよね

実現するには

レジストリをいじれば、Windowsのコンテキストメニュー(右クリックメニュー)に好きな項目を追加できます。ただし右クリックを行った場所によって、変更するレジストリも違い、結構複雑です。例えば、デスクトップ上での右でクリックと、ファイルを選択しての右クリックでは、出てくるメニューが違うので、設定方法も違うようです。

レジストリエディタの操作

レジストリの操作には、レジストリエディタというツールを用いて行います。
レジストリはWindowsシステムの設定を保持しているものですから、下手に編集するとWindows自体が最悪起動しなくなる場合も考えられますので、操作は自己責任でお願いします

  1. 「Win+R」で「表示されるファイル名を指定して実行」ウィンドウにて、「regedit」にてレジストリエディタが起動します
  2. 「HKEY_CLASS_ROOT*\shell」を選択して右クリックにて開かれるメニューから、「新規」「キー」を選択してください
  3. 適当に名前を付けて、追加された項目を選択して、右側ペインにある「(既定)」を選択し、右クリックで「修正」を選択してください
  4. 「文字列の編集」ウィンドウが表示されますので、「値のデータ」の欄に、コンテキストメニューに表示させたい項目の名前を入力してください
  5. 再度右側のペインの空いた場所を右クリックして、「新規」「キー」を選択してください・
  6. 上記で作成したキーを選択して、「(既定)」を選択して、「修正」を選択して、文字列の編集画面にて、実行したいコマンドを入力してください

右クリックした場所によってメニューが違うので、デスクトップや、ファイル等毎にレジストリの設定場所が違っています。

Win11で変わったメニュー

ところで、このコンテキストメニューってWin11から、項目を限定するようになって、一瞬すっきりしたと思ったんですが、結局「その他のオプション」を選ぶので、結局クリック回数増えてる!って思ってませんか?
なので、コンテキストメニューをWin10の形に戻すオプションも欲しいな
これもやっぱりレジストリの設定なので、実装出来そうですよね

ツールを使用しての変更方法は以下の通りです。
レジストリエディタで以下の場所に新規にキーを作成下さい

HKEY_CURRENT_USER\Software\Classes\CLSID

キーの名称を以下に

{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}

さらにこの中にキーを新規作成して名前は以下としてください

InprocServer32

選択したファイルやフォルダのパスを取得する

Shift押しながらの右クリックで出来るのは知ってますが、普通に右クリックで表示されるなら便利ですよね。なのでこれも追加しました。
何よりも、開発を行っているとファイルやフォルダのパスを取得する機会が多いんですよね。エクスプローラのURLをコピーするのも良いんですが、こっちの方が早いです。
レジストリの設定は

HKEY_CLASSES_ROOT\AllFilesystemObjects\shell

右クリックでキーを新規作成して、名前を「CopyPath」としてください。
作成したキーをダブルクリックして、値を「パスをコピー」にして下さい
もう一つキーを新規作成して、名前を「Command」としてください
Commandのキーを値は

cmd.exe /c echo|set /p="%1"|clip

とすることで、実現できます

設定できるアプリ作りました

正直、毎度こんな設定行ってられないので、簡易に設定できるようにアプリ作りました。

WPFでC#で記述しました
中身は上記のレジストリの設定をコードで行っているだけです。

キーの作成には、

var baseKeyPath = $@"{CURRENT_USER_SHELL_BASE}\{target}\shell\{menuName}";
using (var baseKey = Registry.CurrentUser.CreateSubKey(baseKeyPath))
{
    if (baseKey != null)
    {
        // メニュー名を設定(省略可能、キー名がデフォルト)
        baseKey.SetValue("", menuName);

        // アイコンを設定(実行ファイルのアイコンを使用)
        if (System.IO.File.Exists(command))
        {
            baseKey.SetValue("Icon", $"\"{command}\",0");
        }
    }
}

このキーにcommandを追加します。ファイル等のコンテキストメニューの表示の場合には、選択中のファイルなどを引数にしたいですが、デスクトップの場合いは、この引数が無いので、デスクトップ時には%1の扱いを変えるなどの工夫が必要です。

 var commandKeyPath = $@"{baseKeyPath}\command";
using (var commandKey = Registry.CurrentUser.CreateSubKey(commandKeyPath))
{
    if (commandKey != null)
    {
        var fullCommand = $"\"{command}\"";
        if (!string.IsNullOrEmpty(arguments))
        {
            // %1は選択されたファイル/フォルダのパスに置き換えられる
            if (!arguments.Contains("%1"))
            {
                arguments = arguments + " \"%1\"";
            }
            fullCommand += " " + arguments;
        }
        else if (target != "DesktopBackground")
        {
            // デスクトップ以外の場合は自動的に%1を追加
            fullCommand += " \"%1\"";
        }
        commandKey.SetValue("", fullCommand);
    }
}

使い方


タブが「メニュー追加」「メニュー管理」の2種あります。メニュー追加で、コンテキストメニューの追加を行い、メニュー管理で作成したコンテキストメニューの変更や削除を行えます。

  • 適用先
    コンテキストメニューを表示する際の、右クリックする対象を選択して下さい。例えば「ファイル」であれば、ファイルを選択して右クリックした際に表示されるコンテキストメニューの設定になります。
    適用先は、複数の選択が可能で、複数選択した場合には、同じメニュー項目を複数の操作箇所に追記します。

  • メニュー名
    コンテキストメニューに表示される文言です

  • 実行するコマンド/標準アプリケーション
    実行したいコマンドを記載してください。起動させたいアプリなどの絶対パスを記述するとアプリが起動します。「標準アプリケーション」にて既定のブラウザや、メモ帳等使いそうなアプリは前もって選択できるように下部に用意しましたので、こちらを選択する事でも設定可能です。標準アプリケーションで選択を行った場合には、メニュー名もそれっぽいものに変更しますので、必要であればこちらも変更してください。

  • 引数(オプション)
    既定のブラウザを選択した場合などに、ここに開きたいURLを設定する事で、好きなページを開くことが出来ます

  • 従来のコンテキストメニューを使用する
    Win11から、コンテキストメニューが短縮されて表示されるようになりました。よく使うものをまず表示してわかりやすいのですが、それ以外の項目を選択したい場合には「その他のオプションを表示」をクリックする手間が増えるの、ここの項目をチェックする事で、この機能を従来の表示に戻します。

設定例

Win10のメニュー表示に変更


チェックを付けると、従来のフルメニュー表示となります。ただしこの設定だけは、パソコンの再起動後で反映されます。

好きなページをブラウザで開く

私は、googleカレンダーとOutlookのカレンダーを使い分けています。なのでスケジュール管理には、両方見る必要があるんですが、これを登録する事ですぐに開くことが出来ます

引数の欄に、開きたいページのURLを入力してください。
もちろん、カレンダーだけでなく、メールとかでもURLを設定する事で開きます
コンテキストメニューはこんな感じ

パスの取得

以下の設定にして下さい。引数に意味不明な文字列がありますが、これは「パスをコピー」を選択すると自動で設定されます。

これで、ファイルやフォルダを右クリックして、作成した項目を選択するだけで、そのフルパスがクリップボードに保存されます。あとは使いたいところでペーストでOK

ダウンロード

https://nori33.booth.pm/items/7291320

Discussion