4

WPF プロジェクトで実行されるコマンド ラインを実装したいと考えています。App.cs のエントリ ポイントが変更されました。ただし、コンソールは点滅するだけで消えます。それを修正する方法は?ありがとう

public class App : System.Windows.Application
{
    [STAThread]
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {// Commandline run mode
            // Command line given, console from console
            Console.WriteLine("In cmd line mode");
            AllocConsole();
            CmdLineRun.ParseArgs(args);
            CmdLineRun.CmdRun();
        }
        else
        {// GUI mode
            GUIMain();
        }
    }

    static void GUIMain()
    {
        App app = new App();
        app.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
        app.Run();
    }

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AllocConsole();
}
4

1 に答える 1

5

新しいコンソールウィンドウを作成するとAllocConsole、プロセスがまだアクティブである間だけ、それが残ります。これを防ぐには、いくつかのオプションがあります。

  1. ユーザーが入力を提供するまで、実際にプロセスを終了しないでください。CmdRunこれは、メソッドが戻った後に実行する「続行するには任意のキーを押す」オプションです。コンソールウィンドウは引き続き表示されますが、指示した場合に限ります。

  2. 既存のコンソールを使用します。常にコマンドラインからアプリケーションを実行する場合は、新しいコンソールウィンドウを作成する必要はありません。代わりに、AttachConsoleメソッドを使用して、stdin/stdoutを既存のものにアタッチします。

最善の策は、通常、最初にAttachConsole(-1)(-1はATTACH_PARENT_PROCESS)を試みることです。それが0を返す場合は、親プロセスにコンソールがないか、コンソールに接続できませんでした。その後、フォールバックしてAllocConsole、シャットダウン後もそのままにしておくことができます。

これはWPFに固有のものではなく、同じアプリケーションでコンソールコードとGUIコードを混在させようとすると問題になります。アプリがCUIサブシステム用にコンパイルされている場合、「コンソールアプリケーション」を指定すると、Windowsがこれを処理しますが、デフォルトではメッセージキューを取得せず、ウィンドウUIは失敗します。アプリがGUIサブシステム用にコンパイルされている場合、「Windowsアプリケーション」を指定すると、メッセージキューは取得されますが、コンソール処理は取得されません。WindowsにGUI部分を処理させ、コンソールを手動で管理することは、2つのオプションの中ではるかに簡単です。

于 2012-08-31T20:45:09.137 に答える