Pregunta

Hay alguna línea de comandos o .NET método que se ejecuta un proceso en segundo plano ocultar cualquier ventana se intenta abrir?

Ya lo intenté:

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

Hasta ahora sin éxito

¿Fue útil?

Solución

Consulte el motor de Matlab.

Incluso hay una interesante en CodeProject, si este enfoque se adapte a sus necesidades .

Otros consejos

revisé mi código y parece casi idéntica a la suya:

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

Process process = Process.Start(psi);

La única diferencia notable (que no sea el formato y qué constructor elegimos PSI) es mi uso de UseShellExecute y RedirectStandardOutput ya que tenía que leer el resultado del proceso de RAN.

He encontrado el código anterior se ejecuta constantemente un proceso oculto en XP y Vista. También he encontrado, sin embargo, y que puede estar experimentando la misma, que un proceso oculto puede poner en marcha otro proceso que por defecto no está oculta. En otras palabras, si se inicia proceso oculto A y el Procedimiento A, a su vez, da inicio el Proceso B, que no tiene control sobre cómo se mostrará el Procedimiento B. Ventanas de las que no tienes control sobre se pueden mostrar.

Espero que esto ayude un poco. Buena suerte.

¿Ha intentado utilizar el Microsoft DOS Inicio de comandos con el / B switch?

Microsoft DOS comando de inicio de

Por ejemplo,

START /B cmd.exe

No hay no sé una manera .Net puro para lograr este objetivo.

Entonces pensé Objetos alrededor del núcleo de empleo , pero se encontró ninguna opción similar en restricciones de interfaz de usuario .

Por lo tanto, el siguiente ( aún no verificada ) idea es crear que en el proceso en suspensión, crear un gancho ventanas entonces, que supervisará CallWndProc y filtrar los mensajes WM_SHOW. (Entonces, seguramente, reanudar el proceso, esperar en un hilo separado hasta que se termina, quitar el gancho)

Es posible que desee probar el BackgroundWorker Clase en el .Net Framework si no lo ha hecho. Es para la ejecución de procesos de largo se ejecutan en un hilo separado para evitar que obstaculicen la interfaz de usuario. Darle un aspecto.

Me doy cuenta de que esto ha sido contestada, pero se podía forzar una ventana para ocultar con llamadas no administrados a FindWindow y 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

En lugar kludgy.

Depende de si desea iniciar la aplicación minimizada, pero le permiten interactuar con el usuario, si es necesario, o si desea prohibir todo acceso con el usuario, independientemente de lo que sucede.

En este último caso, puede ejecutar el proceso en un contexto diferente al escritorio del usuario actual.

Se utilizan

Los diferentes contextos de escritorio, por ejemplo, por la ventana de acceso y por Vista UAC -. todo lo que sucede en un contexto de escritorio es independiente de los demás

Puede ser un enfoque de martillo para su problema sin embargo.

Me di cuenta de que si CreateNoWindow = false no hace absolutamente nada cuando el nombre del archivo que apunta a un ejecutable de Windows, si tienes acceso al código fuente de la aplicación winform, a continuación, usted podría ser capaz de proporcionar un argumento de línea de comando que controla la visibilidad predeterminada de la forma, y hacer algo como esto en la Aplicación Winform código de inicio:

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);
    }

En que el código para llamar, ahora se puede especificar "dontShowWindow" como un Argumento de proceso:

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

Espero que esto ayude

Una forma muy simple manera de lograr esto es crear una cuenta de servicio y ejecutar el ejecutable bajo el contexto del usuario de cuenta de servicio a través del programador de tareas de Windows.

Usted podría utilizar esta CodeProject para configurar la tarea programada:

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

Se puede crear la cuenta de servicio mediante programación en la máquina de dominio o local muy fácilmente con C #.

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

Los procesos que se ejecutan como tareas programadas en el contexto de otro usuario no aparecen de forma interactiva a menos que el usuario se registra en; por lo tanto, el uso de una cuenta de servicio.

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

funciona muy bien!

Asumo que quiere un proceso que no es visible para los usuarios mientras se ejecuta.

Puede intentar lo siguiente para ver si esto es lo que desea.

  1. Crear una aplicación de consola simple que sigue funcionando (y poner en marcha para poner a prueba).
  2. Haga clic derecho sobre Proyecto -> Propiedades -> pestaña de Aplicaciones -> Tipo de salida -> cambiarlo de "Aplicación de consola" de aplicación de Windows
  3. .
  4. Lanzamiento de la misma aplicación una vez más (para ver si esto es lo que quiere).
  5. Cierre la aplicación a través del Administrador de tareas de Windows:)

Parece que el proceso aparece en el Administrador de tareas, sin embargo, no es visible en la barra de tareas. Alt + TAB no pueden llevar este proceso hacia arriba.

Sólo espero que usted no está haciendo cualquier aplicación maliciosa, sin embargo:)

Creo que lo que es posible que desee probar es la creación de una nueva estación de Windows. Echa un vistazo a este artículo que explica un poco acerca de ellos en MSDN.

http://msdn.microsoft.com /en-us/library/ms681928(VS.85).aspx

Se podría hacer un servicio de Windows. Cualquier ventana de un servicio intenta abrir sólo se ejecuta en la sesión 0, lo que significa que ningún usuario pueda verlo. Esto es válido para todas las ventanas sin embargo, lo que tal vez eso no es lo que estás buscando.

A continuación el código que funcionó para mí: A principios del proceso (bloc de notas) utiliza para actualizar el bloc de notas en la pantalla del escritorio para la impresión, pero es distraer al usuario, por lo que a continuación código oculta el proceso de bloc de notas en el fondo.

                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();
                }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top