2010-03-16 22 views
11

Voglio usare vba per fare uno screenshot (che verrà poi inviato come allegato di posta elettronica). Idealmente, mi piacerebbe fare uno screenshot della sola forma attiva. C'è un modo per fare questo?C'è un modo per fare uno screenshot in MS-Access con vba?

+0

avete bisogno di questo per essere automatizzato? È per questo che non puoi usare Alt + PrintScreen? –

+1

Sì, deve essere automatizzato. Voglio inserirlo nel codice in modo che quando un utente esegue una determinata azione, uno screenshot sia preso e inviato via email a un amministratore. – dmr

+1

Oppure lo snapshot può essere salvato in una tabella dei messaggi di errore come bmp. Insieme ad altre informazioni come nome di moduli attivi, numero di workstation, userid, data/ora, ecc. –

risposta

10

Per eseguire questa operazione è necessario utilizzare le chiamate API di Windows. Il seguente codice funziona in MS Access 2007. Salva i file 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 

C'è uno Knowledge Base article che va più in profondità. esempio

+0

Mi spiace sollevarlo da morto, ma funziona anche su Access 2003? In caso contrario, posso farlo funzionare in questo? – Magisch

+0

Ho appena esaminato il codice. Non riesco a capire perché non funzionerà in Access 2003 finché sono presenti le DLL. Hai provato? –

+0

L'implementazione funziona ... approssimativamente. Non ci sono controlli se il contenuto degli appunti è in realtà un printcreen, ma va bene visto che lo chiami direttamente. Il problema principale che ho lasciato ora è che i file di immagine generati da questo sono grandi ... intorno a 6mb per un full printscreen. Da quello che vedo per Access 2003 non ci sono modi incorporati per fare di un IPicture in un file .png e comprimerlo, ne conosci uno? – Magisch

1

Usa di Raj per ottenere l'immagine e poi questo per salvare

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

Che cos'è 'PastePicture'? –

+0

era una lib esterna, ho modificato il mio post originale – bugtussle

Problemi correlati