Есть какой-нибудь способ запускать процессы в фоновом режиме?

StackOverflow https://stackoverflow.com/questions/1115080

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Ознакомьтесь с Движок Matlab.

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

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

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

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

Process process = Process.Start(psi);

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

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

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

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

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

Например,

START /B cmd.exe

Там нет никакого Я не знаю чистого .Чистый способ достичь этого.

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

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

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

Я понимаю, что на этот вопрос был дан ответ, но вы могли бы принудительно скрыть окно с помощью неуправляемых вызовов 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

Довольно неуклюжий.

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

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

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

Хотя это может быть подход с кувалдой к вашей проблеме.

Я заметил, что если 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);

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

Один очень простой способ добиться этого - создать учетную запись службы и запустить исполняемый файл в контексте пользователя учетной записи службы через Планировщик задач 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

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

public Form1()
    {
        InitializeComponent();
        Form1 fm = new Form1();
        fm.ShowInTaskbar = false;
        fm.Visible = fm.ShowInTaskbar = false;
    }

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

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

Вы можете попробовать следующее, чтобы убедиться, что это то, чего вы хотите.

  1. Создайте простое консольное приложение, которое продолжает работать (и запустите его для тестирования).
  2. Щелкните правой кнопкой мыши Проект -> Свойства -> Вкладка приложения -> Тип вывода -> Измените его с "Консольного приложения" на приложение Windows.
  3. Запустите то же приложение еще раз (чтобы убедиться, что это то, чего вы хотите).
  4. Закройте приложение через диспетчер задач Windows :)

Кажется, что процесс отображается в диспетчере задач, но не виден на панели задач.Alt + TAB не могут запустить этот процесс.

Я просто надеюсь, что вы не создаете никакого вредоносного приложения, хотя :)

Я думаю, что то, что вы, возможно, захотите попробовать, - это создать новую Windows Station.Ознакомьтесь с этой статьей, которая немного объясняет о них на msdn.

http://msdn.microsoft.com/en-us/library/ms681928 (ПРОТИВ 85).aspx

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

Приведенный ниже код сработал для меня:Ранее процесс (notepad) использовался для отображения notepad на экране рабочего стола для печати, но это отвлекает пользователя, поэтому приведенный ниже код скрывает процесс notepad в фоновом режиме.

                System.Windows.Forms.PrintDialog printDialog = new PrintDialog();
                System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt");
                psi.Verb = "PRINT";

                //Process.Start(psi);
                //psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                //---------------------------------------------------

                psi.CreateNoWindow = false;
                psi.UseShellExecute = true;
                psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt";
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.Arguments =  @"%windir%\system32\notepad.exe"; 
                //Process.Start(psi);
                //------------------------------------------------------

                /////////////////////----------------------------------

                printProcess.StartInfo = psi;
                /////psi.CreateNoWindow = true;

                //psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt";
                //p.StartInfo.FileName = "Notepad.EXE";
                //p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\"";

                printProcess.Start();

                /////////////////////////-------------------------------
                while (!printProcess.HasExited) ;


                if (!printProcess.HasExited)
                {
                    printProcess.Close();
                }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top