2010-03-16 25 views
11

Quiero usar vba para tomar una captura de pantalla (que luego se enviará como un archivo adjunto de correo electrónico). Idealmente, me gustaría tomar una captura de pantalla de solo el formulario activo. ¿Hay alguna manera de hacer esto?¿Hay alguna manera de tomar una captura de pantalla en MS-Access con vba?

+0

¿Es necesario que esto sea automatizado? ¿Es por eso que no puedes usar Alt + PrintScreen? –

+1

Sí, tiene que ser automático. Quiero ponerlo en el código para que cuando un usuario realice una determinada acción, se tome una captura de pantalla y se envíe por correo electrónico a un administrador. – dmr

+1

O la instantánea podría guardarse en una tabla de mensajes de error como un bmp. Junto con otra información como el nombre de las formas activas, el número de la estación de trabajo, el ID de usuario, la fecha/hora, etc. –

Respuesta

10

Tienes que usar las llamadas a la API de Windows para hacer esto. El siguiente código funciona en MS Access 2007. Guardará los archivos BMP.

Option Compare Database 
Option Explicit 

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _ 
    bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) 

Private Const VK_SNAPSHOT = &H2C 

Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long 

Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As Long 

Private Declare Function CloseClipboard Lib "user32"() As Long 

Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _ 
(PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, _ 
IPic As IPicture) As Long 

'\\ Declare a UDT to store a GUID for the IPicture OLE Interface 
Private Type GUID 
    Data1 As Long 
    Data2 As Integer 
    Data3 As Integer 
    Data4(0 To 7) As Byte 
End Type 

'\\ Declare a UDT to store the bitmap information 
Private Type uPicDesc 
    Size As Long 
    Type As Long 
    hPic As Long 
    hPal As Long 
End Type 

Private Const CF_BITMAP = 2 
Private Const PICTYPE_BITMAP = 1 

Sub PrintScreen() 
    keybd_event VK_SNAPSHOT, 1, 0, 0 
End Sub 

Public Sub MyPrintScreen(FilePathName As String) 

    Call PrintScreen 

    Dim IID_IDispatch As GUID 
    Dim uPicinfo As uPicDesc 
    Dim IPic As IPicture 
    Dim hPtr As Long 

    OpenClipboard 0 
    hPtr = GetClipboardData(CF_BITMAP) 
    CloseClipboard 

    '\\ Create the interface GUID for the picture 
    With IID_IDispatch 
     .Data1 = &H7BF80980 
     .Data2 = &HBF32 
     .Data3 = &H101A 
     .Data4(0) = &H8B 
     .Data4(1) = &HBB 
     .Data4(2) = &H0 
     .Data4(3) = &HAA 
     .Data4(4) = &H0 
     .Data4(5) = &H30 
     .Data4(6) = &HC 
     .Data4(7) = &HAB 
    End With 

    '\\ Fill uPicInfo with necessary parts. 
    With uPicinfo 
     .Size = Len(uPicinfo) '\\ Length of structure. 
     .Type = PICTYPE_BITMAP '\\ Type of Picture 
     .hPic = hPtr '\\ Handle to image. 
     .hPal = 0 '\\ Handle to palette (if bitmap). 
    End With 

    '\\ Create the Range Picture Object 
    OleCreatePictureIndirect uPicinfo, IID_IDispatch, True, IPic 

    '\\ Save Picture Object 
    stdole.SavePicture IPic, FilePathName 

End Sub 

Hay un Knowledge Base article que profundiza más. ejemplo

+0

Lamento plantear esto de la muerte, pero ¿esto también funciona para Access 2003? Si no, ¿puedo hacer que funcione en eso? – Magisch

+0

Acabo de revisar el código ... No puedo ver por qué no funcionará en Access 2003, siempre y cuando las DLL estén presentes. ¿Has probado? –

+0

La implementación funciona ... aproximadamente. No hay ningún control allí si el contenido del portapapeles es en realidad una pantalla de impresión, pero eso está bien ya que lo llamas directamente. El principal problema que me queda ahora es que los archivos de imagen generados por esto son grandes ... alrededor de 6 mb para una pantalla de impresión completa. Según lo que veo para Access 2003, no hay formas integradas de convertir una imagen IP en .png y comprimirla, ¿la conoce? – Magisch

1

Uso de Raj para conseguir la imagen y luego esto para salvar

Dim oPic 
On Error Resume Next 
Set oPic = Clipboard.GetData 
On Error GoTo 0 
If oPic Is Nothing Then 
    'no image in clipboard' 
Else 
    SavePicture oPic, "c:\temp\pic.bmp" 
end if 
+0

¿Qué es 'PastePicture'? –

+0

era una lib externa, he editado mi publicación original – bugtussle

Cuestiones relacionadas