Я пишу приложение Windows Forms, которое может запустить консоль для отладки. Я хочу отключить кнопку закрытия консоли, чтобы приложение windows form не могло быть закрыто с помощью кнопки закрытия консоли. Я построил скелет тестового кода, и он работает. Код ниже:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace bsa_working
{
public partial class Form1 : Form
{
static bool console_on = false;
public Form1()
{
InitializeComponent();
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (ViewConsole.Checked)
{
Win32.AllocConsole();
ConsoleProperties.ConsoleMain();
// Set console flag to true
console_on = true; // will be used later
}
else
Win32.FreeConsole();
}
}
public class Win32
{
[DllImport("kernel32.dll")]
public static extern Boolean AllocConsole();
[DllImport("kernel32.dll")]
public static extern Boolean FreeConsole();
}
public class ConsoleProperties
{
[DllImport("user32.dll")]
static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
static extern IntPtr RemoveMenu(IntPtr hMenu, uint nPosition, uint wFlags);
internal const uint SC_CLOSE = 0xF060;
internal const uint MF_GRAYED = 0x00000001;
internal const uint MF_BYCOMMAND = 0x00000000;
public static void ConsoleMain()
{
IntPtr hMenu = Process.GetCurrentProcess().MainWindowHandle;
IntPtr hSystemMenu = GetSystemMenu(hMenu, false);
EnableMenuItem(hSystemMenu, SC_CLOSE, MF_GRAYED);
RemoveMenu(hSystemMenu, SC_CLOSE, MF_BYCOMMAND);
// Set console title
Console.Title = "Test Console";
// Set console surface foreground and background color
Console.BackgroundColor = ConsoleColor.DarkBlue;
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();
}
}
}
Код работает нормально, КРОМЕ:
Когда код скомпилирован и запущен в первый раз, X на консоли НЕ отображается серым цветом, а в приложении Windows Forms отображается серым цветом. Однако, когда код закрывается и запускается снова, код работает как следует; то есть X на консоли отображается серым цветом, а приложение Windows Forms - таким, каким оно должно быть. Есть идеи, почему и как это можно исправить?
Иногда консоль появляется за формой победы. Есть ли способ заставить консоль всегда идти впереди?
Кроме того, есть ли способ закрепить консоль в определенном месте WinForm? приложение? Я могу установить его размер, чтобы, если бы я мог прикрепить его в определенном месте, я мог создать для него место в форме.