Скрыть командное окно в приложении C # - PullRequest
15 голосов
/ 09 августа 2010

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

В моем приложении есть обе эти настройки:

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

итакже имеет WindowsApplication в качестве типа вывода.

Черное окно все еще появляется, когда я вызываю команду из командной строки.Что еще я могу сделать, чтобы спрятать окно?Это происходит не для всех команд, 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;
    }
}

Ответы [ 4 ]

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

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

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

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

4 голосов
/ 14 ноября 2012

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

process.StartInfo.UseShellExecute = false; 

в ваш процесс

4 голосов
/ 09 августа 2010

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

например

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

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
0 голосов
/ 04 мая 2015

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

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

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

ShowWindow(hWnd, 0);

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

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

pinvoke.net enumwindows (user32)

...