Как я могу скрыть окно консоли? - PullRequest
16 голосов
/ 25 августа 2010

Вопрос: у меня есть консольная программа, которую не надо видеть. (Сбрасывает 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?

Ответы [ 4 ]

32 голосов
/ 25 августа 2010

Если вам не нужна консоль (например, для Console.WriteLine), измените параметры сборки приложений на приложения Windows.

Это изменит флаг в заголовке .exe, чтобы Windows не делала это.• выделить сеанс консоли при запуске приложения.

9 голосов
/ 25 августа 2010

Если я понимаю ваш вопрос, просто создайте процесс консоли вручную и скройте окно консоли:

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

Я делаю это для приложения WPF, которое выполняет консольное приложение (в фоновом режиме) и перенаправляет стандартный вывод, чтобы при необходимости вы могли отобразить результат в окне. Работает, так что дайте мне знать, если вам нужно больше кода (рабочий код, перенаправление, передача аргументов и т. Д.)

3 голосов
/ 25 августа 2010
[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 для консоли здесь

2 голосов
/ 14 марта 2014
    [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); 
        }
    }

Это должно сделать то, что вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...