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



