WinForm应用程序运行控制台-在控制台问题上禁用最小化/最大化/关闭按钮

本文关键字:控制台 最小化 关闭按钮 最大化 问题 运行 应用程序 WinForm | 更新日期: 2023-09-27 18:14:01

我正在编写一个可以启动控制台进行调试的windows窗体应用程序。我想禁用控制台的关闭按钮,使windows窗体应用程序不能通过控制台的关闭按钮关闭。我已经构建了测试代码框架,它可以工作。代码如下:

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();
        }
    }
}

代码工作正常,除了:

  1. 当代码编译并运行第一次,在控制台的X不是灰色的,但它是灰色的Windows窗体应用程序。然而,当代码关闭并再次运行,代码工作,因为它应该;也就是说,控制台上的X是灰色的,Windows窗体应用程序是应有的。任何想法为什么和如何这可以修复?

  2. 有时控制台出现在win窗体后面。有什么办法能让掌机独占鳌头吗?

作为题外话,是否有任何方法可以将控制台固定在WinForm上的特定位置?应用?我可以设置它的大小,这样如果我想把它固定在一个特定的位置我就可以在表单上为它创建一个位置

WinForm应用程序运行控制台-在控制台问题上禁用最小化/最大化/关闭按钮

要做到这一点,您需要将IntPtr hMenu = Process.GetCurrentProcess().MainWindowHandle;更改为使用控制台窗口的窗口句柄(可以通过调用GetConsoleWindow()获得)。

要使其显示在顶部,您可以使用SetForegroundWindow与控制台窗口句柄。

关于pin,我真的不确定这是否可能。