Я пишу приложение, которое в первую очередь предназначено для консольного приложения, но некоторые его функции открывают / используют формы для своей работы.
Это все работает нормально, за исключением того, что при вызове приложение всегда открывает ДОПОЛНИТЕЛЬНОЕ консольное окно, в которое выполняются все его консольные операции и взаимодействия (это нежелательное второе окно закрывается после завершения программы ). Это полностью нежелательное поведение, но я понятия не имею, почему это второе окно порождается, или почему приложение настаивает только на записи / чтении из окна ТО, а не на том, из которого оно был назван ...
Вот содержимое моего файла 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
}
}
Все, что я хочу, - чтобы приложение работало в пределах окна консоли, из которого оно вызывается, как мне заставить его перестать создавать / обращаться ко второму его экземпляру?