自作アプリを作っている上で
コマンド引数によって起動条件を分岐させたかったので
調べて作った備忘録です。
▼ 環境
・Windows
・Visual Studio 2019
・WPF アプリ (.Net Framework)
・.Net Framework 4.7.2
やりたいこと
WPFのexeファイルにコマンド引数を与えるか否かで
起動条件を分岐させたい。
起動条件
初期状態の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
の記述を追加します。
記述しようとするとこのような表記がでるので、
そのまま<新しいイベント ハンドラー>
をクリックしApplication_Startup
を追加します。
<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ファイルやコマンドプロンプトで起動した際のコマンド引数を受け取りたいので
実際にコードを記述します。
using System.Windows;
namespace WpfApp1
{
/// <summary>
/// App.xaml の相互作用ロジック
/// </summary>
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
// ここにコードを記述する。
}
}
}
実際にコードを記述した例
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
の配下にあります。
では、exeファイルをクリックして実行した場合はどうかというと...
どこでも見かけるMainWindow
が立ち上がります。
実際にコードを記述した例のソースでthis.Shutdown();
を用意しているのは、
コマンド引数を渡してアプリケーションを実行した場合、
見えない状態のまま裏で実行され続けてしまうためです。
もし、ソースを作成し裏で動き続けてしまった場合には
タスクマネージャーのプロセスをよく見ると起動しているので
右クリック > タスクの終了
を選択してください。
以上です。
コマンド引数を使ったあれこれは、これ以外にもやり方がありますので
よければ、お時間があるときにまた調べてみてください。