2009-09-18 15 views
5

Tenemos que ejecutar un proceso desde un servicio de Windows y obtener una captura de pantalla de la misma.Captura de pantalla del proceso en el Servicio de Windows

Probamos las llamadas BitBlt y PrintWindow Win32, pero ambas dan bitmaps en blanco (negro).

Si ejecutamos nuestro código desde un proceso de usuario normal, funciona bien.

¿Es esto algo que incluso es posible? ¿O podría haber otro método para probar?

cosas que probamos:

  1. servicio de Windows que se ejecuta como sistema local, el proceso se ejecuta como sistema local -> pantalla falla
  2. servicio de Windows que se ejecuta como administrador, el proceso se ejecuta como administrador -> pantalla falla.
  3. Aplicación de Windows que se ejecuta como usuario XYZ, ejecuta un proceso como XYZ -> captura de pantalla funciona con BitBlt o PrintWindow.
  4. Intentó marcar "Permitir a los servicios interactuar con el Escritorio" de sistema local

También hay que destacar que PrintWindow funciona mejor para nuestro caso, funciona si la ventana está detrás de otra ventana.

Para otros requisitos, los procesos padre e hijo deben estar bajo el mismo usuario. Realmente no podemos usar la suplantación de un proceso a otro.

+1

¿Intentó permitir que el servicio interactúe con el escritorio? –

+0

Muy buena idea, pero tampoco funcionó. También creo que cuando lo ejecuté como usuario administrador, fue el equivalente a hacer esto. No puede ver a un usuario y marcar "permitir que el servicio interactúe con el escritorio" desde la consola de administración; está deshabilitado. – jonathanpeppers

+0

Esas búsquedas, consulte también [Pantalla de captura en la sesión del escritorio del servidor] (http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot

Respuesta

3

No creo que esto sea posible.

Tuvimos que cambiar nuestro escenario donde nuestra aplicación no se inició desde un servicio, pero era un programa de Windows estándar que tiene NotifyIcon en la esquina.

Si alguien encuentra una respuesta real, házmelo saber.

3

¿Ha intentado ejecutar como sistema local con el "Permitir que el servicio interactúe con el escritorio" marcado?

+0

+1 - Esta es una buena idea si funciona. Sin duda es la única solución que puedo pensar que podría. – David

+0

Ver el comentario anterior. – jonathanpeppers

-1

Funciona utilizando sistema local con la opción "Permitir a los servicios interactuar con el escritorio"

Se puede establecer mediante programación utilizando este código de ejemplo:

http://www.vbforums.com/showthread.php?t=367177 (es vb.net pero muy simple)

+0

Esto funciona solo en XP. No en Vista o 7. Y en XP tiene dos inconvenientes: 1. Si habilita esto, puede tener problemas al crear conexiones de red dentro de su servicio. 2. Solo se mostrará en el escritorio del primer usuario que haya iniciado sesión. Si realiza un cambio rápido a un segundo usuario, tampoco verá nada. – Oliver

+0

Ad.1 ¿Conexiones de red? Al hacer una captura de pantalla? Ad.2 Sí, tienes razón, debido a la sesión 0 de aislamiento no funciona en Vista/7 – ufoq

6

Actualmente no puedo encontrar los enlaces correspondientes, pero el problema es que un servicio de Windows se ejecuta en otra sesión que no es una aplicación de usuario normal.

En XP esto no era del todo cierto. Aquí están todos los servicios iniciados en la Sesión 0 y el primer usuario que inicia sesión en el sistema también se ejecutará en la Sesión 0. Entonces, en ese caso, trucos como Permitir que el servicio interactúe con el trabajo de escritorio. Pero si cambia rápidamente a otro usuario, obtiene la Sesión 1 y no tiene posibilidad de interactuar directamente con el servicio. Esto también es cierto si se conecta a través de RDP a una versión de servidor (como 2003 o 2008). Estos inicios de sesión también comenzarán en una sesión superior a 0.

Por último, pero no menos importante, hay otra desventaja al usar la interacción con el escritorio:
Si habilita esta opción y su servicio se ejecuta bajo la cuenta SYSTEM (predeterminada) no podrá crear una conexión de red nunca más.

La forma correcta de obtener una GUI personalizada que funcione con un servicio es separarlos en dos procesos y hacer algún tipo de IPC (comunicación entre procesos). Por lo tanto, el servicio se iniciará cuando aparezca la máquina y se iniciará una aplicación GUI en la sesión del usuario. En ese caso, la GUI puede crear una captura de pantalla, enviarla al servicio y el servicio puede hacerlo, lo que quiera.

Cuestiones relacionadas