C#でクリップボードからパス文字列を取得し外部プログラムのExplorerを実行し開く

C# コンピュータ
C#

日常的にパスをコピーしエクスプローラーで開くという操作を行います。
今回はその操作をワンクリックで実行するプログラムを作成してみました。

プロジェクトはWinFormsで作成します。

using System.Diagnostics;

namespace OpenExplorer01;

// c# 外部プログラム 実行
// c# クリップボード 取得

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // To customize application configuration such as set high DPI settings or default font,
        // see https://aka.ms/applicationconfiguration.
        //ApplicationConfiguration.Initialize();
        //Application.Run(new Form1());

        // エクスプローラーに渡すパス
        string path = @"";

        // クリップボード
        IDataObject? data = Clipboard.GetDataObject();
        if (data is not null)
        {
            if (data.GetDataPresent(DataFormats.Text))
            {
                var obj = data.GetData(DataFormats.Text);
                if (obj is not null)
                {
                    path = (string)obj;
                }
            }
        }

        // エクスプローラーを起動
        var app = new ProcessStartInfo()
        {
            FileName = "explorer",
            Arguments = path,
        };
        Process.Start(app);
    }    
}

WinFormsですがフォームは表示しません。いつもは触らないProgram.cs内のエントリーポイントMain()を変更します。

まず、フォームが立ち上がらないように次の2行をコメントアウトします。

        //ApplicationConfiguration.Initialize();
        //Application.Run(new Form1());

次にクリップボードの文字列を取得します。

        // クリップボード
        IDataObject? data = Clipboard.GetDataObject();
        if (data is not null)
        {
            if (data.GetDataPresent(DataFormats.Text))
            {
                var obj = data.GetData(DataFormats.Text);
                if (obj is not null)
                {
                    path = (string)obj;
                }
            }
        }

nullチェックでifを多用していますが、Clipboard.GetDataObject()でクリップボードオブジェクトを取得し、
if (data.GetDataPresent(DataFormats.Text))でクリップボードがテキストか判定
data.GetData(DataFormats.Text)でクリップボードのテキストデータを取り出し、stringにキャストしています。

外部プログラムのエクスプローラーを起動します。

        // エクスプローラーを起動
        var app = new ProcessStartInfo()
        {
            FileName = "explorer",
            Arguments = path,
        };
        Process.Start(app);

var app = new ProcessStartInfo()でプロセスを作成、そのさいFileNameプロパティに”explorer”とArgumentsプロパティにクリップボードから取得したパス文字列をセットします。
(パスのフォルダが存在するかのチェックをした方が良さそうです。)
Process.Start(app)でプロセスを実行します。

これで終了です。

実行すると即座に終了しエクスプローラーが起動します。

後はビルドを行い、作成されたexeファイルを含むすべてのファイルを適当なフォルダにコピーしインストールします。

このままでも動作しますが、タスクバーにアイコンが表示されると識別性が良いのでアプリケーションアイコンを仕込み見ます。

アプリケーションアイコンのセットはプロジェクトファイル(.csproj)内に以下の様にApplicationIcon項目を追加してあげます。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWindowsForms>true</UseWindowsForms>
    <ImplicitUsings>enable</ImplicitUsings>
    <ApplicationIcon>H:\csharp\dotnet8\winforms\OpenExplorer01\app.ico</ApplicationIcon>
  </PropertyGroup>

</Project>

アイコンへのパスは絶対パスを指定しています。

この状態でビルドしなおします。

ちなみにアイコンはicooon-mono様からモノクロで渋いスプーンのアイコンを頂戴してきました。サイズは256×256でPNG形式でダウンロードし、その後GIMPで読み込み、拡張子をicoをエクスポートしてあります。

タスクバーに配置すると以下の様になります。

こちらをマウスでクリックするとエクスプローラーが起動します。

想定される使い方は、様々なアプリケーションでファイルを保存する際、ファイル選択のダイアログボックスで保存するフォルダを指定しますが、そのとき保存するフォルダをコピーして、保存を完了。その後こちらのプログラムを実行することで先ほどアプリケーションで保存したフォルダがエクスプローラーで開くことが出来ます。

プロジェクトをWinFormsで作成しましたがconsoleでも同じことが出来ると思われます。タスクバーにアプリケーションアイコンを表示させたかったのと実行毎にコマンドプロンプトが表示されるといやなので、WinFormsにしてみました。

出来れば常駐プログラムにしてショートカットキーで実行できるようにしたいところです。
同じようなプログラムがいくつか思いついたら作成してみたいと思います。

コメント