Como executar um aplicativo de console C# com o console oculto
-
08-07-2019 - |
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.
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:
- Serviço do Windows
- 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.