einfach, weil es nicht einfach ist und weil es an anderer Stelle gefragt wurde (bisher nicht zielführend beantwortet): Hier eine VBA-Version für folgendes Szenario:
Der grafische Inhalt des Clipboards soll per VBA am Cursor einer OL-Mail eingefügt werden und in >step 2< in Größe und Zuschnitt bearbeitet werden.
Erst mal die Basics für VBA in OL:
Outlook öffnen > Datei > Optionen > Menüband anpassen > Klassisches Menüband anpassen > Entwicklertools aktivieren.
Jetzt steht der VBE entweder über dem Punkt Makros im neuen Tab oder über Alt+F11 bzw. Alt+F8 zur Verfügung.
Um den Verweis Microsoft Forms 2.0 Object Library zu aktivieren, der zumindest in meinem OL 2021 nicht verfügbar war, hilft dieser Trick: Im VBE eine Userform einfügen, das Projekt mit Strg+s speichern und die USF wieder entfernen.
Nun zu step 1:
An geeigneter Stelle ein Verzeichnis ClipBoard anlegen. Es wird später maximal eine Datei enthalten.
Im VBE ein neues Modul mdl_ClipToMail anlegen und den folgenden Code oben einfügen. Es sind die API-Funktionen, die das ClipBoard auslesen und in ein Bildobjekt schreiben.
Code: Alles auswählen
Option Explicit
Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Type GUID
Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(0 To 7) As Byte
End Type
Type PicBmp
Size As Long: Type As Long: hBmp As Long: hPal As Long: Reserved As Long
End Type
Code: Alles auswählen
Private Sub SaveClipToPic()
Dim hBitmap As Long, sPath As String, Pic As PicBmp, IPic As IPicture
Dim IID_IDispatch As GUID
sPath = "C:\Users\hbri\Desktop\ClipBoard\Datei.bmp"
If OpenClipboard(0&) Then
hBitmap = GetClipboardData(2) ' 2 = CF_BITMAP
If hBitmap <> 0 Then
With Pic
.Size = Len(Pic)
.Type = 1 ' Bildtyp
.hBmp = hBitmap
.hPal = 0
.Reserved = 0
End With
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
OleCreatePictureIndirect Pic, IID_IDispatch, True, IPic
SavePicture IPic, sPath
MsgBox "Bild erfolgreich gespeichert unter: " & sPath
Else
MsgBox "Die Zwischenablage enthält kein Bild."
End If
CloseClipboard
Else
MsgBox "Die Zwischenablage konnte nicht geöffnet werden."
End If
End Sub
Code: Alles auswählen
Private Sub InsertPicAtCursor()
Dim objMail As Outlook.MailItem, objInspector As Outlook.Inspector
Dim objDoc As Object, objSelection As Object, sPath As String
sPath = "C:\Users\hbri\Desktop\ClipBoard\Datei.bmp"
Set objMail = Application.ActiveInspector.CurrentItem
Set objInspector = objMail.GetInspector
Set objDoc = objInspector.WordEditor
Set objSelection = objDoc.Application.Selection
objSelection.InlineShapes.AddPicture sPath, False, True
MsgBox "Bild erfolgreich eingefügt!"
End Sub
Code: Alles auswählen
Sub ClipToMail()
SaveClipToPic
InsertPicAtCursor
End Sub
Neue Mail anlegen oder Clipboard mit Screenshot füllen (hier ist die Reihenfolge egal)
Cursor positionieren
Mit Alt+F8 ClipToMail aufrufen.
step 2 wird dann eine automatische Formatierung des Pics sein. Dazu warte ich aber erst einmal auf Rückmeldungen zu step 1.
Als Ergänzung: Statt grafischem Inhalt, kann natürlich auch Text übergeben werden, kann OL auch noch geschlossen sein und in eine neue Mail schreiben, und die Übergabe aus anderen OFF-Anwendungen erfolgen. Falls gewünscht.
Schöne Grüße!