Question

J'utilise CreateProcess () avec des drapeaux de démarrage mis à STARTF_USESHOWWINDOW et SW_HIDE pour démarrer une application en arrière-plan avec sa fenêtre cachée. Je fais cela pour exécuter une tâches de maintenance planifiées et je ne veux pas être dérangé par les fenêtres.

Dans la plupart des cas, les fenêtres sont cachées, mais il y a des cas où la fenêtre du programme pops juste devant vous (par exemple Chrome de Google - je commencé à tester avec différentes applications pour voir si cela était un problème de temps une fois, mais Nope .. .).

Cela se produit moins sous Windows XP, mais il arrive beaucoup sur Vista.

Y at-il un drapeau que je suis absent? Y at-il une autre façon de créer un processus avec sa fenêtre cachée?

Merci!

mon exemple de code est:

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
}
Était-ce utile?

La solution

Vous pouvez commencer le processus sur un autre bureau, en utilisant le membre lpDesktop de la structure STARTUPINFO passée à CreateProcess. De cette façon, le processus aura toutes ses fenêtres montrées, mais sur un autre bureau, de sorte que vous (ou vos utilisateurs) ne sera pas pris la peine avec elle.

Je ne l'ai jamais travaillé avec plusieurs postes de travail, je ne peux pas dire quels seraient les effets secondaires, mais je pense qu'il est faisable. Commencez par regarder dans CreateDesktop et se déplacer en avant.

Autres conseils

Je ne me rappelle pas la réponse à votre question, mais je voudrais suggérer que vous devriez peut-être pas garder la fenêtre complètement caché? Si vous voulez que la fenêtre de la route, réduisant au minimum il suffit; cacher supprime complètement seulement la capacité de vérifier vos tâches de maintenance planifiées.

Certains programmes pourraient ignorer / override drapeau SW_HIDE. Vous pouvez essayer de cacher la fenêtre après le processus de l'enfant a commencé.

Une autre option est d'essayer d'utiliser CreateProcessAsUser pour exécuter des processus dans la Session 0 qui a bureau isolé (à partir de la version Vista).

Je vous suggère de rendre un service. D'une part, qui lui permettra d'exécuter votre maintanence programmée même quand personne est connecté. D'autre part, il est assez facile à mettre en place des services afin qu'ils n'ont pas accès au bureau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top