API PrintWindow

Iniciado por arenoide, 17 Julio 2011, 14:39 PM

0 Miembros y 1 Visitante están viendo este tema.

arenoide

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.

seba123neo

Hola, proba esto, lo he probado con algunas ventanas y funciona.

Código (vb) [Seleccionar]
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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

arenoide

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í:

Código (csharp) [Seleccionar]
       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;
        }