Domanda

sto utilizzando CreateProcess () con le bandiere di avvio impostate STARTF_USESHOWWINDOW e SW_HIDE per avviare un'applicazione in background con la sua finestra nascosta. Sto facendo questo per eseguire un'attività di manutenzione programmata e io non voglio essere disturbato con le finestre.

Nella maggior parte dei casi le finestre sono nascosti, ma ci sono casi in cui la finestra del programma schiocca a destra, fuori di fronte a voi (per esempio Google Chrome - ho iniziato il test con applicazioni diverse per vedere se questo è stato un problema di tempo una volta ma no .. .).

Questo accade meno in Windows XP, ma succede molto su Vista.

C'è una bandiera che mi manca? C'è un altro modo per creare un processo con la sua finestra nascosta?

Grazie!

il mio codice di esempio è il seguente:

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
}
È stato utile?

Soluzione

È possibile avviare il processo su un altro desktop, utilizzando il membro lpDesktop della struttura STARTUPINFO passata a CreateProcess. In questo modo il processo avrà tutte le sue finestre mostrate, ma su un altro desktop, in modo da (o gli utenti) non sarà disturbato con esso.

Non ho mai lavorato con desktop multipli, quindi non posso dire che cosa sarebbe gli effetti collaterali, ma penso che sia fattibile. Inizia, cercando in CreateDesktop e muoversi in avanti.

Altri suggerimenti

non mi ricordo la risposta alla tua domanda, ma vorrei suggerire che forse non si dovrebbe tenere la finestra a scomparsa totale? Se si desidera che la finestra di mezzo, riducendo al minimo è sufficiente; nascondendolo completamente rimuove solo la capacità di controllare le attività di manutenzione programmata.

Alcuni programmi potevano ignorare / esclusione SW_HIDE bandiera. Si potrebbe provare a nascondere la finestra dopo processo figlio ha iniziato.

Un'altra opzione è quella di cercare di utilizzare CreateProcessAsUser per eseguire i processi nella sessione 0, che ha isolato desktop (a partire dalla versione Vista).

Io suggerirei che lo rende un servizio. Per prima cosa, che gli permetterà di eseguire il vostro maintanence stabilito, anche se nessuno è connesso. Per un altro, è abbastanza facile da configurare i servizi in modo che essi non hanno accesso al desktop.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top