Pergunta

Eu estou usando CreateProcess () com bandeiras de inicialização definido como STARTF_USESHOWWINDOW e SW_HIDE para iniciar um aplicativo em segundo plano com a sua janela oculta. Estou fazendo isso para executar uma tarefas de manutenção programadas e eu não quero ser incomodado com janelas.

Na maioria dos casos as janelas estão escondidos, mas há casos em que a janela do programa saia bem na frente de você (por exemplo o Google Chrome - i começou a testar com diferentes aplicativos para ver se esta era uma vez o tempo problema mas Nope .. .).

Isso acontece menos no Windows XP, mas isso acontece muito no Vista.

Existe uma bandeira que eu estou ausente? Existe alguma outra maneira de criar um processo com a sua janela oculta?

Obrigado!

meu código de exemplo é:

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
}
Foi útil?

Solução

Você pode iniciar o processo em outra área de trabalho, usando o membro lpDesktop da estrutura STARTUPINFO passado para CreateProcess. Desta forma, o processo terá todas as suas janelas mostradas, mas em outra área de trabalho, para que você (ou seus usuários) não será incomodado com isso.

Eu nunca trabalhei com várias áreas de trabalho, então eu não posso dizer quais seriam os efeitos colaterais, mas eu acho que é factível. Comece por olhar para CreateDesktop e seguir em frente.

Outras dicas

Não me lembro a resposta à sua pergunta, mas eu gostaria de sugerir que talvez você não deve manter a janela totalmente escondido? Se você quiser que a janela para fora do caminho, minimizando será suficiente; escondê-lo completamente só remove a capacidade de verificar em suas tarefas programadas de manutenção.

Alguns programas podia ignorar bandeira SW_HIDE / substituição. Você poderia tentar esconder a janela após o processo de criança começou.

Outra opção é tentar usar CreateProcessAsUser para executar processos na Sessão 0, que isolou área de trabalho (a partir da versão Vista).

Eu sugiro tornando-se um serviço. Por um lado, que lhe permitirá executar o seu maintanence agendada mesmo quando ninguém está logado. Por outro lado, é bastante fácil de serviços configurados para que eles não têm acesso ao ambiente de trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top