恐ろしく聞こえるかもしれませんが、Microsoft.VisualBasic.ApplicationServices を利用して、これを非常に簡単にすることができます (C# プロジェクトに Microsoft.VisualBasic への参照を追加できます)。
簡単な例として、新しい C# WinForms プロジェクトを作成し、Program.cs を次のように変更できます。
class Program : WindowsFormsApplicationBase
{
static Form1 mainForm = null;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] commandline)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Program prog = new Program();
prog.MainForm = mainForm = new Form1();
prog.Run(commandline);
}
public Program()
{
this.IsSingleInstance = true;
}
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
{
base.OnStartupNextInstance(eventArgs);
mainForm.Startup(eventArgs.CommandLine.ToArray());
}
}
次に、Form1 でそこにラベルをスローし、それが機能していることを示す小さなコードをスローします。
public void Startup(string[] commandLine)
{
string output = "";
foreach (string arg in commandLine)
output += arg + "\n";
label1.Text = output;
}
public Form1()
{
InitializeComponent();
Startup(Environment.GetCommandLineArgs());
}
この小さなスニペットの唯一の落とし穴は、最初の起動時に取得するコマンド ライン引数にアプリケーション名が含まれているが、それ以降の起動には含まれないことです。