【C# / WPF】コマンド引数による起動条件の分岐

自作アプリを作っている上で
コマンド引数によって起動条件を分岐させたかったので
調べて作った備忘録です。

##### ▼ 環境 
・Windows
・Visual Studio 2019
・WPF アプリ (.Net Framework)
・.Net Framework 4.7.2

## やりたいこと
WPFのexeファイルにコマンド引数を与えるか否かで
起動条件を分岐させたい。

## 起動条件
初期状態のApp.xamlは下記のようなコードになっています。

```App.xaml
<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>
```
`StartupUri="MainWindow.xaml"`の部分が
アプリケーション起動時に起動する画面を設定しており、
この状態でビルドして開始すると`MainWindow.xaml`が展開されます。

今回は特定の条件下で起動させたいので`StartupUri="MainWindow.xaml"`を削除して
その代わりに`Startup`の記述を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1172674/110cdb1c-2220-dc50-87ed-61966e97ea01.png)
記述しようとするとこのような表記がでるので、
そのまま`<新しいイベント ハンドラー>`をクリックし`Application_Startup`を追加します。
```App.xaml
<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             Startup="Application_Startup">
   <Application.Resources>
         
    </Application.Resources>
</Application>
```
すると、`App.xaml.cs`のコードビハインドに以下のように新しいメソッドが追加されています。

exeファイルやコマンドプロンプトで起動した際のコマンド引数を受け取りたいので
実際にコードを記述します。
```App.xaml.cs
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            // ここにコードを記述する。
        }
    }
}
```
実際にコードを記述した例
```App.xaml.cs
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            if (e.Args.Length != 0)
            {
                string args = null;
                for (int i = 0; i < e.Args.Length; i++)
                {
                    args += $"args[{i}] = {e.Args[i]}\r\n";
                }
                MessageBox.Show(args.ToString(),"コマンド引数一覧");
                this.Shutdown();
            }
            else
            {
                MainWindow mw = new MainWindow();
                mw.Show();
            }
        }
    }
}

```
このソースを元にビルドすると、
exeファイルにファイル(複数でも可)をドラッグ＆ドロップすると
絶対パスがメッセージボックスに表記した状態で起動して終了します。

:::note info
`exeファイル`はdebugでビルドした場合
アプリケーションを保存しているフォルダの`bin/debug`の配下にあります。

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1172674/9afa4248-92d0-fce4-e0c6-0d448d089457.png)実行結果はこんな感じ

では、exeファイルをクリックして実行した場合はどうかというと...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1172674/af79b13d-72e3-4cd3-f4b8-aab980e1601e.png)
どこでも見かける`MainWindow`が立ち上がります。

:::note warn
実際にコードを記述した例のソースで`this.Shutdown();`を用意しているのは、
コマンド引数を渡してアプリケーションを実行した場合、
見えない状態のまま裏で実行され続けてしまうためです。

もし、ソースを作成し裏で動き続けてしまった場合には
タスクマネージャーのプロセスをよく見ると起動しているので
`右クリック > タスクの終了`を選択してください。
:::

以上です。
コマンド引数を使ったあれこれは、これ以外にもやり方がありますので
よければ、お時間があるときにまた調べてみてください。