Die Zwischnablage ist ein beliebter Ort für das Zwischenspeichern von Daten, die öfters benötigt werden. Nahezu jedes Programm nutzt diese Funktion. Meist sogar unbeabsichtet durch das Kontextmeü einer Textbox. Aber auch Drag & Drop Operationen, die Windows Shell oder diverse Grafik-, Audio- oder Textanwendungen nutzen diese Technologie, um Daten für die Verwendung in anderen Programmen zwischenzuspeichern. Die Inhalte der Zwischenablage In der Zwischenablage befindet sich nicht, wie man vielleicht vermuten würde, nur ein Format. Das heißt, wenn eine Anwendung z.B. Text in die Zwischenablage kopiert, werden diese Daten vom Windows-System in verschiedene Formate umgewandelt. Nach dem Kopieren vonnormalem Text findet man in der Zwischenablage z.B. Unicode-Text (ein auf Bytes basierender Textfluss, der schnellere Programmabläufe ermöglicht), normalen Text und OEM-Text, der Sonderzeichen so wie ein MS-DOS Programm anzeigt, um Anzeigefehler zu verhindern. Dasselbe gilt auch für Bitmaps. Wird ein Bitmap in die Zwischenablage kopiert, so wird von Windows automatisch ein zweites Format in der Zwischenablage angelegt. Dieses zweite Bitmap ist dann vom Typ "Enhanced Metafile". Diese Methode (das Speichern von Daten in unterschiedlichen Formaten) ermöglicht, dass einige Programme, die z.B. nur Unicode-Text oder Metadateien unterstützen, diese Daten auch vorfinden - selbst wenn diese nicht direkt in die Zwischenablage abgelegt wurden. Daten im Detail Greift man mit der GetClipboardData-Funktion auf die Zwischenablage zu, so bekommt man immer einen Handle zu den eigentlichen Daten. Das heißt also, die Daten werden nicht direkt in der Zwischenablage abgelegt. Programme, die Daten in die Zwischenablage kopieren, legen hierzu einen Speicherblock fest, kopieren das Bitmap oder den Text in diesen Speicherblock und übergeben der Zwischenablage das Handle zu diesem Speicherblock. Dies macht die Sache für uns VisualBasic Programmierer etwas komplizierter. Andere Sprachen wie C++ sind es gewohnt mit Handles zu Speicherobjekten zu arbeiten, wir dagegen kennen nur unsere Variablen und Strukturen. Um an die Daten zu kommen, müssen wir in den meisten Fällen den Speicherblock anhand des Handles "einfrieren" und danach anhand des Pointers die Daten in die entsprechende Struktur oderVariable kopieren. Handles von Bitmaps oder Metadateien dagegen können direkt mit den dafür vorgesehenen API-Funktionen genutzt werden. Die verschiedenen Formate kurz erklärt Wie Eingangs erwähnt, erstellt Windows automatisch Kopien unserer Daten in andere zusätzliche Formate. Viele Programme stellen die Daten selbst ebenfalls in zusätzlichen Formaten bereit. Als Beispiel seien hier HTML- oder RTF-Text genannt. Diese Typen gehören leider nicht zu den Standard-Formaten der Zwischenablage und werden somit von Windows nicht erkannt. Das hat zur Folge, dass Windows diese Daten auch nicht in andere Formate konvertiert. Darum übernehmen Anwendungen wie Microsoft Word oder der Internet Explorer diese Aufgaben und legen selbst die Daten (Texte) in für die Anwendungen verarbeitbare Datentypen in der Zwischenablage ab. Um einen kleinen Überblick zu bekommen finden Sie nachfolgend eine Liste der Standardformate der Zwischenablage: CF_BITMAP (Standard Bitmap) CF_DIB (BITMAPINFO-Struktur) CF_DIBV5 (BITMAPV5HEADER-Struktur) CF_DIF (Software Arts' Data Interchange Format) CF_DSPBITMAP (Standard Bitmap) CF_DSPENHMETAFILE (Standard Metadatei) CF_DSPMETAFILEPICT (METAFILEPICT-Struktur) CF_DSPTEXT (Standard String) CF_ENHMETAFILE (Enhanced Metadatei) CF_GDIOBJFIRST bis CF_GDIOBJLAST (GDI Objekte) CF_HDROP (Dateiliste) CF_LOCALE (Sprach-ID) CF_METAFILEPICT (METAFILEPICT-Struktur) CF_OEMTEXT (Text String in OEM Format) CF_OWNERDISPLAY (Benutzerdefinierte Anzeige) CF_PALETTE (Farbpalette) CF_PRIVATEFIRST bis CF_PRIVATELAST (Privates Format) CF_PENDATA (Daten für Pen Extensions) CF_RIFF (Audiodaten) CF_SYLK (Symbolischer Link) CF_TEXT (Standard Text String) CF_WAVE (Wave Datei) CF_TIFF (Tiff Datei) CF_UNICODETEXT (Unicode Text) Wie lässt sich der Inhalt der Zwischenablage auslesen? Über das Clipboard-Objekt in VB selbst lässt sich ja nur der Text bzw. das Bitmap (Bild) im Standard-Format auslesen. Um nun aber alle in der Zwischenablage vorhandenen Daten und Datenformate auslesen zu können, müssen wir wieder einmal auf das Windows-API zurückgreifen. Öffnen der Zwischenablage ' Deklaration Declare Function OpenClipboard Lib "user32" ( _ ByVal hwnd As Long) As Long ' Aufruf Call OpenClipboard(Me.hwnd) Schliessen der Zwischenablage Declare Function CloseClipboard Lib "user32" () As Long Alle in der Zwischenablage vorhandenen Datenformate ermitteln ' benötigte Deklarationen Declare Function CountClipboardFormats Lib "user32" () As Long Declare Function EnumClipboardFormats Lib "user32" ( _ ByVal wFormat As Long) As Long ' Prüfen, welche Datenformate sich in der ' Zwischenablage befinden For i = 0 To CountClipboardFormats - 1 lngFormat = EnumClipboardFormats(lngFormat) If lngFormat = 0 Then Exit For ' Format auswerten Select Case lngFormat Case CF.CF_TEXT Case CF.CF_BITMAP Case CF.CF_WAVE Case CF.CF_DIB ... Case Else ' Benutzerdefinierter Typ End Select Next i Auslesen der Daten der Zwischenablage ' Deklarationen Declare Function GetClipboardData Lib "user32" ( _ ByVal wFormat As Long) As Long Declare Function GlobalLock Lib "kernel32" ( _ ByVal hMem As Long) As Long Declare Function GlobalUnlock Lib "kernel32" ( _ ByVal hMem As Long) As Long Declare Function lstrlen Lib "kernel32" _ Alias "lstrlenA" ( _ ByVal lpString As Any) As Long Text auslesen (Text, OEM Text, HTML-Format, RTF) Dim Tmpstr As String Dim pTmpStr As Long Dim hTmpStr As Long ' Zwischenablage öffnen OpenClipboard Me.hwnd ' Pointer zu dem String ermitteln hTmpStr = GetClipboardData(wFormat) pTmpStr = GlobalLock(hTmpStr) If pTmpStr <> 0 Then Tmpstr = Space(lstrlen(ByVal pTmpStr)) Call lstrcpy(ByVal Tmpstr, ByVal pTmpStr) ... ' Pointer wieder freigeben GlobalUnlock hTmpStr End If ' Clipboard schließen CloseClipboard Bitmap auslesen ' Deklaration Declare Function SelectObject Lib "gdi32" ( _ ByVal hdc As Long, _ ByVal hObject As Long) As Long ' Bitmap auslesen und anzeigen ' Clipboard öffnen OpenClipboard Me.hwnd ' Handle des Bitmaps ermitteln hBitmap = GetClipboardData(CLng(Item.Text)) If hBitmap <> 0 Then ' Bitmap anzeigen Picture1.Cls Picture1.Refresh SelectObject Picture1.hdc, hBitmap Picture1.Refresh End If ' Clipboard schließen CloseClipboard Weitere Datenformate Das Beispielprojekt Passend zum Workshop haben wir natürlich ein entsprechendes Beispiel erstellt. Hierbei handelt es sich um einen Clipboard-Viewer, d.h. die Zwischenablage wird ständig geprüft und alle vorhandenen Daten in den verschiedensten Formaten in einer Liste angezeigt. Sofern sich der Inhalt eines Datentyps (Text/Bitmap usw.) anzeigen lässt, kann dieser durch Anklicken innerhalb der Liste gelesen und angezeigt werden. Zusätzlich wird zu jedem Eintrag die ID, der Datentyp selbst, sowie das Handle ermittelt und aufgelistet. Dieser Workshop wurde bereits 46.807 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats September 2024 Dieter Otter Übergabeparameter: String oder Array? Mit der IsArray-Funktion lässt sich prüfen, ob es sich bei einem Übergabeparameter an eine Prozedur um ein Array oder einer "einfachen" Variable handelt. sevOutBar 4.0 Vertikale Menüleisten á la Outlook Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. |
|||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |