Pregunta

Estoy usando CreateProcess () con banderas de inicio establecidas para STARTF_USESHOWWINDOW y SW_HIDE para iniciar una aplicación en segundo plano con su ventana oculta. Estoy haciendo esto para ejecutar unas tareas de mantenimiento programadas y yo no quiero ser molestado con ventanas.

En la mayoría de los casos, las ventanas están ocultas, pero hay casos en los que la ventana del programa estallar a la derecha hacia fuera delante de usted (por ejemplo Chrome de Google - i empezó a probar con diferentes aplicaciones para ver si se trataba de un problema de tiempo una vez, pero nop .. .).

Esto sucede menos en Windows XP, pero sucede mucho en Vista.

¿Hay una bandera que me falta? ¿Hay alguna otra manera de crear un proceso con oculta su ventana?

Gracias!

mi código de ejemplo es:

char *ProgramName  
STARTUPINFO StartupInfoF;
PROCESS_INFORMATION ProcessInfoF;

memset(&StartupInfoF, 0, sizeof(StartupInfoF));
memset(&ProcessInfoF, 0, sizeof(ProcessInfoF));

StartupInfoF.cb = sizeof(StartupInfoF);
StartupInfoF.wShowWindow = SW_HIDE;
StartupInfoF.dwFlags = STARTF_USESHOWWINDOW;    

if (CreateProcess(ProgramName,
                  "",                 
                  0,
                  0,
                  FALSE,
                  DETACHED_PROCESS,
                  0,
                  0,                              
                  &StartupInfoF,
                  &ProcessInfoF) == FALSE)
{
  // error
}
else
{
  // OK
}
¿Fue útil?

Solución

Puede iniciar el proceso en otro escritorio, utilizando el miembro lpDesktop de la estructura STARTUPINFO pasado a CreateProcess. De esta manera el proceso tendrá todas sus ventanas que se muestran, pero en otro escritorio, por lo que (o los usuarios) no será molestado con él.

Nunca he trabajado con varios equipos de escritorio, así que no puedo decir cuáles serían los efectos secundarios, pero creo que es factible. Comience buscando en CreateDesktop y mover hacia adelante.

Otros consejos

No recuerdo la respuesta a su pregunta, pero me gustaría sugerir que tal vez no se debe mantener la ventana totalmente oculto? Si desea que la ventana fuera del camino, minimizando será suficiente; ocultarlo por completo sólo elimina la posibilidad de comprobar en sus tareas de mantenimiento programadas.

Algunos programas podrían ignorar / bandera SW_HIDE anulación. Se podría tratar de ocultar ventana después de iniciado el proceso hijo.

Otra opción es tratar de utilizar CreateProcessAsUser a los procesos de gestión en la sesión 0 que se ha aislado de escritorio (a partir de la versión Vista).

Me gustaría sugerir lo que es un servicio. Por un lado, que va a permitir que se ejecute su maintanence programada incluso cuando nadie está conectado. Por otra parte, es bastante fácil de configurar los servicios de modo que no tienen acceso al escritorio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top