Pregunta

Estoy creando una aplicación con su ventana principal oculta usando el siguiente 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;
}

Todo funciona correctamente, excepto que la ventana de mi aplicación principal (la que llama a este código) pierde el foco cuando abro el nuevo programa. Intenté reducir la prioridad del nuevo proceso, pero el problema de enfoque sigue ahí.

¿Hay alguna forma de evitar esto? además, ¿hay alguna forma de crear otro proceso sin usar CreateProcess (o cualquiera de las API que llaman a CreateProcess como ShellExecute)?

Supongo que mi aplicación está perdiendo foco porque se le dio al nuevo proceso, incluso cuando está oculta.

Para aquellos de ustedes curiosos por ahí que sin duda preguntarán lo habitual "por qué quieren hacer esto", mi respuesta es porque tengo un proceso de vigilancia que no puede ser un servicio y se inicia cada vez que abro mi principal solicitud. ¿Satisfecho?

Gracias por la ayuda. El código será apreciado. Jess.

¿Fue útil?

Solución

La aplicación que está ejecutando está tomando el foco de la ventana.

Una forma de solucionar este problema es comenzar su nuevo proceso en un nuevo escritorio. Esto evitaría que la aplicación robe el foco de la ventana en su escritorio.

El código para ejecutar un proceso en un nuevo escritorio debería verse así:

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

Otros consejos

Claramente, la aplicación de destino no está honrando los indicadores ShowWindow. Debe corregir la aplicación iniciada para que no sea codiciosa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top