🙄

コンテキストメニューへの追加アプリの作成

に公開

はじめに

マウスの右クリックで出てくるメニューは、アクセスが良くて便利ですよね。ここに好きな項目を足せたら便利だと思いませんか?最短でアプリにアクセスできるランチャーになると思うんですよね。
なので、アプリ作ってみました。作成の経緯やらをメモです。

欲しい機能

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

実現するには

レジストリの設定が必要みたいです。
右クリックを行った場所によって、変更するレジストリも違うようです。例えば、デスクトップ上での右でクリックと、ファイルを選択しての右クリックでは、出てくるメニューが違うので、設定方法も違うようです。

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

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

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

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

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

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

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

従来のフルメニュー

Win11からはコンテキストメニューが刷新されて、「簡略化された新しいメニュー」と「従来のフルメニュー」に分かれました。
右クリックで表示されたメニューから「その他のオプションを表示」を選択することで、従来のフルメニューとなります。
結局メニュー選択するのに、クリック回数が増えるのであまり意味が無いかも、と思ってます。
Win11で、「従来のフルメニュー」を最初から表示するようにするオプションも付けました。

チェックを付けると、従来のフルメニュー表示となります。
これもレジストリを操作していて、レジストは以下になります。

Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32

ダウンロード

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

Discussion