1

コンソールとユーザー インターフェイスで動作するアプリケーションを作成しました。コンソールからアプリケーションを実行するときに、現在開いているコンソールにメッセージを表示したいと考えています。

static class Program
    {
        [DllImport("kernel32.dll",
            EntryPoint = "GetStdHandle",
            SetLastError = true,
            CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall)]
        private static extern IntPtr GetStdHandle(int nStdHandle);
        [DllImport("kernel32.dll",
            EntryPoint = "AllocConsole",
            SetLastError = true,
            CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall)]
        private static extern int AllocConsole();
        private const int STD_OUTPUT_HANDLE = -11;
        private const int MY_CODE_PAGE = 437; 

        [STAThread]
        static void Main(string[] Args)
        {
                if (Args[0] != "")
                {
                    //AllocConsole();
                    commandlineTool(Args[0]);
                }
                else
                {

                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form2());
                }
static void commandlineTool(string filename)
{
    //all coding here
    AllocConsole();

    IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
    FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
    System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
    StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
    standardOutput.AutoFlush = true;
    Console.SetOut(standardOutput);

    Console.WriteLine("File has been generated.");
    Console.ReadLine();
}

実際 には AllocConsole()はプロセスに新しいコンソールを割り当てます。

しかし、これから新しいコンソールが開き、メッセージが表示されますが、同じコンソールにメッセージを表示したいです。

4

1 に答える 1

1

方法 A (推奨、簡単): アプリケーションをコンソール アプリケーションにすることができます。コンソールを解放するには、FreeConsole. この IMO が最適なソリューションです。唯一の欠点は、アプリケーションの起動時にコンソール ウィンドウが非常に短時間表示されることです。

方法 B (必要に応じて使用):を使用 して、親プロセスのコンソールへの接続を試みることができますAttachConsole(ATTACH_PARENT_PROCESS)。親プロセスにコンソールがない場合、これは失敗します。その場合、AllocConsole の使用に戻る必要があります。

またSystem.Console、コンソールをアタッチ/割り当てしようとするときにクラスが既に初期化されている場合は、次のように入力/出力/エラー ストリームを再配線する必要があります。

    StreamWriter stdOut = new StreamWriter(Console.OpenStandardOutput());
    stdOut.AutoFlush = true;
    Console.SetOut(stdOut);

    StreamWriter stdErr = new StreamWriter(Console.OpenStandardError());
    stdErr.AutoFlush = true;
    Console.SetError(stdErr);

    StreamReader stdIn = new StreamReader(Console.OpenStandardInput());
    Console.SetIn(stdIn);

そうしないと、出力がありません。

于 2013-01-23T21:20:47.677 に答える