2009-09-18 23 views
5

Dobbiamo eseguire un processo da un servizio Windows e ottenere uno screenshot da esso.Screenshot del processo in Servizio Windows

abbiamo provato il BitBlt e PrintWindow chiamate Win32, ma entrambi danno bitmap (nero) in bianco.

Se si corre il nostro codice da un processo utente normale, funziona bene.

È qualcosa che è persino possibile? O potrebbe esserci un altro metodo da provare?

cose che abbiamo cercato:

  1. servizio di Windows in esecuzione come sistema locale, il processo viene eseguito come sistema locale -> screenshot non riesce
  2. servizio di Windows in esecuzione come amministratore, processo viene eseguito come amministratore -> screenshot fallisce.
  3. Applicazione Windows in esecuzione come utente XYZ, esegue un processo come XYZ -> screenshot funziona con BitBlt o PrintWindow.
  4. provato a controllare "Consenti al servizio di interagire con il desktop" dal sistema locale

Abbiamo anche notato che PrintWindow funziona meglio per il nostro caso, funziona se la finestra è dietro un'altra finestra.

Per gli altri requisiti, sia i processi padre e figlio devono essere sotto lo stesso utente. Non possiamo davvero usare la rappresentazione da un processo all'altro.

+1

Hai provato a consentire al servizio di interagire con il desktop? –

+0

Ottima idea, ma non ha funzionato neanche. Penso anche che quando l'ho eseguito come utente amministratore, era l'equivalente a farlo. Non è possibile un utente e selezionare "Consenti al servizio di interagire con il desktop" dalla console di gestione: è disabilitato. – jonathanpeppers

+0

Quelli che cercano, vedi anche [Cattura schermo sulla sessione desktop del server] (http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot

risposta

3

Non credo sia possibile.

Abbiamo dovuto cambiare il nostro scenario in cui la nostra applicazione non è stato avviato da un servizio, ma era un programma standard di Windows che ha un NotifyIcon in un angolo.

Se qualcuno trova ancora una vera risposta, me lo faccia sapere.

3

Hai provato a correre come sistema locale con il "Consenti al servizio di interagire con il desktop" controllato?

+0

+1: questa è una buona idea se funziona. È certamente l'unica soluzione a cui possa pensare. – David

+0

Vedere il commento sopra. – jonathanpeppers

-1

Funziona con sistema locale con il "Consenti al servizio di interagire con il desktop"

È possibile impostare programatically usando questo codice di esempio:

http://www.vbforums.com/showthread.php?t=367177 (è vb.net ma molto semplice)

+0

Funziona solo su XP. Non su Vista o 7. E su XP ha due svantaggi: 1. Se lo abiliti, puoi incorrere in problemi creando connessioni di rete all'interno del tuo servizio. 2. Verrà visualizzato solo sul desktop del primo utente che ha effettuato l'accesso. Se si passa rapidamente a un secondo utente, non verrà visualizzato nulla. – Oliver

+0

Ad.1 Connessioni di rete? Facendo screenshot? Ad.2 Sì, hai ragione, a causa della sessione 0 Isolamento non funziona in Vista/7 – ufoq

6

Attualmente non riesco a trovare i link corrispondenti, ma il problema è, che un servizio di Windows viene eseguito in un'altra sessione di un'applicazione utente normale.

In XP questo non era completamente vero. Qui sono tutti i servizi avviati nella sessione 0 e il primo utente che accede al sistema sarà anche eseguito nella sessione 0. Quindi, in questo caso, trucchi come Consenti al servizio di interagire con il desktop lavoro. Ma se si passa velocemente a un altro utente, ottiene la Sessione 1 e non ha alcuna possibilità di interagire direttamente con il servizio. Questo vale anche se ci si connette tramite RDP ad una versione server (come 2003 o 2008). Questi accessi inizieranno anche in una sessione superiore a 0.

Ultimo ma non meno importante c'è un altro inconveniente utilizzando l'interazione con il desktop:
Se si abilita questa opzione e il servizio è in esecuzione con il (default) conto di sistema, non sarà in grado di creare una connessione di rete più.

Il modo corretto per ottenere una GUI personalizzata che funzioni con un servizio è separarli in due processi e fare una sorta di IPC (comunicazione tra processi). Quindi il servizio verrà avviato all'avvio della macchina e verrà avviata un'applicazione GUI nella sessione utente. In tal caso, la GUI può creare uno screenshot, inviarlo al servizio e il servizio può farlo, qualunque cosa tu voglia.

Problemi correlati