我在谷歌上搜索了有关如何隐藏自己的控制台窗口的信息。令人惊讶的是,我能找到的唯一解决方案是一些黑客解决方案,其中涉及
FindWindow()
通过其标题找到控制台窗口。我对 Windows API 进行了更深入的研究,发现有一种更好、更简单的方法,所以我想将其发布在这里供其他人查找。
如何隐藏(和显示)与我自己的 C# 控制台应用程序关联的控制台窗口?
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("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
}
如果
showConsole
是
true
,此代码将显示控制台
我建议将项目输出类型设置为
Windows 应用程序,而不是控制台应用程序。它不会显示控制台窗口,但会执行所有操作,就像控制台应用程序一样。
将输出类型从
控制台应用程序更改为 Windows 应用程序、
并且您可以在最后使用Console.Readline/key
来代替
new ManualResetEvent(false).WaitOne()
来保持应用程序运行。
Timwi 的回答,我创建了一个辅助类来包装所需的代码:
using System;
using System.Runtime.InteropServices;
static class ConsoleExtension {
const int SW_HIDE = 0;
const int SW_SHOW = 5;
readonly static IntPtr handle = GetConsoleWindow();
[DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd,int nCmdShow);
public static void Hide() {
ShowWindow(handle,SW_HIDE); //hide the console
}
public static void Show() {
ShowWindow(handle,SW_SHOW); //show the console
}
}
[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());
-target:winexe
添加到 csc.exe 命令中,如下所示:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -out:example.exe -target:winexe example.cs
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";