2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-07-13

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

▼ 環境

・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
記述しようとするとこのような表記がでるので、
そのまま<新しいイベント ハンドラー>をクリックし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ファイルにファイル(複数でも可)をドラッグ&ドロップすると
絶対パスがメッセージボックスに表記した状態で起動して終了します。

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

image.png実行結果はこんな感じ

では、exeファイルをクリックして実行した場合はどうかというと...
image.png
どこでも見かけるMainWindowが立ち上がります。

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

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

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

2
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?