Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Capturar pantalla (código con fallas)

Estas en el tema de Capturar pantalla (código con fallas) en el foro de Visual Basic clásico en Foros del Web. Saludos compañeros foreros, fijense que estoy implementando el uso de captura de pantallas en una aplicación. Primero lo intenté mediante el envío de pulsaciones de ...
  #1 (permalink)  
Antiguo 31/05/2008, 13:12
Avatar de Jad-Neo  
Fecha de Ingreso: octubre-2004
Mensajes: 344
Antigüedad: 19 años, 6 meses
Puntos: 0
Capturar pantalla (código con fallas)

Saludos compañeros foreros, fijense que estoy implementando el uso de captura de pantallas en una aplicación. Primero lo intenté mediante el envío de pulsaciones de teclado, a la tecla Imprimir Pantalla; lo descarté porque era un método lento. Después, navegando por internet me encontré el siguiente código; que utiliza APIs:

Código:
<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetWindowDC")> _
Function GetDC(ByVal ptr As IntPtr) As IntPtr
EndFunction
 
<Runtime.InteropServices.DllImport("user32.dll")> _
Function GetDesktopWindow() As IntPtr
EndFunction
 
<Runtime.InteropServices.DllImport("user32.dll")> _
Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDc As IntPtr) As IntPtr
EndFunction
 
<Runtime.InteropServices.DllImport("gdi32.dll")> _
Function CreateCompatibleDC(ByVal hDC As IntPtr) As IntPtr
EndFunction
 
<Runtime.InteropServices.DllImport("gdi32.dll")> _
Function CreateCompatibleBitmap(ByVal hDC As IntPtr, ByVal nWidth AsInteger, ByVal nHeight AsInteger) As IntPtr
EndFunction
 
<Runtime.InteropServices.DllImport("gdi32.dll")> _
Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
EndFunction
 
<Runtime.InteropServices.DllImport("gdi32.dll")> _
Function DeleteObject(ByVal hObject As IntPtr) As IntPtr
EndFunction
 
<Runtime.InteropServices.DllImport("gdi32.dll")> _
Function BitBlt(ByVal hDestDC As IntPtr, ByVal X AsInteger, ByVal Y AsInteger, _
ByVal nWidth AsInteger, ByVal nHeight AsInteger, ByVal hSrcDC As IntPtr, _
ByVal SrcX AsInteger, ByVal SrcY AsInteger, ByVal Rop AsInteger) AsBoolean
EndFunction
 
<Runtime.InteropServices.DllImport("gdi32.dll")> _
Function DeleteDC(ByVal hDC As IntPtr) As IntPtr
EndFunction
 
Function CapturarPantalla() As Image
Dim xLoc, yLoc As Integer
Dim dsk, mem, newBMP, oldBMP As IntPtr

 
''Obtener el DC del escritorio.
dsk = GetDC(GetDesktopWindow())
''Crear un DC temporal.
mem = CreateCompatibleDC(dsk)
''Obtener el largo de la pantalla.
xLoc = Screen.PrimaryScreen.Bounds.Width
''Obtener el alto de la pantalla.
yLoc = Screen.PrimaryScreen.Bounds.Height
''Crear una imágen compatible con el escritorio.
newBMP = CreateCompatibleBitmap(dsk, xLoc, yLoc)
''Verificar el puntero (puede ser que tenga valor nulo)
If (newBMP <> IntPtr.Zero) Then
''Seleccionar la imágen de la memoria.
oldBmp = SelectObject(mem, newBMP)
''Copiar el Bitmap de la memoria.
BitBlt(mem, 0, 0, xLoc, yLoc, dsk, 0, 0, CopyPixelOperation.SourceCopy)
''Seleccionar el primer Bitmap de la memoria.
SelectObject(mem, oldBmp)
''Borrar el DC temporal con todo su contenido.
DeleteDC(mem)
''Liberar el DC del escritorio.
ReleaseDC(GetDesktopWindow(), dsk)
''Devolver la imágen.
Return Image.FromHbitmap(newBMP)
Else
''Devolver un valor nulo.
ReturnNothing
EndIf
EndFunction 
Dicho código solamente funciona por un poco período de tiempo. En resumen lo que tiene que hacer es que dentro de un timer (con intervalo de 1ms) pueda mostrar las capturas del escritorio en un control PictureBox.

La cuestión es que después de un momento, las imágenes dejan de visualizarse. Mi teoría es que es tan poco el tiempo de procesamiento que se le da (1ms) que en la memoria no hay oportunidad de liberar los recursos de la última llamada; lo he intentado aumentando el intervalo pero persiste el problema.

Me gustaría que ustedes lo prueben y me comentaran que se le podría modificar para que funcione correctamente. Desde ya, muchas gracias por su atención.

P.D.: Con este mensaje celebro mi Post #300...
__________________
Nunca seas sabio en tu propia opinión.
  #2 (permalink)  
Antiguo 02/06/2008, 11:16
Avatar de Jad-Neo  
Fecha de Ingreso: octubre-2004
Mensajes: 344
Antigüedad: 19 años, 6 meses
Puntos: 0
Respuesta: Capturar pantalla (código con fallas)

Bueno, en vista de que no hubo participantes en el asunto, me respondo a mí mismo. Encontré algo interesante en la página del Guille. Saludos a todos.

http://www.elguille.info/NET/dotnet/..._pantalla.aspx
__________________
Nunca seas sabio en tu propia opinión.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:33.