当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

如何隐藏控制台窗口?

admin 102℃
问:我有一个不应该看到的控制台程序。 (它重置IIS并删除临时文件。)

现在我可以像这样在开始后立即隐藏窗口:

static void Main(string[] args)
{
    var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
    Console.WriteLine(currentProcess.MainWindowTitle);

    IntPtr hWnd = currentProcess.MainWindowHandle;//FindWindow(null, "Your console windows caption"); //put your console window caption here
    if (hWnd != IntPtr.Zero)
    {
        //Hide the window
        ShowWindow(hWnd, 0); // 0 = SW_HIDE
    }

问题是这显示了一秒钟的窗口。 有没有控制台程序的构造器,我可以在显示前隐藏窗口?

第二个:

我使用

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

我不喜欢里面的32个。没有dllimport有什么办法吗?
一种.net方式?

如果您不需要控制台(例如 Console.WriteLine )然后将应用程序生成选项更改为Windows应用程序。

这将更改 .exe 页眉,以便在应用程序启动时Windows不分配控制台会话。

如果我理解您的问题,请手动创建控制台进程并隐藏控制台窗口:

Process process = new Process();
process.StartInfo.FileName = "Bogus.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;

我这样做是为了一个wpf应用程序,它执行一个控制台应用程序(在后台工作程序中),并重定向标准输出,以便您可以在需要时在窗口中显示结果。很有用,所以如果需要查看更多代码(工作代码、重定向、参数传递等),请告诉我。

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CloseHandle(IntPtr handle);

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeConsole();

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern IntPtr GetStdHandle([MarshalAs(UnmanagedType.I4)]int nStdHandle);

// see the comment below
private enum StdHandle
{
    StdIn = -10,
    StdOut = -11,
    StdErr = -12
};

void HideConsole()
{
    var ptr = GetStdHandle((int)StdHandle.StdOut);
    if (!CloseHandle(ptr))
        throw new Win32Exception();

    ptr = IntPtr.Zero;

    if (!FreeConsole())
        throw new Win32Exception();
}

查看更多与控制台相关的api调用here

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    [DllImport("kernel32")]
    public static extern IntPtr GetConsoleWindow();
    [DllImport("Kernel32")]
    private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add);

    static void Main(string[] args)
    {
        IntPtr hConsole = GetConsoleWindow();
        if (IntPtr.Zero != hConsole)
        {
            ShowWindow(hConsole, 0); 
        }
    }

这应该按你的要求做。

转载请注明:我的代码 » 如何隐藏控制台窗口?