【问题标题】:How to hide C# console on winform before at launch如何在启动前在 Winform 上隐藏 C# 控制台
【发布时间】:2021-07-22 10:17:26
【问题描述】:

我目前正在开发一个使用控制台的 winform。为了让我使用控制台,我必须将我的项目属性设置为使用控制台应用程序。 Console Application Setting

但是,我希望我的应用程序显示和隐藏所述控制台。我目前正在使用 user32.dll 中的一个名为 ShowWindow(IntPtr, int) 的函数来执行此操作。

我的问题是应用程序现在首先通过控制台打开,即使在活动程序的Main() 中执行此ShowWindow 函数。

我正在寻找一种方法来完全隐藏控制台,直到我使用 ShowWindow() 取消隐藏它

下面是我如何做到这一点的片段。

#region Console Stuff
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        const int HIDE_Console = 0;
        const int SHOW_Console = 5;
#endregion

public IntPtr ConsoleHandle = GetConsoleWindow();

public Main()
{
    ShowWindow(ConsoleHandle, HIDE_Console);
}

这是一个示例,而不是我的确切代码。然而,它展示了我在做什么/试图做什么。

感谢所有给予的帮助!

【问题讨论】:

  • 您可以将项目类型更改为 Windows 应用程序。然后像这里回答的那样运行控制台:stackoverflow.com/a/2593411/1713975
  • @CarlosMagnoRosa 问题在于它是一个新进程,而不是与 winform 相同的进程。 ://
  • 请问控制台需要什么?
  • 我认为如果不使用不同的流程(基于其他 stackoverflow 帖子)就不可能实现您想要的目标

标签: c# winforms console dllimport


【解决方案1】:

经过大量研究,根据您的解释,这是我能得到的最接近的结果。这可能有几个限制,例如用户关闭控制台将关闭整个应用程序。这个想法是打开一个控制台,然后在需要时再次隐藏/显示。这是Winforms 应用程序,而不是控制台应用程序。这里的按钮打开控制台,只需替换为您需要打开它的任何代码。

这适用于 Windows 10、VS2019、任何 CPU。

免责声明
我尝试处理 Ctrl+C、关闭事件、发布消息以发送 ESCAPE 键、相当多的东西并阅读了一些关于 SO 的 30+ Q/A和其他地方。这大部分都不起作用。正如更有经验的开发人员肯定会指出的那样,这种解决方案可能既不理想也不健壮。我发布它以防万一它涵盖您的情况。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WinFormsTest
{
    public partial class Form1 : Form
    {
        private static bool firstTime = true;

        [DllImport("kernel32")]
        private static extern bool AllocConsole();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        public Form1()
        {
            InitializeComponent();

            button1.MouseDown += (o, s) =>
            {
                CreateOrShowConsole();
                Activate();
            };
        }

        public static void CreateOrShowConsole()
        {
            if (firstTime)
            {
                firstTime = false;
                AllocConsole();
            }
            else
            {
                Console.Clear();
                ShowWindow(GetConsoleWindow(), 5);
            }

            Console.WriteLine("Waiting for input... (Q to quit console)");
            Console.WriteLine();

            while (true)
            {
                var input = Console.ReadLine();
                if (input != null && input.ToUpper().Equals("Q"))
                {
                    ShowWindow(GetConsoleWindow(), 0);
                    break;
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2015-07-19
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多