¿Codigo VB? - Programar capturas de pantalla cada 10 minutos.

Iniciado por Paniic, 18 Abril 2013, 22:14 PM

0 Miembros y 3 Visitantes están viendo este tema.

Paniic

Os comento mi problema.

Actualmente estoy trabajando en monitorización de Telefónica afortunadamente y allí se trabaja diariamente con Macros y programas en VB y aunque estoy empezando con este lenguaje tan sencillo necesito un programa para mi trabajo diario.

Parte de nuestro trabajo se centra en observar cada poco tiempo el estado de los centros de Movistar. Para ello tenemos aplicaciones propietario que muestran en tiempo real el estado de cada centro.

Actualmente uso una plantilla bastante extensa de excel para realizar los seguimientos de estos centros y el programa que os voy a proponer me salvaría diariamente.



Necesito un programa (en VB) que realice una captura de pantalla cada 10 minutos de una ventana en concreto, que estará abierta todo el día, y lo guarde como un archivo .JPG en la ruta que yo le indique. No estaría de más indicar el área de pantalla que quiero capturar (con la orden "Call CaptureRectangle").

La captura necesitaría que fuera cada 10 minutos de 8:00 a 16:00 que es mi jornada de trabajo.

¿Alguien podría, muy amablemente, cederme dicho código?

Como dije, estoy en el aprendizaje de VB así que con el código me valdría y luego ya me las apañaría para buscar cada orden y configurarlas. El problema está en que este proyecto termina en 2 meses y no vendría nada mal algo de ayuda para ganar mucho tiempo.

Gracias por la atención al mensaje. Saludos.
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16


Paniic

Cita de: x64Core en 18 Abril 2013, 22:26 PM
http://ambarhalim.blogspot.com/2013/03/source-code-auto-capture-screen-in.html
http://www.visualbasic.happycodings.com/code_snippets/code96.html


Estupenda información x64Core, breve y justo lo que necesitaba.
Ahora necesito solo un detalle mas.

¿Como puedo marca la ventana o pestaña que se va a capturar aunque esté minimizada o de fondo? ¿Es posible?
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16

BlackZeroX

Es mejer hacerlo con GDI...
cuando este minimizada o de fondo también es posible... en este foro esta dicha API...

aun así te dejo varios métodos para tomar una foto a la pantalla... es mejor GDI ya que así delimitas a que le quieres tomar la "Foto".
http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen

Dulces Lunas!¡.
The Dark Shadow is my passion.

Paniic

Cita de: BlackZeroX (Astaroth) en 19 Abril 2013, 04:44 AM
Es mejer hacerlo con GDI...
cuando este minimizada o de fondo también es posible... en este foro esta dicha API...

aun así te dejo varios métodos para tomar una foto a la pantalla... es mejor GDI ya que así delimitas a que le quieres tomar la "Foto".
http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen

Dulces Lunas!¡.

Le eché un ojo pero no encuentro como capturar estando una ventana minimizada. Es lo que realmente me está costando averiguar. Pero gracias por el enlace, para obtener muchos puntos de vista. ¿Sabrias alguna ayuda que pudiera servirme para saber por donde buscar las capturas minimizadas?
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16

MCKSys Argentina

Cita de: paniicO en 19 Abril 2013, 21:55 PM
Le eché un ojo pero no encuentro como capturar estando una ventana minimizada.

Con todos lo puedes hacer. El que te recomendaron es el primero: Capture it the GDI way.
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


x64core

Cita de: paniicO en 19 Abril 2013, 00:16 AM
Estupenda información x64Core, breve y justo lo que necesitaba.
Ahora necesito solo un detalle mas.

¿Como puedo marca la ventana o pestaña que se va a capturar aunque esté minimizada o de fondo? ¿Es posible?

Restaurar la ventana? función ShowWindow.

LeandroA

#7
Hola, para aportar un poco, como te decian antes utilizando GDI, solo que no usaria BitBlt, o StretchBlt  ya que estas no funcionarían si la ventana no esta visible osea detrás de otra, si esta minimizada no hay solución, si o si tienes que restaurarla como ya dijo x64Core (ShowWindow), entonces volviendo a la api para capturar la ventana te recomiendo  PrintWindow

Private Declare Function PrintWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long


para poder utilizarla tienes que tener el hwnd de la ventana lo puedes hacer con FindWindow (simpre y cuando esa ventana tenga un caption fijo)
el segundo parametro de la api es el hdc donde quieres dibujarlo por ejemplo, si la quieres hacer facil utiliza un picturebox. y el tercer parametro con 0 esta bien.

-----
Me tome un tiempo y te prepare algo que va a ser mejor que explicártelo.

en un formulario pone este código y un command1 (osea un boton)

Código (Vb) [Seleccionar]

Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long, ByRef lpRect As RECT) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function IsIconic Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function UpdateWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function PrintWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Const WM_SYSCOMMAND As Long = &H112
Private Const SC_RESTORE As Long = &HF120&

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

Private Type GDIPlusStartupInput
   GdiPlusVersion           As Long
   DebugEventCallback       As Long
   SuppressBackgroundThread As Long
   SuppressExternalCodecs   As Long
End Type

Private Type GUID
   Data1           As Long
   Data2           As Integer
   Data3           As Integer
   Data4(0 To 7)   As Byte
End Type
 
Private Type EncoderParameter
   GUID            As GUID
   NumberOfValues  As Long
   Type            As Long
   Value           As Long
End Type
 
Private Type EncoderParameters
   Count           As Long
   Parameter(15)   As EncoderParameter
End Type

Private Const ImageCodecJPG = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
Private Const EncoderQuality = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
Private Declare Function GdiplusStartup Lib "gdiplus" (Token As Long, inputbuf As GDIPlusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal Token As Long)
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GdiPlus.dll" (ByVal mHbm As Long, ByVal mhPal As Long, ByRef mBitmap As Long) As Long
Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal image As Long, ByVal FileName As Long, ByRef clsidEncoder As GUID, ByRef encoderParams As Any) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, Id As GUID) As Long


Private Sub Form_Load()
   Shell "calc.exe" 'esto es solo un ejemplo
End Sub

Private Sub Command1_Click()
   Dim hWnd As Long
   Dim DestPath As String
   
   DestPath = "C:\Captura1.jpg" 'Destino donde se guardara la imagen
   hWnd = FindWindow(vbNullString, "Calculadora") ' handle de la ventana mediante su caption.
   
   If (hWnd <> 0) And (LenB(DestPath) > 0) Then
       If CaptureWindow(hWnd, DestPath) Then ' funcion para capturar y guardar la ventana como una imagen.jpg
           Me.Picture = LoadPicture(DestPath) ' leemos la image para mostrar el resultado.
       End If
   End If
End Sub

Private Function CaptureWindow(hWnd As Long, ByVal DestPath As String) As Boolean

   Dim tRECT As RECT
   Dim lWidth As Long, lHeight As Long
   Dim DC              As Long
   Dim hDCMemory       As Long
   Dim hBmp            As Long
   Dim OldhBmp         As Long
   
   'Si la ventana esta minimizada la restaura
   If IsIconic(hWnd) Then
       SendMessage hWnd, WM_SYSCOMMAND, SC_RESTORE, ByVal 0&
       DoEvents
   End If
   
   'le peta una refrescada
   UpdateWindow hWnd
   
   'obtiene las medidas
   GetWindowRect hWnd, tRECT
   
   lWidth = tRECT.Right - tRECT.Left
   lHeight = tRECT.Bottom - tRECT.Top
   
   'creamos un bitmap y un hdc
   DC = GetDC(hWnd)
   hDCMemory = CreateCompatibleDC(0)
   hBmp = CreateCompatibleBitmap(DC, lWidth, lHeight)
   SelectObject hDCMemory, hBmp
   ReleaseDC hWnd, hdc
   
   'imprimimos la ventana en el hdc
   PrintWindow hWnd, hDCMemory, 0
   
   

   '---------- Rutina para guardar el bmp como un jpg mediante GDI Plus
   Dim gToken As Long
   Dim gdiSI As GDIPlusStartupInput
   Dim hImage As Long
   Dim tEncoder  As GUID
   Dim tParams     As EncoderParameters
   Dim JPG_Quality As Long
   
   JPG_Quality = 80
   
   gdiSI.GdiPlusVersion = &H1
   GdiplusStartup gToken, gdiSI
   
 
   If gToken Then
       If GdipCreateBitmapFromHBITMAP(hBmp, 0&, hImage) = 0 Then
           CLSIDFromString StrPtr(ImageCodecJPG), tEncoder
           With tParams
               .Count = 1
               .Parameter(0).NumberOfValues = 1&
               .Parameter(0).Type = 4&
               .Parameter(0).Value = VarPtr(JPG_Quality)
               CLSIDFromString StrPtr(EncoderQuality), .Parameter(0).GUID
           End With
           If GdipSaveImageToFile(hImage, StrPtr(DestPath), tEncoder, ByVal tParams) = 0 Then
               CaptureWindow = True
           End If
           GdipDisposeImage hImage
       End If
       GdiplusShutdown gToken
   End If
'-----------

   'Liberamos los objetos GDI
   DeleteObject SelectObject(hDCMemory, OldhBmp)
   DeleteDC hDCMemory
   
   
End Function



Paniic

Cita de: LeandroA en 24 Abril 2013, 05:53 AM
Hola, para aportar un poco, como te decian antes utilizando GDI, solo que no usaria BitBlt, o StretchBlt  ya que estas no funcionarían si la ventana no esta visible osea detrás de otra, si esta minimizada no hay solución, si o si tienes que restaurarla como ya dijo x64Core (ShowWindow), entonces volviendo a la api para capturar la ventana te recomiendo  PrintWindow

Private Declare Function PrintWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long


para poder utilizarla tienes que tener el hwnd de la ventana lo puedes hacer con FindWindow (simpre y cuando esa ventana tenga un caption fijo)
el segundo parametro de la api es el hdc donde quieres dibujarlo por ejemplo, si la quieres hacer facil utiliza un picturebox. y el tercer parametro con 0 esta bien.

-----
Me tome un tiempo y te prepare algo que va a ser mejor que explicártelo.

en un formulario pone este código y un command1 (osea un boton)


WOW amigo, eso no es ayuda, eso es resolver la X.

Muchas gracias Leandro. Estuve estos dias mirando lo de las GDI, por otro camino, con scripts y usando el link.open y link.close. y quizas estaba perdiendo el tiempo pues no obtenia resultados.

Probare mañana por la mañana el codigo y lo configuraré tal como lo necesito pero por lo poco que veo ahora está resuelto, solo necesita funcionar, hacerlo correr y ya. Es una pena que en oculto no pero aun así puedo usar esta solución ya de forma definitiva.

Insisto, gracias Leandro.
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16