Me da la impresión de que está fotografiando para tomar una foto del escritorio real (con fondo de pantalla e íconos), y nada más.
1) Llamar ToggleDesktop() en Shell32 mediante COM
2) Uso Graphics.CopyFromScreen para copiar el área de escritorio actual
3) Llame a ToggleDesktop() para restaurar el estado anterior de escritorio
Editar: Sí, llamando MinimizeAll() es beligerante.
Aquí es una versión actualizada que Azoté juntos:
/// <summary>
/// Minimizes all running applications and captures desktop as image
/// Note: Requires reference to "Microsoft Shell Controls and Automation"
/// </summary>
/// <returns>Image of desktop</returns>
private Image CaptureDesktopImage() {
//May want to play around with the delay.
TimeSpan ToggleDesktopDelay = new TimeSpan(0, 0, 0, 0, 150);
Shell32.ShellClass ShellReference = null;
Bitmap WorkingImage = null;
Graphics WorkingGraphics = null;
Rectangle TargetArea = Screen.PrimaryScreen.WorkingArea;
Image ReturnImage = null;
try
{
ShellReference = new Shell32.ShellClass();
ShellReference.ToggleDesktop();
System.Threading.Thread.Sleep(ToggleDesktopDelay);
WorkingImage = new Bitmap(TargetArea.Width,
TargetArea.Height);
WorkingGraphics = Graphics.FromImage(WorkingImage);
WorkingGraphics.CopyFromScreen(TargetArea.X, TargetArea.X, 0, 0, TargetArea.Size);
System.Threading.Thread.Sleep(ToggleDesktopDelay);
ShellReference.ToggleDesktop();
ReturnImage = (Image)WorkingImage.Clone();
}
catch
{
System.Diagnostics.Debugger.Break();
//...
}
finally
{
WorkingGraphics.Dispose();
WorkingImage.Dispose();
}
return ReturnImage;
}
Ajuste al gusto para múltiples escenarios de monitor (aunque suene como esto debería funcionar bien para su aplicación).
¿Puedo hacer que si mi solicitud está en el foco? ¿No capturará la ventana de mi aplicación (y otras) si están frente al escritorio? – Damovisa
Intenté 'GetDesktopWindow' pero captura las ventanas que están en frente del escritorio –
¿Alguna solución final con el código fuente completo de muestra trabajando al respecto? – Kiquenet