Есть ли способ запустить процессы в фоновом режиме? - PullRequest
3 голосов
/ 12 июля 2009

Существует ли какая-либо командная строка или метод .NET, который запускает процесс в фоновом режиме, скрывая все окна, которые он пытается открыть?

Уже пробовал:

 var process = new Process()
 {
      StartInfo = new ProcessStartInfo()
      {
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          FileName = TheRealExecutableFileNameHere
      }
 }
 process.Start();

Пока безуспешно

Ответы [ 14 ]

15 голосов
/ 12 июля 2009

Я просмотрел свой код, и он выглядит почти так же, как ваш:

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
   CreateNoWindow = true,
   WindowStyle = ProcessWindowStyle.Hidden,
   UseShellExecute = false,
   RedirectStandardOutput = true                                               
};

Process process = Process.Start(psi);

Единственное заметное отличие (кроме форматирования и того, какой конструктор PSI мы выбрали) заключается в том, что я использовал UseShellExecute и RedirectStandardOutput, так как мне нужно было прочитать результат процесса run.

Я обнаружил, что приведенный выше код постоянно выполняет скрытый процесс в XP и Vista. Однако я также обнаружил, и вы, возможно, испытываете то же самое, что скрытый процесс может запустить другой процесс, который по умолчанию не скрыт. Другими словами, если вы запустите скрытый процесс A, а процесс A, в свою очередь, запустит процесс B, вы не сможете контролировать, как будет отображаться процесс B. Могут отображаться окна, которые вы не можете контролировать.

Надеюсь, это немного поможет. Удачи.

7 голосов
/ 21 июля 2009

Проверьте Matlab Engine .

Есть даже интересная статья о CodeProject, если этот подход соответствует вашим потребностям.

5 голосов
/ 24 июля 2009

Вы пытались использовать команду Microsoft DOS start с переключателем / B ?

Команда запуска Microsoft DOS

Например,

START /B cmd.exe
3 голосов
/ 21 июля 2009

Нет Я не знаю чистого .Net способа добиться этого.

Затем я подумал о ядре Job Objects , но не нашел подобной опции в Ограничениях пользовательского интерфейса .

Итак, следующая ( пока не подтвержденная ) идея состоит в том, чтобы создать, чем приостановленный процесс, затем создать обработчик окон , который будет отслеживать CallWndProc и отфильтровывать WM_SHOW сообщения. (Затем обязательно возобновите процесс, подождите в отдельном потоке, пока он не завершится, снимите зацепку)

2 голосов
/ 27 июля 2009

Я понимаю, что на этот вопрос уже получен ответ, но вы можете заставить окно скрыться с помощью неуправляемых вызовов FindWindow и ShowWindow.

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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

psi = new ProcessStartInfo(); // etc..
some_process = Process.Start(psi);
System.Threading.Thread.Sleep(50); // need give the window a chance to be created
IntPtr hWnd = FindWindow(null, "name of the window");
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE

Скорее клудги.

2 голосов
/ 24 июля 2009

Вы можете попробовать BackgroundWorker Class в .Net Framework, если вы этого еще не сделали. Он предназначен для выполнения длительных процессов в отдельном потоке, чтобы они не мешали пользовательскому интерфейсу. Посмотри.

1 голос
/ 13 июня 2015
public Form1()
    {
        InitializeComponent();
        Form1 fm = new Form1();
        fm.ShowInTaskbar = false;
        fm.Visible = fm.ShowInTaskbar = false;
    }

Отлично работает!

1 голос
/ 27 июля 2009

Один очень простой способ добиться этого - создать служебную учетную запись и запустить исполняемый файл в контексте пользователя служебной учетной записи с помощью планировщика задач Windows.

Вы можете использовать этот CodeProject для настройки запланированного задания:

http://www.codeproject.com/KB/cs/tsnewlib.aspx

Вы можете очень легко создать служебную учетную запись в Домене или на локальном компьютере с помощью C #.

http://www.codeproject.com/KB/system/OSUserMangement.aspx http://support.microsoft.com/kb/306273

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

1 голос
/ 27 июля 2009

Я заметил, что если CreateNoWindow = false абсолютно ничего не делает, когда имя файла указывает на исполняемый файл Windows, если у вас есть доступ к исходному коду приложения winform, тогда вы можете предоставить аргумент командной строки, который управляет значением по умолчанию видимость формы и сделайте что-то подобное в коде запуска приложения Winform:

static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 form1 = new Form1();

        form1.Load += new EventHandler((s,o) =>
            {
              //check if the form should be shown based on command line arg
                if (args.Contains("dontShowWindow"))
                {
                    //hide it
                    form1.ShowInTaskbar = false;
                    form1.Visible = form1.ShowInTaskbar = false;
                }
            }
        );
        Application.Run(form1);
    }

В вызывающем коде вы теперь можете указать «dontShowWindow» как аргумент процесса:

 ProcessStartInfo info = new ProcessStartInfo
        {
            CreateNoWindow = false, 
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false, 
            FileName = @"C:\temp\testWinForm.exe",
            Arguments = "dontShowWindow"
        };
        Process.Start(info);

Надеюсь, это поможет

1 голос
/ 12 июля 2009

Это зависит от того, хотите ли вы запустить приложение свернутым, но разрешить ему взаимодействие с пользователем, если это необходимо, или если вы хотите запретить весь доступ с пользователем независимо от того, что происходит.

Если последнее, вы можете запустить процесс в другом контексте рабочего стола для текущего пользователя.

Различные контексты рабочего стола используются, например, в диалоговом окне «Вход в систему» ​​и Vista UAC - все, что происходит в одном контексте рабочего стола, не зависит от других.

Может быть, кувалдой подойдет к вашей проблеме.

...