Pergunta

Existe uma maneira de ocultar a janela do console ao executar um aplicativo de console?

Atualmente, estou usando um aplicativo Windows Forms para iniciar um processo de console, mas não quero que a janela do console seja exibida enquanto a tarefa estiver em execução.

Foi útil?

Solução

Se você estiver usando o ProcessStartInfo Classe, você pode definir o estilo da janela para esconder:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

Outras dicas

Se você escreveu o aplicativo de console, poderá ocultá -lo por padrão.

Crie um novo aplicativo de console e, em seguida, altere o tipo "Tipo de saída" para "Aplicativo do Windows" (feito nas propriedades do projeto)

Se você estiver usando a classe de processo, pode escrever

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

antes da yourprocess.start(); e o processo estará oculto

A resposta simples é que: vá para as propriedades do seu aplicativo de console (propriedades do projeto). Na guia "Aplicativo", basta alterar o "Tipo de saída" para "Aplicativo do Windows". Isso é tudo.

Você pode usar o FreecOnsole API para destacar o console do processo:

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

(É claro que isso é aplicável apenas se você tiver acesso ao código -fonte do aplicativo de console)

Se você estiver interessado na saída, pode usar esta função:

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}

Ele executa o programa de linha de comando fornecido, aguarda que ele termine e retorna a saída como string.

Se você está criando um programa que não exige entrada do usuário, você sempre pode criá -lo como um serviço. Um serviço não mostra nenhum tipo de interface do usuário.

Sei que não estou respondendo exatamente o que você quer, mas estou me perguntando se você está fazendo a pergunta certa.

Por que você também não usa:

  1. Serviço do Windows
  2. Crie um novo tópico e execute seu processo nisso

Essas parecem opções melhores, se tudo o que você deseja é executar um processo.

Adicione isso à sua classe para importar o arquivo DLL:

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

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

E então, se você quiser escondê -lo, use este comando:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);

E se você quiser mostrar o console:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);

Com base na resposta de Adam Markowitz acima, a seguir funcionou para mim:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();

Eu tenho uma solução geral para compartilhar:

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing
{
    class Magician
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

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

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        {
            ShowWindow(GetConsoleWindow(), HIDE);
        }
    }
}

Basta incluir esta aula em seu projeto e ligue Magician.DisappearConsole();.

Um console piscará quando você iniciar o programa clicando nele. Ao executar a partir do prompt de comando, o prompt de comando desaparece logo após a execução.

Faço isso para um bot da Discord que corre para sempre no fundo do meu computador como um processo invisível. Era mais fácil do que fazer com que o TopShelf funcione para mim. Alguns tutoriais de Topshelf falharam antes de escrevê -lo com alguma ajuda do código que encontrei em outro lugar. ; P

Eu também tentei simplesmente alterar as configurações no Visual Studio> Project> Properties> Application para ser lançado como um aplicativo do Windows em vez de um aplicativo de console, e algo sobre o meu projeto impediu que isso oculte meu console - talvez porque o DSharpplus exige o lançamento de um console na inicialização . Não sei. Seja qual for o motivo, essa classe me permite matar facilmente o console depois que ela aparece.

Espero que este mágico ajude alguém. ;)

Apenas escreva

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

psi.CreateNoWindow = true;

Embora, como outras respostas aqui tenham dito que você pode alterar o "tipo de saída" para "aplicativo do Windows", esteja ciente de que isso significa que você não pode usar Console.In como se tornará um NullStreamReader.

Console.Out e Console.Error Parece ainda funcionar bem, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top