2013-07-19 25 views
8

Abbiamo bisogno di uno screenshot della nostra app per un test unitario. CaptureScreen() e CopyFromScreen() in qualche modo ignorano l'app e restituiscono le immagini di un desktop vuoto. Così abbiamo scritto questo per simulare una sequenza di tasti PrtScn:Il tasto "PrtScn" automatizzato si comporta come "Alt + PrtScrn"

public static Bitmap GetAltScreenshot() 
{ 
    Clipboard.Clear(); 
    SendKeys.SendWait("{PRTSC}"); 
    while (!Clipboard.ContainsImage()) 
    { 
     Thread.Sleep(500); 
    } 
    return new Bitmap(Clipboard.GetImage()); 
} 

Alt non fa parte della sequenza di tasti, quindi questo dovrebbe restituire una bitmap di intero schermo. Eppure in qualche modo questo frammento restituisce solo la finestra focalizzata. Che va bene, che risolve il nostro problema - ma non capiamo come.

Perché questo restituisce una ripresa della finestra focalizzata, anziché dell'intero monitor?

+0

Si dovrebbe guardare: http://stackoverflow.com/questions/5049122/how-to-capture-the-screen-shot-using-net –

+0

@GeorgeJohnston Credetemi, abbiamo provato a utilizzare 'g.CopyFromScreen' prima, così come ogni altro metodo di acquisizione che potremmo trovare. Tutti hanno funzionato bene sulla mia macchina, ma hanno dato risultati strani su altre macchine all'interno dell'azienda. – 4444

+0

Potrebbe essere possibile che la classe SendKeys interpreti semplicemente la stringa di tasti "{PRTSC}" per indicare la combinazione di tasti Alt + PrtScn? Inoltre, potresti essere in grado di impostare manualmente la messa a fuoco in modo che sia l'intero schermo? [collegamento] (http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.sendwait.aspx) alla prima nota. –

risposta

5

Esiste infatti un "motivo", passare allo MSDN Library article che documenta le abbreviazioni chiave che è possibile utilizzare. Si noti la voce per STAMP:

{} PRTSC (riservato per uso futuro)

Il è un modo un po 'goffo di dire "Sappiamo che non funziona, forse risolverà che alcuni giorno". Quel giorno non è ancora arrivato. Quindi probabilmente stai testando la modalità di errore di questa chiave e in realtà come come funziona. Questo naturalmente non è salutare, potrebbe risolvere il problema un giorno e interrompere il programma.

Prendere nota della nota relativa alla voce <appSettings> che è possibile aggiungere al file .config, più in basso nella stessa pagina MSDN. Sospetto, ma non so per certo, che il metodo SendInput sia più affidabile.

+1

Sì, sono consapevole di quella "ragione" (in effetti, penso che un vecchio post da te mi indicasse lì) ma ero più o meno curioso di conoscere il funzionamento interno di questo mistero. Suppongo che questo sia tanto quanto Microsoft è disposto a farci sapere a questo. – 4444

+0

Davvero non conosco il motivo sottostante. L'hook di journaling che usano senza appetting è, erm, bizzarro. –