GUI aplicación generado a partir de un Servicio de sistema local (a través de CreateProcessAsUser) no tiene el foco

StackOverflow https://stackoverflow.com/questions/860428

Pregunta

He creado un servicio que muestran una especie de pantalla de bienvenida en el escritorio de un usuario específico y sólo cuando el usuario se registra en (usuario quiosco).

Eso pantalla de bienvenida, una vez ingresado un código válido, le dirá que para el servicio y el servicio se va a dormir por una cantidad x de tiempo (dependiendo del código).

La pantalla de presentación, simplemente se cierra. Ahora, cuando el servicio se despierta ve que el splash ya no está allí y así ponerlo en marcha.

Todo esto está funcionando, el único problema es que la aplicación iniciada no tiene el foco, es decir, si estoy trabajando en el bloc de notas y el tiempo ha terminado, la pantalla de bienvenida se muestra (pantalla completa, aunque) detrás de la libreta.

Sólo tiene que preocuparse acerca de Windows Vista, estoy de codificación en Python usando extensiones de Win32, pero creo que este problema radica en CreateProcessAsUser cuando se llama desde la cuenta LocalSystem.


Actualización:

El 'problema' es en realidad un sobre limitación del uso para evitar que aplicaciones '' irritantes como el mío de robar el foco.

Puede cambiar el comportamiento estableciendo: win32gui.SystemParametersInfo (win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0) que es equivalente al establecer temporalmente el valor del registro: HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout Esto debe hacerse como el propio usuario, así que o edifican en la aplicación que están poniendo en marcha o construir un ayudante de lanzamiento de la aplicación que desea iniciar.

Sin embargo, una aplicación podría querer evitar contraerla de enfoque robada mediante el uso de alguna llamada a la API, que no me acuerdo en este momento.

Una buena solución probablemente sería encontrar todas las ventanas se encarga actualmente de ese usuario y luego utilizar cada uno de estos puntos de control a utilizar win32gui.ShowWindow (manejar, comandos) para minimizarlo.

A pesar de este ajuste, el ajuste de LOCKTIMEOUT era suficiente problema particular.

Si alguien se pregunta cómo me las arreglé para poner en marcha una aplicación a un escritorio de un servicio, aquí es un vínculo con el código .

¿Fue útil?

Solución 2

Por diversas razones muy legitimados, Microsoft habría preferido no ver el lanzamiento de un servicio de una aplicación y el robo de enfoque, sin embargo me encontré con el siguiente trabajo en torno a todavía lograr lo que quiero.

intención El original es tener un quiosco, como la aplicación obstaculizado por un código de acceso como pantalla de presentación, que al entrar un código de 8 caracteres se cierra la pantalla de presentación para un período de tiempo como en el código de paso definida. Originalmente, la aplicación real de utilización fue iniciado por la carpeta de inicio automático.

Sin embargo ahora volvió a escribir que es lanzado desde mi servicio, de esta manera puedo ocultar la aplicación mediante el lanzamiento de una aplicación de ayuda del servicio que solo esconde el programa y pone en marcha la pantalla de bienvenida, al salir de la pantalla de bienvenida del programa es devuelto a su estado anterior.

Otros consejos

¿Usted ha intentado poner en marcha otros procesos que no sea su propia desde el servicio para ver si se obtiene foco? Al igual que el bloc de notas y ver si se roba el foco de su navegador? Si es así tal vez su programa que puede recuperar el foco cuando se inicia.

Me lo contrario beilive es el atributo de la wShowWindow STARTUPINFO struct los puntos lpStartupInfo a que debe controlarlo. También es necesario STARTF_USESHOWWINDOW en dwFlags utilizar nShowWindow. Los valores deben ser SW_SHOW creo, que se enumeran para la función ShowWindow si quieres probar otra.

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