Вопрос

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

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

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

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

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

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

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

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;
    }
}
Это было полезно?

Решение

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

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

В XCopy.exe есть специфический quirk. Оно делает нет Выполните, если вы также не перенаправляете ввод. Это просто не работает без диагностики.

Другие советы

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

например

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

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

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

process.StartInfo.UseShellExecute = false; 

к вашему процессу

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

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

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

ShowWindow(hWnd, 0);

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

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

Pinvoke.net enumwindows (user32)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top