WPF 명령 줄


99

명령 줄 인수를 사용하는 WPF 응용 프로그램을 만들려고합니다. 인수가 제공되지 않으면 기본 창이 나타납니다. 특정 명령 줄 인수의 경우 GUI없이 코드를 실행하고 완료되면 종료해야합니다. 이것이 어떻게 적절하게 수행되어야하는지에 대한 모든 제안을 주시면 감사하겠습니다.

답변:


159

먼저 App.xaml 파일 상단에서이 속성을 찾아 제거합니다.

StartupUri="Window1.xaml"

즉, 응용 프로그램이 기본 창을 자동으로 인스턴스화하여 표시하지 않습니다.

다음으로 App 클래스에서 OnStartup 메서드를 재정 의하여 논리를 수행합니다.

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    if ( /* test command-line params */ )
    {
        /* do stuff without a GUI */
    }
    else
    {
        new Window1().ShowDialog();
    }
    this.Shutdown();
}

이 시점에서 콘솔 (Console.ReadLine / WriteLine)과 상호 작용할 수 있습니까?
Kieran Benton

물론 Console.WriteLine을 호출 할 수는 있지만 앱을 시작한 콘솔에는 출력이 표시되지 않습니다. WPF 응용 프로그램의 컨텍스트에서 "콘솔"이 무엇인지 잘 모르겠습니다.
Matt Hamilton

38
앱이 실행 된 콘솔에 쓰려면 작업이 끝나면 AttachConsole (-1), Console.Writeline (message), FreeConsole ()을 차례로 호출해야합니다.
oltman 2010

7
주의 : Windows1.xaml에서는 앱 리소스를 사용할 수 없습니다. 아직로드되지 않았습니다. System.Windows.Application.DoStartup (내부 메서드)에로드되고 DoStartup은 OnStartup 직후에 호출됩니다.
MuiBienCarlota

26

인수의 존재를 확인하려면 Matt의 솔루션에서 테스트에 다음을 사용하십시오.

e.Args.Contains ( "MyTriggerArg")


4

.NET 4.0+ 용 위 솔루션의 조합과 콘솔 출력 :

[DllImport("Kernel32.dll")]
public static extern bool AttachConsole(int processID);

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    if (e.Args.Contains("--GUI"))
    {
        // Launch GUI and pass arguments in case you want to use them.
        new MainWindow(e).ShowDialog();
    }
    else
    {
        //Do command line stuff
        if (e.Args.Length > 0)
        {
            string parameter = e.Args[0].ToString();
            WriteToConsole(parameter);
        }
    }
    Shutdown();
}

public void WriteToConsole(string message)
{
    AttachConsole(-1);
    Console.WriteLine(message);
}

MainWindow의 생성자를 변경하여 인수를 허용합니다.

public partial class MainWindow : Window
{
    public MainWindow(StartupEventArgs e)
    {
        InitializeComponent();
    }
}

그리고 제거하는 것을 잊지 마십시오 :

StartupUri="MainWindow.xaml"

1

아래 app.xaml.cs파일을 사용할 수 있습니다 .

private void Application_Startup(object sender, StartupEventArgs e)
{
    MainWindow WindowToDisplay = new MainWindow();

    if (e.Args.Length == 0)
    {
        WindowToDisplay.Show();
    }
    else
    {
        string FirstArgument = e.Args[0].ToString();
        string SecondArgument = e.Args[1].ToString();
        //your logic here
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.