Скрыть окно команд в приложении С#
Прежде чем говорить о своем дублирующем вопросе, позвольте мне объяснить (поскольку я прочитал все подобные темы).
Мое приложение имеет оба этих параметра:
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;
}
}
Ответы
Ответ 1
Проблема в том, что вы используете cmd.exe. Только консольное окно будет скрыто, а не консольное окно для процесса, который вы попросите запустить. Там мало смысла в использовании cmd.exe, если вы не пытаетесь выполнить некоторые из команд, которые он реализует сам. Подобно COPY.
Вы все равно можете подавить окно, если вам нужен cmd.exe, вам нужно будет использовать опцию /B для Start. Введите start/? в командной строке, чтобы просмотреть параметры. Не то чтобы это помогает, вы не можете использовать START COPY.
В xcopy.exe есть определенная причуда, которая также может отбросить вас. Он не выполняется, если вы также не перенаправляете ввод. Он просто не работает без диагностики.
Ответ 2
Я вижу, что вы вызываете cmd, а затем передаете команду в качестве параметров. Вместо этого вызовите команду непосредственно
например.
System.Diagnostics.ProcessStartInfo procStartInfo = new System.DiagnosticsProcessStartInfo("xcopy", "<sourcedir> <destdir> <other parameters>");
procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Ответ 3
Вы можете попробовать добавить
process.StartInfo.UseShellExecute = false;
к вашему процессу
Ответ 4
У меня была аналогичная задача - можно скрыть окно после создания через вызов API.
(В вашем случае вам может понадобиться вспомогательная нить.)
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
Если вы знаете дескриптор нового окна, вы можете вызвать
ShowWindow(hWnd, 0);
0 скрывает окно, 1 показывает окно
Чтобы получить ручку окна, посмотрите:
pinvoke.net enumwindows (user32)