c# print - 显示/隐藏C#控制台应用程序的控制台窗口




console.writeline (7)

我搜索了解如何隐藏自己的控制台窗口的信息。 令人惊讶的是,我能找到的唯一解决方案是涉及FindWindow() hacky解决方案, 通过它的标题找到控制台窗口。 我深入了解Windows API,发现有更好更简单的方法,所以我想将它发布到这里供其他人查找。

你如何隐藏(并显示)与我自己的C#控制台应用程序相关的控制台窗口?


Answers

如果你想隐藏控制台本身,为什么你需要一个控制台应用程序? =)

我建议将Project Output类型设置为Windows应用程序而不是控制台应用程序。 它不会显示控制台窗口,但执行所有操作,如控制台应用程序。


您可以执行反转并将应用程序输出类型设置为:Windows应用程序。 然后将此代码添加到应用程序的开头。

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();

private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console

static void Main(string[] args)
{
    if (showConsole)
    {
        AllocConsole();
        IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
        FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
        System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
        StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
    }

    //Your application code
}

如果showConsoletrue此代码将显示控制台


就是这样:

using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

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

const int SW_HIDE = 0;
const int SW_SHOW = 5;
var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);

如果你不想依靠窗口标题使用这个:

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

...

    IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
    ShowWindow(h, 0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormPrincipale());

只需转到应用程序的“ 属性”并将“ 输出”类型从“ 控制台应用程序”更改为“ Windows应用程序


如果您在集成小批量应用程序时没有问题,可以使用名为Cmdow.exe的程序,该程序将允许您根据控制台标题隐藏控制台窗口。

Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();

将该exe文件添加到解决方案中,将构建操作设置为“内容”,将“复制到输出目录”设置为适合您的内容,cmdow将在运行时隐藏控制台窗口。

要使控制台再次可见,您只需更改参数

HideConsole.StartInfo.Arguments = "MyConsole /Vis";

对于任何对asp.net网络应用感兴趣的人。 这是我3种不同方法的结果

protected void Application_Start(object sender, EventArgs e)
{
  string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
  string p3 = this.Server.MapPath("");
  Console.WriteLine("p1 = " + p1);
  Console.WriteLine("p2 = " + p2);
  Console.WriteLine("p3 = " + p3);
}

结果

p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging

该应用程序在物理上从“C:\ inetpub \ SBSPortal_staging”运行,因此第一个解决方案绝对不适合Web应用程序。





c# console console-application