2010-03-16 9 views
11

Ich möchte mit VBA einen Screenshot erstellen (der dann als E-Mail-Anhang gesendet wird). Idealerweise würde ich gerne einen Screenshot des aktiven Formulars machen. Gibt es eine Möglichkeit, dies zu tun?Gibt es eine Möglichkeit, einen Screenshot in MS-Access mit VBA zu machen?

+0

Sie diese müssen automatisiert werden? Können Sie deshalb Alt + PrintScreen nicht verwenden? –

+1

Ja, es muss automatisiert werden. Ich möchte es in den Code einfügen, so dass, wenn ein Benutzer eine bestimmte Aktion ausführt, ein Screenshot erstellt und an einen Administrator per E-Mail gesendet wird. – dmr

+1

Oder der Snapshot konnte in einer Fehlermeldungstabelle als BMP gespeichert werden. Zusammen mit anderen Informationen wie Name des aktiven Formulars, Nummer des Arbeitsplatzes, Benutzer-ID, Datum/Uhrzeit usw. –

Antwort

10

Sie müssen dazu Windows-API-Aufrufe verwenden. Der folgende Code funktioniert in MS Access 2007. Er speichert BMP-Dateien.

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 

Es gibt eine Knowledge Base article, die in die Tiefe geht.

+0

Entschuldigen Sie, um dies aus den Toten zu erheben, aber funktioniert das auch für Access 2003? Wenn nicht, kann ich dafür sorgen, dass es funktioniert? – Magisch

+0

Ich ging gerade durch den Code .. Ich kann nicht sehen, warum es in Access 2003 nicht funktioniert, solange die DLLs vorhanden sind. Hast du es versucht? –

+0

Die Implementierung funktioniert .... grob. Es gibt keinen Check-in, wenn der Inhalt der Zwischenablage tatsächlich ein Bildschirm ist, aber das ist gut, da Sie es direkt aufrufen. Das Hauptproblem, das ich jetzt habe, ist, dass die von diesem erzeugten Bilddateien groß sind ... ungefähr 6 MB für einen vollen Druckbildschirm. Von dem, was ich für Access 2003 sehe, gibt es keine eingebaute Möglichkeit, ein IPicture zu einem .png zu machen und es zu komprimieren, kennst du es zufällig? – Magisch

1

Verwenden Rajs Beispiel das Bild zu bekommen und dann auf diesem speichert

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

Was ist 'PastePicture'? –

+0

es war eine externe lib, ich habe meinen ursprünglichen Beitrag bearbeitet – bugtussle

Verwandte Themen