Einzelnen Beitrag anzeigen

Suche_Ein_Orakel

Registriert seit: 14. Jul 2004
4 Beiträge
 
#9

Re: Code zum Managen der Zwischenablage

  Alt 14. Jul 2004, 21:02
Zitat von Niko:
Hi,
Zitat von Suche_Ein_Orakel:
BIS ich dann nicht mehr bloß Texte kopiert hab, sondern auch mal Bitmaps.. dann bekam ich einen unbekannten Anwendungsfehler.
Das Problem besteht darin, dass einige der grafischen Zwischenablageformate (zumindest CF_BITMAP, CF_METAFILEPICT und CF_ENHMETAFILE - bei anderen bin ich mir nicht sicher) nicht einfach als Datenblock gespeichert werden, sondern als Handle auf ein entsprechendes Windows-GDI-Objekt.

Dein Code interpretiert aber auch diese Handles als Speicheradressen, versucht darauf zuzugreifen und führt so zu einer Schutzverletzung. Die Lösung besteht darin, die betroffenen Formate getrennt zu behandeln und zu deren Zwischenspeicherung entsprechende GDI-Objekte anzulegen.

Näheres zu den Zwischenablageformaten steht unter MSDN-Library durchsuchenClipboard Formats.
Hallo!

Vielen Dank!!
Das klingt ja schon mal nach was (und noch dazu einleuchtend *g*).
Jetzt kommt die spannende Frage:
Kann ich irgendwie feststellen ob ich es mit einem Handle auf ein solches GDI-Objekt zu tun habe, oder um einen "regulären Speicherverweis" - oder muss ich alle (bekannten) Formate abfragen und dementsprechend argieren (also nachsehen ob ich es eben zum Beispiel mit CF_BITMAP, CF_METAFILEPICT oder CF_ENHMETAFILE zu tun habe und dann entsprechend anders behandeln)?
Letzteres stellt mich aber dann wieder vor das Problem: Was, wenn ein unbekanntes Format vorliegt, das auch wieder nur ein Handle auf ein Windows-GDI Objekt darstellt?
Ich möchte eben genau das vermeiden, auf einzelne Formate einzugehen, sondern eben eine möglichst "globale" Lösung erzielen.
Hochgesteckte Ziele - ich weiß ^_^"
Danke auf jeden Fall mal für die Aufklärung.. jetzt weiß ich zumindest teilweise womit ich mich zu beschäftigen hab (was aber nicht heißt, dass ich für jeden Lösungsansatz von Profis dankbar wäre.. sonst sitz ich wahrscheinlich noch Wochen, wenn nicht Monate davor *g*).

EDIT: Zum Verständnis des Ganzen..
Ich habe eine VB Client-Server Anwendung.
Der Client ist nichts anderes als ein Programm das dauernd im Hintergrund (unsichtbar) auf jedem PC im Netzwerk läuft (bzw. in Zukunft laufen sollte).
Diese Anwendung registriert beim Start einen systemweiten Hotkey..
Beim Aufruf dieses Hotkeys soll der markierte Text (wenn ein Text markiert ist) des gerade aktiven Programms in eine Variable gespeichert werden.
Das stellte sich als wesentlich schwieriger heraus als gedacht..
Nach langem Suchen (und einigen Anfragen im Netz, von VB Programmierern die mal ähnliches machen wollten) hab ich gemerkt, dass es da wohl wirklich keine Standardfunktion gibt..
Mit etwas "Erfindungsreichtum" hab ichs dann ganz einfach über SendKeys "^c" gemacht.. da die Tastenkombination ohnehin im aktiven Fenster gedrückt wird, ist so auf einfache Weise das gewünschte Ergebnis erzielt.
Zusammengefasst:
Man markiert was in einer beliebigen Datenbank und drückt eine bestimmte Tastenkombination.
Das Programm im Hintergrund reagiert und sendet ein STRG+C.
Ist jetzt tatsächlich ein Text in der Zwischenablage wird der an den Server versandt, der daraufhin in einer Volltext-DB eine Suche durchführt und das Ergebnis dem Client mitteilt.. der stellt dann mit den empfangenen Daten wieder was an usw... aber das tut ja da nix mehr zur Sache.
Wirklich wichtig ist der Teil mit der Tastenkombination am Client (der Rest funktioniert eh so wie er soll und ist rein auf VB aufgebaut - also hier unwichtig).
Dadurch, dass ich (gemeinerweise) bei Betätigung der Tastenkombination ein STRG+C schreibe, verliert der Benutzer den Inhalt seiner Zwischenablage. Dabei will ich das ja gar nicht.. ich borg sie mir nur aus, da ich sonst keinen Weg habe wirklich Anwendungsübergreifend markierten Text einzulesen.
Dafür nun also meine Delphi-DLL:
Zwischenablage zuvor speichern - meine Operationen durchführen - Zwischenablage wiederherstellen.

Hab das nur geschrieben, da es ja vielleicht Alternativvorschläge gibt und dann das Beheben der derzeitigen Problmematik hinfällig ist!?
  Mit Zitat antworten Zitat