2009-07-17 5 views
3

J'utilise CreateProcess() avec les indicateurs de démarrage définis sur STARTF_USESHOWWINDOW et SW_HIDE pour démarrer une application en arrière-plan avec sa fenêtre masquée. Je le fais pour exécuter des tâches de maintenance planifiées et je ne veux pas être dérangé par Windows. Dans la plupart des cas, les fenêtres sont cachées, mais il y a des cas où la fenêtre du programme apparaît devant vous (par exemple Google Chrome - j'ai commencé à tester avec différentes applications pour voir si c'était un problème de temps mais non. ..).Création de processus masqués (fenêtre non visible)

Cela se produit moins dans Windows XP, mais cela arrive beaucoup sur Vista.

Y a-t-il un drapeau qui me manque? Y at-il un autre moyen 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 
} 

Répondre

4

Vous pouvez démarrer le processus sur un autre bureau en utilisant le membre lpDesktop de la structure STARTUPINFO transmise à CreateProcess. De cette façon, le processus aura toutes ses fenêtres affichées, mais sur un autre bureau, de sorte que vous (ou vos utilisateurs) ne seront pas dérangés par cela.

Je n'ai jamais travaillé avec plusieurs ordinateurs de bureau, donc je ne peux pas dire quels seraient les effets secondaires, mais je pense que c'est faisable. Commencez par regarder dans CreateDesktop et continuez.

+0

ok, cela semble fonctionner, mais je reçois une erreur et après avoir recherché le MSDN il dit que je n'ai pas besoin de privilèges DESKTOP_CREATEWINDOW. Savez-vous comment changer les privilèges de mon processus et ajouter DESKTOP_CREATEWINDOW? – wonderer

+0

Ok, je le découvre. createdesktop était la réponse. Merci! – wonderer

0

Certains programmes pourraient ignorer/remplacer SW_HIDE drapeau. Vous pouvez essayer de masquer la fenêtre après le démarrage du processus enfant.

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

+0

mais cela scintillerait la fenêtre devant moi. Très ennuyeux ... – wonderer

0

Je ne me souviens pas de la réponse à votre question, mais je voudrais suggérer que peut-être vous ne devriez pas garder la fenêtre totalement cachée? Si vous voulez que la fenêtre soit à l'écart, minimisez-la. le masquer complètement supprime uniquement la possibilité de vérifier vos tâches de maintenance planifiées.

0

Je suggère de faire un service. D'une part, cela lui permettra d'exécuter votre maintanence programmée même lorsque personne n'est connecté. D'autre part, il est assez facile de configurer les services pour qu'ils n'aient pas accès au bureau.

Questions connexes