Hola,
Veréis quiero capturar con cierta frecuencia una ventana. Según he podido encontrar este sería el código que se usaría. Funcionar me funciona, el problema está en que cuando lleva varios minutos, la pantalla que está capturando empieza a verse mal. Alguna idea para mejorar esto y que la otra ventana se vea bien?
public static Bitmap GetWindow(IntPtr hWnd)
{
Bitmap bmp = null;
IntPtr hdc = GetDC(hWnd);
if ((int)hdc != 0)
{
IntPtr hdcMem = CreateCompatibleDC(hdc);
if ((int)hdcMem != 0)
{
IntPtr hbitmap = CreateCompatibleBitmap(hdc, GetSystemMetrics(0), GetSystemMetrics(1));
if ((int)hbitmap != 0)
{
SelectObject(hdcMem, hbitmap);
if (PrintWindow(hWnd, hdcMem, 1))
{
bmp = System.Drawing.Image.FromHbitmap(hbitmap);
}
}
DeleteObject(hbitmap);
}
DeleteObject(hdcMem);
}
ReleaseDC(hWnd, hdc);
return bmp;
}
Muchas gracias.
Hola, proba esto, lo he probado con algunas ventanas y funciona.
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("User32.dll", SetLastError:=True)> _
Private Shared Function PrintWindow(ByVal hwnd As IntPtr, ByVal hDC As IntPtr, ByVal nFlags As UInteger) As Boolean
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.BackgroundImage = CapturarPantalla(&H101A2)
End Sub
Private Function CapturarPantalla(ByVal pHandle As Integer) As Bitmap
Dim g As Graphics = Me.CreateGraphics
Dim bmp As New Bitmap(Me.Size.Width, Me.Size.Height, g)
Dim memoryGraphics As Graphics = Graphics.FromImage(bmp)
Dim dc As IntPtr = memoryGraphics.GetHdc()
Dim vCapturo As Boolean = PrintWindow(pHandle, dc, Nothing)
memoryGraphics.ReleaseHdc(dc)
memoryGraphics.Dispose()
Return bmp
End Function
End Class
vas a tener que pasarlo a C#
&H101A2 es el handle de la ventana que queres capturar, en este caso probe con firefox.
saludos.
Funciona de categoría! La ventana ni se inmuta! Mil gracias seba!!!
Por si a alguien en un futuro le interesa, el código pasado a C# y retocado un poco para que funcione en función estática quedaría así:
public static Bitmap CapturarPantalla(IntPtr pHandle)
{
Bitmap bmp = new Bitmap(GetSystemMetrics(0), GetSystemMetrics(1));
Graphics memoryGraphics = Graphics.FromImage(bmp);
IntPtr dc = memoryGraphics.GetHdc();
bool vCapturo = PrintWindow(pHandle, dc, 0);
memoryGraphics.ReleaseHdc(dc);
memoryGraphics.Dispose();
return bmp;
}