2010-08-09 5 views
15

Прежде чем вы ответите на этот вопрос, позвольте мне объяснить (как я прочитал все подобные темы).Скрыть окно команд в приложении C#

Мое приложение имеет оба этих параметра:

procStartInfo.CreateNoWindow = true; 
    procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

и также имеет Windowsapplication как тип вывода.

Черное окно STILL появляется, когда я вызываю команду командной строки. Есть ли что-нибудь еще, что я могу сделать, чтобы скрыть окно? Это не происходит для всех команд, XCOPY - это ситуация, когда черное окно вспыхивает. Это происходит только тогда, когда место назначения, в котором я XCOPYing, уже содержит файл, и оно подсказывает мне, хочу ли я его заменить. Даже если я перейду в/Y, он все равно будет кратковременно мигать.

Я открыт для использования vbscript, если это поможет, но любые другие идеи?

клиент позвонит мой исполняемый файл, а затем передать в командной командной строки, т.е.:

C:\MyProgram.exe start XCOPY c:\Test.txt c:\ProgramFiles\

Вот полный код приложения:

class Program 
{ 
    static void Main(string[] args) 
    {  
      string command = GetCommandLineArugments(args); 

      // /c tells cmd that we want it to execute the command that follows and then exit. 
      System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command); 

      procStartInfo.RedirectStandardOutput = true; 
      procStartInfo.UseShellExecute = false; 

      // Do not create the black window. 
      procStartInfo.CreateNoWindow = true; 
      procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      process.StartInfo = procStartInfo; 
      process.Start(); 

     } 

    private static string GetCommandLineArugments(string[] args) 
    { 
     string retVal = string.Empty; 

     foreach (string arg in args) 
      retVal += " " + arg; 


     return retVal; 
    } 
} 
+0

вы можете разместить остальную часть вашего 'Process' /' ProcessStartInfo' с ода? –

+3

@fletcher: В вопросе говорится, что тип вывода - это приложение Windows, а не консоль. Я тестировал его с типом вывода, установленным в приложении Windows, и он отлично работает. @snow: я бы дважды проверить настройки OutputType. – nukefusion

+0

@fletcher Это на самом деле проблема! Я бы хотел, чтобы окно не отображалось вообще! – mint

ответ

9

Проблема в том, что вы используете cmd.exe. Только его консольное окно будет скрыто, а не консольное окно для процесса, который вы попросите запустить. Мало смысла использовать cmd.exe, если вы не пытаетесь выполнить некоторые из команд, которые он реализует сам. Подобно COPY.

Вы все же можете подавить окно, если вам нужен cmd.exe, вам нужно будет использовать опцию/B для начала. Введите start /? в командной строке, чтобы просмотреть параметры. Не то чтобы это помогает, вы не можете использовать START COPY.

В xcopy.exe есть особая причуда, которая может вас отбросить. Он делает не выполняется, если вы также не перенаправляете ввод. Он просто не работает без диагностики.

+0

the/B работал для команды xcopy, это может быть все, что нам нужно быть честным. – mint

4

я вижу, что вы звоните cmd, а затем передать команду в качестве параметров. Вместо этого вызовите команду напрямую

например.

System.Diagnostics.ProcessStartInfo procStartInfo = new System.DiagnosticsProcessStartInfo("xcopy", "<sourcedir> <destdir> <other parameters>"); 

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
+0

Возможно, я должен был сказать об этом в вопросе, но клиент передаст любую команду командной строки, которую он хочет для моей программы, поэтому я не могу жестко кодировать xcopy, но все равно вас отталкивал! – mint

+1

@ Теперь вы все еще можете делать то, что он говорит, 'ProcessStartInfo procStartInfo = new ProcessStartInfo (Arg [0], String.Join (" ", Arg.Skip (1) .ToArray());' –

+0

@snow xcopy был просто например –

4

Вы можете попробовать добавить

process.StartInfo.UseShellExecute = false; 

к процессу

+2

Просто пояснить ответ. Вам нужно 'process.StartInfo.UseShellExecute = false; 'и' process.StartInfo.CreateNoWindow = false; '. Эти два вместе будут скрывать окно процесса –

+1

@ Rémi: вам нужно' process.StartInfo.CreateNoWindow = true; ' – Sjoerd222888

+0

Я получаю сообщение об ошибке« Система не может найти файл ". Это даже при том, что я добавил пользовательскую команду в переменную системы PATH. – Najeeb

0

У меня была похожая задача - Можно скрыть окно после создания с помощью вызова API. (В вашем случае вам может понадобиться вспомогательная нить.)

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

Если вы знаете ручку нового окна вы можете позвонить

ShowWindow(hWnd, 0); 

0 скрывает окно, 1 показано окно

Чтобы получить дескриптор окна, посмотрите по адресу:

pinvoke.net enumwindows(user32)