elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 08:28  


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderador: [D4N93R])
| | | |-+  API PrintWindow
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: API PrintWindow  (Leído 693 veces)
arenoide

Desconectado Desconectado

Mensajes: 150



Ver Perfil
API PrintWindow
« en: 17 Julio 2011, 14:39 »

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?

Código:
        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.


En línea
seba123neo


Desconectado Desconectado

Mensajes: 3.214



Ver Perfil WWW
Re: API PrintWindow
« Respuesta #1 en: 17 Julio 2011, 22:33 »

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

Código
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.


En línea

Mucha gente, especialmente la ignorante desea castigarte por decir la verdad, por ser correcto, por ser tú. Nunca te disculpes por ser correcto, o por estar años delante de tu tiempo.
Si estas en lo cierto, y lo sabes, que hable tu razón. Incluso si eres una minoria de uno solo, la verdad sigue siendo la verdad. M. Gandhi
arenoide

Desconectado Desconectado

Mensajes: 150



Ver Perfil
Re: API PrintWindow
« Respuesta #2 en: 18 Julio 2011, 01:00 »

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
       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;
       }
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines