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?
Antwort
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.
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
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? –
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
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
Was ist 'PastePicture'? –
es war eine externe lib, ich habe meinen ursprünglichen Beitrag bearbeitet – bugtussle
- 1. Gibt es eine Möglichkeit, automatisch einen Screenshot einer Website über eine URL zu erstellen?
- 2. Gibt es eine Möglichkeit, eine lokale Niederlassung unveränderlich zu machen?
- 3. Gibt es eine Möglichkeit in C curry zu machen?
- 4. Gibt es eine Möglichkeit, in VBA zu verketten?
- 5. Gibt es eine Möglichkeit, ein zugängliches Modal zu machen?
- 6. Gibt es eine Möglichkeit, den `enum` -Typ vorzeichenlos zu machen?
- 7. Gibt es eine Möglichkeit, TFS linkbar zu machen?
- 8. Gibt es eine bessere Möglichkeit, diesen Python-Code zu machen?
- 9. Gibt es eine Möglichkeit, einen Tastenrückruf genau so zu machen wie einen Tastenanschlag in tkinter?
- 10. Gibt es eine Möglichkeit, SIFR-Schriftart als Schriftart zu machen?
- 11. Gibt es eine Möglichkeit, die C# -Bindung statisch zu machen?
- 12. Gibt es eine Möglichkeit, ein UserControl unkenntlich zu machen?
- 13. Gibt es eine Möglichkeit, einen Screenshot des Windows-Desktops des Benutzers zu erstellen?
- 14. Gibt es eine Möglichkeit, JNLP ohne Zertifikate zu machen?
- 15. gibt es eine Möglichkeit, diesen Code kürzer zu machen?
- 16. Gibt es eine Möglichkeit, Rails ActiveRecord Attribute privat zu machen?
- 17. Gibt es eine Möglichkeit, einen Dateityp mit Webpack zu ignorieren?
- 18. Gibt es eine Möglichkeit, dieses JQuery-Karussell effizienter zu machen?
- 19. Gibt es eine Möglichkeit, einen Konstruktor nur für eine Elternklasse in C# sichtbar zu machen?
- 20. Gibt es eine Möglichkeit, einen Subprozess mit Pydev zu debuggen?
- 21. Gibt es eine Möglichkeit, jQuery.inArray() case-insensitiv zu machen?
- 22. Gibt es eine Möglichkeit, jQuery-Ausgabe * tatsächliches Markup * zu machen?
- 23. Gibt es eine Möglichkeit, Sellerie/RabbitMQ persistent zu machen?
- 24. Gibt es eine Möglichkeit, den iPad-Simulator größer zu machen?
- 25. Gibt es eine Möglichkeit, ein HTML-Element schlank zu machen?
- 26. Gibt es eine Möglichkeit, einen Screenshot mit Java zu erstellen und in einer Art Bild zu speichern?
- 27. Eine Möglichkeit, einen Screenshot zu erstellen und automatisch hochzuladen?
- 28. Gibt es eine Möglichkeit, einen Unterordner in Vagrant zu synchronisieren?
- 29. Gibt es eine Möglichkeit, einen Pfadverlauf in JavaFX zu erstellen?
- 30. Gibt es eine Möglichkeit, einem Optionselement einen Rahmen zu geben?
Sie diese müssen automatisiert werden? Können Sie deshalb Alt + PrintScreen nicht verwenden? –
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
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. –