public partial class App : Application { protected override void OnStartup(StartupEventArgs sea) { CommandLine.Instance.SetArguments(sea.Args); base.OnStartup(sea); } } public class CommandLine { private CommandLine() {} private static readonly CommandLine instance = new CommandLine(); public static CommandLine Instance { get { return instance; } } public IEnumerablethen to useArguments { get { return args; } } public void SetArguments(string[] args) { this.args = args ?? new string[0]; } private string[] args = new string[0]; }
private void Window_Loaded(object sender, RoutedEventArgs e) { foreach (string arg in CommandLine.Instance.Arguments) { if (arg.ToUpper() == "/C") { if (System.Windows.Forms.Clipboard.ContainsText()) { tbCode.Text = System.Windows.Forms.Clipboard.GetText(); } } } }Doh!
Even easier:
string[] arguments = Environment.GetCommandLineArgs();When processing command line args using Environment.CommandLineArgs(), found that the system automatically matches " in an argument. So if you have a path that contains a spaces, as long as that path is wrapped with " marks, the path will not be parsed into multiple arguments but rather appear as a single argument. eg.:
-myArg:C:\Program Files\MyProgram\Something.exe
will get parsed as multiple arguments:
- -myArg:C:\Program
- Files\MyProgram\Something.exe
-myArg:"C:\Program Files\MyProgram\Something.exe"
will get parsed as a single argument:
- -myArg:C:\Program Files\MyProgram\Something.exe
Have also noticed that carriage return line feeds can get sucked into a command line argument. Perhaps a "Trim()" should be applied to each argument string before it is processed to be sure this whitespace is removed. Here is a sample command line parser:
internal class CommandLineParser { public string Drive { get; set; } public string TrueCryptFile { get; set; } public string KeyFile { get; set; } const string DrivePrefix = "-D"; const string TrueCryptFilePrefix = "-T"; const string KeyFilePrefix = "-K"; public void CommandLineArgs(string[] args) { //string[] args = Environment.GetCommandLineArgs(); Debug.WriteLine("Args:" + string.Join(",", args)); int ix = 0; foreach (string arg in args) { Debug.WriteLine("arg[" + ix++.ToString() + "]=\'" + arg + "\'"); } foreach (string rawArg in args) { // Get rid of whitespace chars at the beginning and end string arg = rawArg.Trim(); if (arg.Length < 2) continue; string argument = (arg[0] == '/') ? "-" + arg.Substring(1) : arg; int end = argument.IndexOf(':'); if ((end == -1) && ((end + 1) >= argument.Length)) continue; if (argument.ToUpper().StartsWith(DrivePrefix)) { Drive = argument.Substring(end + 1).Substring(0, 1) + ":"; } else if (argument.ToUpper().StartsWith(TrueCryptFilePrefix)) { TrueCryptFile = argument.Substring(end + 1); } else if (argument.ToUpper().StartsWith(KeyFilePrefix)) { KeyFile = argument.Substring(end + 1); } } Debug.WriteLine("Processed command line args:"); Debug.WriteLine("Drive=\"" + Drive + "\""); Debug.WriteLine("TrueCryptFile=\"" + TrueCryptFile + "\""); Debug.WriteLine("KeyFile=\"" + KeyFile + "\""); } } // and tester (not really finished) class CommandLineParserTester { public void TestCommandLineParser() { CommandLineParser clp = new CommandLineParser(); clp.CommandLineArgs(new string[] { @"-D:M", @"-T:F:/Temp/truecrypt.tc", @"-K:F:/Temp/truecrypt.keyfile" }); Assert(clp.Drive == "M:"); Assert(clp.TrueCryptFile == @"F:/Temp/truecrypt.tc"); Assert(clp.KeyFile == @"F:/Temp/truecrypt.keyfile"); } }