Pergunta

Estou criando um aplicativo com sua janela principal escondida usando o seguinte código:

STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));

siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;

if(CreateProcess(MyApplication, "", 0, 0, FALSE, 0, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE)  
{
 // blah    
 return 0;
}

Tudo funciona corretamente, exceto o meu aplicativo principal (aquele que chama esse código) perde o foco quando abro o novo programa. Tentei diminuir a prioridade do novo processo, mas o problema de foco ainda está lá.

Existe alguma maneira de evitar isso? Além disso, existe alguma maneira de criar outro processo sem usar o CreateProcess (ou qualquer uma das APIs que chamam CreateProcess como Shellexecute)?

Meu palpite é que meu aplicativo está perdendo o foco porque foi dado ao novo processo, mesmo quando está oculto.

Para aqueles de vocês curiosos por aí que certamente perguntarão ao habitual "Por que você quer fazer isso", minha resposta é porque eu tenho um processo de vigilância que não pode ser um serviço e ele começa sempre que abro meu aplicativo principal. Satisfeito?

Obrigado pela ajuda. O código será apreciado. Jess.

Foi útil?

Solução

O aplicativo que você está executando está assumindo o foco da janela.

Uma maneira de contornar esse problema é iniciar seu novo processo em um novo desktop. Isso impediria que o aplicativo roubasse o foco da janela na sua área de trabalho.

O código para executar um processo em um novo desktop deve parecer algo assim:

HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );

Outras dicas

Claramente, o aplicativo de destino não está homenageando as bandeiras ShowWindow. Você precisa corrigir o aplicativo lançado para que não seja ganancioso.

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