
エクスプローラー上で誰でも簡単に動かせるツールのご依頼があったので、コンテキストメニューから実行できるツールの作り方をサンプルコードを交えてご紹介します。
コンテキストメニューとは?
ファイルをコピーする時、右クリックしますよね。その時に出てくるメニューがコンテキストメニューです。


あー!それね!
PCを使う人なら誰でも知っていますが、このメニューを「コンテキストメニュー」と呼ぶことを知らない人は多いです。
普段から当たり前に利用しているこのコンテキストメニュー。ここにツールが登録出来たら便利なのになと考えた事は無いでしょうか?

無いことは無いけど、そこまで「絶対欲しい!」とまでは考えた事なかったなー。

実際のところ、どう使うのが便利なの?
普通にアプリケーションを実行するとき、対象の実行ファイルをダブルクリックして実行しますよね。
その実行がコンテキストメニューになったからって、何が便利なんだろうと感じた人もいるかも知れません。
その感性、間違ってません。
このコンテキストメニューからの実行は、「ある特定の処理」においては大変便利ですが、それ以外で使う事はほぼほぼ無いと思います。
その「ある特定の処理」と言うのは、ずばり、ファイル操作です。
なぜ便利?
今、みなさんがお使いのPCで表示されるコンテキストメニューを見てみてください。
考えてみれば当たり前なのですが、右クリックしたその「ファイルやフォルダに対しての処理」しかありません
つまりそもそも、コンテキストメニューに追加して便利な機能と言うのは、ファイルやフォルダに対しての処理になります。
これがなぜ便利かと言うと、選択したファイルやフォルダのフルパスをパラメータとして保持したまま、プログラムを実行できるからです。
実際に作ってみよう
早速作ってみましょう。
本記事では「アプリケーション作成」と「コンテキストメニュー実行」の2つに分けて進めます。
コンソールアプリケーション作成
作っていきます。
今回作るコンソールアプリケーションツールの機能は、「選択画像を削除する。および同一フォルダ内に選択画像のファイル名を含む画像があれば、それも全て削除する」というものです。
※こんなイメージ

まずメイン部分、コンテキストメニューから選択するとファイルパスをパラメータとして取得できるので、それを保持しておきます。
static void Main(string[] args)
{
string filePath = "";
//コンテキストメニューからファイルを選択していない場合、処理終了
if (args.Length == 0)
{
Console.WriteLine("ファイル名を指定してください。");
return;
}
//コンテキストメニューで選択したファイルパス
filePath = args[0];
//削除処理
Rlt_Dlt(filePath);
}
取得したファイルパスを削除処理メソッド「Rlt_Dlt」へ渡して、実際に削除処理を行います。
public static void Rlt_Dlt(string fp)
{
//ファイルパスが格納されたフォルダパスを格納
string folderNm = Path.GetDirectoryName(fp);
//選択したファイルのフルパスからファイル名を格納
string fileNm = Path.GetFileName(fp);
//ファイル名から拡張子を除外して格納
string[] sfile = fileNm.Split('.');
//指定フォルダ内に存在するファイル情報を全て取得する
IEnumerable<string> files
= Directory.EnumerateFiles(
folderNm, // 検索開始ディレクトリ
"*", // 検索パターン
SearchOption.AllDirectories); // 全サブフォルダ対象
foreach (string file in files)
{
//fileに部分一致するsfile[0]が存在する場合
if (file.Contains(sfile[0]))
{
//削除対象
File.Delete(file); //ファイル削除
}
}
}
なんと、以上で完了です。とっても簡単。
コンテキストメニューに追加
アプリケーションが作成できたので、続いてコンテキストメニューにこのアプリケーションを登録します。
例として、このアプリケーションは「C:\Related_Delete\Related_Delete.exe」の配置である事とします。
レジストリ登録
コンテキストメニューに追加するためには、レジストリの登録を行う必要があります。
まず「windows + R」でファイル名を指定して実行ウィンドウを表示し、「regedit」と打って「OK」ボタンを押下します。

するとレジストリエディタ―が起動します。
この中から「HKEY_CLASSES_ROOT」⇒「*」⇒「shell」と進みます。
「shell」で右クリックし、「新規(N)」⇒「キー(K)」を押下します。

「新しいキー #1」が作成されるので、名前を付けます(ここでは「Related_Delete」)
右の展開部をダブルクリックし、値のデータを任意で設定します。ここで設定した値は、コンテキストメニューに表示される文字列になります。

次に「Related_Delete」で右クリックし、先ほどと同様に「新規(N)」⇒「キー(K)」を押下して新しいキーを作成し、名前を付けます(ここでは「command」とします)

右の展開部をダブルクリックし、値のデータを「{登録したいアプリケーションのファイルパス} %1」に設定します。今回は以下のようになります。
「C:\Related_Delete\Related_Delete.exe %1」

ここまでやったら、実際にファイル上で右クリックしてみてください。

実行したら、関連画像が一括で削除されます。
まとめ
Windowsの既存メニューから自作アプリケーションを実行するなんて、プログラミングを覚えたてのあの頃はすごく難しくて高度な事だと思っていました。
実際にやってみるとこんなに簡単。という事がこのプログラミング業界ではしょっちゅうあります。
まず一歩を踏み出す。やってみるという好奇心が自身のスキルを伸ばすきっかけになったりするので、ぜひ皆さんもトライしてみてください。