Приложение Mixed Console / Forms всегда открывает вторую консоль - PullRequest
0 голосов
/ 01 апреля 2019

Я пишу приложение, которое в первую очередь предназначено для консольного приложения, но некоторые его функции открывают / используют формы для своей работы.

Это все работает нормально, за исключением того, что при вызове приложение всегда открывает ДОПОЛНИТЕЛЬНОЕ консольное окно, в которое выполняются все его консольные операции и взаимодействия (это нежелательное второе окно закрывается после завершения программы ). Это полностью нежелательное поведение, но я понятия не имею, почему это второе окно порождается, или почему приложение настаивает только на записи / чтении из окна ТО, а не на том, из которого оно был назван ...

Вот содержимое моего файла Program.cs ...

using System;
using System.Diagnostics;
using System.Windows.Forms;
using CobblestoneMgmt.Forms;
using ConfigManagement;
using CodeLibrary.ConsoleFunctions;
using Xtensions.CmdlineArgumentMgmt;

namespace AppMgmt
{
    static class Program
    {
        /// <summary>The main entry point for the application.</summary>
        [STAThread]
        static void Main(string[] _args)
        {
            ArgumentsMgt args = new ArgumentsMgt(_args);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (args.Count == 0)
            {
                // Run it as a WindowsForms application.
                Application.Run(new AppManagement());
            }
            else
            {
                Console.OutputEncoding = System.Text.Encoding.Unicode;
                //Run it as a Console application.
                if (args.HasSwitch("install"))
                {
                    if ((args.Count==1) || args["install"].HasValue("guided") || args.HasSwitch("guided"))
                        Application.Run(new Installation());

                    if (args.HasSwitch("regedit"))
                    {
                        if (args["regedit"].HasValue("ShowConfig"))
                        {
                            IniFile config = IniFile.FetchResourceFile("AppMgmt.ExternalResources.DefaultConfig.ini");
                            Con.Write(config.ToString());
                        }
                    }
                }
                Con.WaitPrompt();
            }
        }
    }
}

Хотя я не думаю, что это уместно, используемый здесь интерфейс «Con» является просто промежуточным классом для того, чтобы сделать консольные записи более утилитарными / дружественными:

using System;

namespace CodeLibrary.ConsoleFunctions
{
    /// <summary>Simple static routines to facilitate writing text to the Console in color more efficiently.</summary>
    public static class Con
    {

        #region Methods
        /// <summary>Output specified text to the Console at the current cursor position, in the specified colours.</summary>
        /// <param name="data">The text to write.</param>
        /// <param name="fore">The foreground colour to use (default = LightGray).</param>
        /// <param name="back">The background colour to use (default = black).</param>
        public static void Write(string data, ConsoleColor fore, ConsoleColor back = ConsoleColor.Black)
        {
            CliColor store = CliColor.CaptureConsole();

            Console.ForegroundColor = fore;
            Console.BackgroundColor = back;
            Console.Write(data);

            store.ToConsole();
        }

        public static void Write(string data, CliColor color = null) =>
            Write(data, ((color is null) ? CliColor.Default.Fore : color.Fore), ((color is null) ? CliColor.Default.Back : color.Back));

        /// <summary>Output specified text to the Console at the current cursor position, in the specified colours,followed by a newline.</summary>
        /// <param name="data">The text to write.</param>
        /// <param name="fore">The foreground colour to use (default = LightGray).</param>
        /// <param name="back">The background colour to use (default = black).</param>
        public static void WriteLn(string data, ConsoleColor fore = ConsoleColor.Gray, ConsoleColor back = ConsoleColor.Black)
        {
            Write(data, fore, back);
            Console.WriteLine();
        }

        /// <summary>Sends text to the Console with a section highlighted in a different colour.</summary>
        /// <param name="first">The first section of text to write in the basic foreground colour.</param>
        /// <param name="second">The second section of text to write in the highlight colour.</param>
        /// <param name="third">An optional third section of text to write, back in the basic foreground colour.</param>
        /// <param name="fore">The foreground colour to use for the first and third strings (default = LightGray).</param>
        /// <param name="highlight">The foreground colour to use for the second string (default = White)</param>
        /// <param name="back">The background colour to use throughout (default = black).</param>
        public static void Highlight(string first, string second, string third = "", ConsoleColor fore = ConsoleColor.Gray, ConsoleColor highlight = ConsoleColor.White, ConsoleColor back = ConsoleColor.Black)
        {
            Write(first, fore, back);
            Write(second, highlight, back);
            Write(third, fore, back);
        }

        /// <summary>Sends text to the Console with a section highlighted in a different colour and followed with a newline.</summary>
        /// <param name="first">The first section of text to write in the basic foreground colour.</param>
        /// <param name="second">The second section of text to write in the highlight colour.</param>
        /// <param name="third">An optional third section of text to write, back in the basic foreground colour.</param>
        /// <param name="fore">The foreground colour to use for the first and third strings (default = LightGray).</param>
        /// <param name="highlight">The foreground colour to use for the second string (default = White)</param>
        /// <param name="back">The background colour to use throughout (default = black).</param>
        public static void HighlightLn(string first, string second, string third = "", ConsoleColor fore = ConsoleColor.Gray, ConsoleColor highlight = ConsoleColor.White, ConsoleColor back = ConsoleColor.Black) =>
            Highlight(first, second, third + "\r\n", fore, highlight, back);

        /// <summary>Implements a basic "Press Any Key" pause.</summary>
        /// <param name="withEsc">If set to TRUE, adds the text "(or [ESC] to quit)." to the prompt.</param>
        /// <param name="fore">The foreground colour to apply to the base text.</param>
        /// <param name="back">The background colour to use.</param>
        /// <param name="highlight">Optional highlight colour to apply to the "[ESC]" portion of the output.</param>
        /// <returns></returns>
        public static char WaitPrompt(int indent = 0, bool withEsc = false, ConsoleColor fore = ConsoleColor.Gray, ConsoleColor back = ConsoleColor.Black, ConsoleColor highlight = ConsoleColor.White)
        {
            Write("Press any key...".PadLeft(indent,' '), fore, back);
            if (withEsc) Highlight("(or ", "[ESC]", " to quit).", fore, highlight, back);
            char result = Console.ReadKey().KeyChar;

            // Using \r's, without a \n causes the Cursor to return to column 1, of the same line. This effectively clears
            // the prompt and leaves the cursor where it would have been if the prompt hadn't come up.
            Write("\r                                      \r", fore, back);
            return result;
        }
        #endregion
    }
}

Все, что я хочу, - чтобы приложение работало в пределах окна консоли, из которого оно вызывается, как мне заставить его перестать создавать / обращаться ко второму его экземпляру?

1 Ответ

0 голосов
/ 01 апреля 2019

У меня были проблемы с воссозданием вашей проблемы, но проверьте, не настроено ли ваше приложение на ConsoleApplication Щелкните правой кнопкой мыши проект в обозревателе решений. Перейдите в Свойства, установите тип вывода для Консольного приложения. Скриншот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...