Ocultar janela de console de Process.Start C #


102

Estou tentando criar o processo em uma máquina remota usando a classe System.Diagnostics.Process. Sou capaz de criar um processo. Mas o problema é que a criação de um serviço leva muito tempo e a janela do console é exibida. Outra coisa irritante é que a janela do console é exibida no topo do meu formulário do Windows e eu não consigo fazer nenhuma outra operação nesse formulário. Eu configurei todas as propriedades como CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

mas ainda mostra a janela do console. mesmo eu redirecionei a saída e os erros para fluxo separado, mas sem sorte.

Existe alguma outra maneira de ocultar a janela do console? Por favor, me ajude .

Aqui está a parte do meu código que usei para executar o comando sc.

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();

Você já tentou definir proc.StartInfo.RedirectedStandardOutput = true? Eu fiz isso funcionar com um aplicativo do Windows.
poy

alguma solução final com amostra de código-fonte completa trabalhando nisso?
Kiquenet 10/07/2013

Em um aplicativo de console do Windows , simplesmente definir UseShellExecute - sem redirecionamento ou qualquer outra coisa - funcionou para mim. Veja aqui .
Paul

No que diz respeito à abertura da janela do console e ao bloqueio do formulário, você deve executar o processo como uma Tarefa ou em um novo Tópico
Ryan Dooley

Por que você está definindo UseShellExecutee CreateNoWindowduas vezes?
Mike Lowery de

Respostas:


119

Tive um problema semelhante ao tentar iniciar um processo sem mostrar a janela do console. Testei várias combinações diferentes de valores de propriedade até encontrar uma que exibisse o comportamento que eu queria.

Aqui está uma página que detalha por que a UseShellExecutepropriedade deve ser definida como falsa.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

Na seção Comentários da página:

Se a propriedade UseShellExecute for true ou as propriedades UserName e Password não forem nulas, o valor da propriedade CreateNoWindow será ignorado e uma nova janela será criada.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}

2
Importa-se de adicionar alguns detalhes adicionais? Por que isso funciona, e não como .
aqua

2
É porque a saída padrão está forçando a existência da janela?
Denise Skidmore

1
E aparentemente você não pode redirecionar a saída padrão sem definirstartInfo.UseShellExecute = false;
Denise Skidmore

1
Estou curioso para saber por que, nessa outra resposta, eles usaram UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

9
Nunca vou entender por que as pessoas pegam uma exceção que estão apenas lançando de novo.
Blindy

54

Tive azar com esta resposta, com o processo (Wix light.exe) essencialmente saindo para almoçar e não voltando para casa a tempo para o jantar. No entanto, o seguinte funcionou bem para mim:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

2
Funcionou para mim - bom e simples!
J c

2
Essa realmente deveria ser a resposta aceita. Funciona como um encanto.
Eternal21 de

2
CreateNoWindow = truenão funcionou para mim, funcionou :)
Stefan Monov

3
Funciona apenas para aplicativos com janela, o aplicativo de console ainda exibe a janela
Geograph

18

Isso deve funcionar, tente;


Adicione uma referência do sistema.

using System.Diagnostics;

Em seguida, use este código para executar seu comando em uma janela CMD oculta.

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();

11

Isso não mostra a janela:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.CreateNoWindow = true;

...
cmd.Start();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.