Entwickler-Ecke

Windows API - Lesezugriff auf das Clipboard erkennen?


Tendl - Mi 22.02.06 14:08
Titel: Lesezugriff auf das Clipboard erkennen?
Ich möchte erkennen wann ein (beliebiger) Prozess lesend auf das Clipboard zugreift.

Ziel ist den Text im Clipboard nach jedem Zugriff zu verändern, z.B. eine laufende Nummer
hochzuzählen.

Hat jemand so etwas schon mal ausprobiert?

Bin für jeden Tip dankbar.

Thomas


digi_c - Mi 22.02.06 17:36

Nun mit dem TClipboard wirst du mangelns Ereignisse wohl nicht weiter kommen.

Ich denke da musst du dich selber an ein paar Messages hangeln:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/dataexchange/clipboard.asp

http://www.Torry.net scheint aber schon ein paar fertige Komponenten zu haben:
http://www.torry.net/vcl/system/other/PBClipBoard.zip


Tendl - Mi 22.02.06 18:04

Hallo digi_c,

zunächst mal vielen Dank für Deinen Tip, soweit ich es aber auf die Schnelle beurteilen kann,
hilft mir die Torry-Komponente nicht weiter.

Eine Änderung des Clip-Board-Inhalts lässt sich auf mehrere Weisen feststellen. Im einfachsten Fall frage ich periodisch den Inhalt ab und vergleiche ihn mit dem zuvor ausgelesenen.

Der Gedanke hier ist aber, dass nach dem Auslesen (kopieren des Inhalts in ein Edit-Feld) ein Index hochgezählt werden soll. Wahrscheinlich geht das nur über einen HOOK.
Ich werde mich also wirklich intensiver mit Windows-Messages beschäftigen müssen.

Trotzdem vielen Dank
Thomas


digi_c - Mi 22.02.06 19:27

Zitat:
PBClipBoard v.1.21
By Bak-O-Soft. PBClipBoard is a small component that monitors the clipboard. It has only one property, the
'Onchange' event
, that triggers whenever the contents of the clipboard changes. Use it to
automatically enable/disable 'Paste'-buttons or to view the contents of the clipboard.


Schade habe es nur kurz überflogen, dachte das wäre was.


Und ThkClipboardMonitor v.1.0 [http://www.torry.net/vcl/system/other/ThkClipboardMonitor.zip] ist auch nix?


Tendl - Do 23.02.06 10:25

Zitat:
Und ThkClipboardMonitor v.1.0 ist auch nix?


Vielen Dank für diesen weiteren Tip. Ich habe die Komponente kurz angeschaut und glaube es ist relativ einfach sie so zu erweitern, dass ich auch einen Lesezugriff (ich glaube WM_COPY) abfangen kann.

Ich werde hier darüber berichten, denn vielleicht interessiert es ja sonst noch jemand.

Thomas


Delete - Do 23.02.06 11:00
Titel: Re: Lesezugriff auf das Clipboard erkennen?
user profile iconTendl hat folgendes geschrieben:
Ziel ist den Text im Clipboard nach jedem Zugriff zu verändern, z.B. eine laufende Nummer
hochzuzählen.

Autsch. Was machst du, wenn ein Benutzer mal was zwischen durch reinkopiert? Soll ja vorkommen, denn dazu ist es ja da. Und wie wird sich der Benutzer wundern, wenn er drei Seiten Text in die Zwischenablage kopiert hat und dann im Ziel die Zahl "3" einfügt. Die Zwischenablage ist nicht für die Interprozesskommunikation gedacht. Dazu stellt Windows andere, bessere, Mechanismen zur Verfügung.


Tendl - Fr 24.02.06 11:15

Hallo Luckie,

zuerst mal habe ich festgestellt, dass die Erweiterung doch nicht so einfach machbar ist, wie ich ursprünglich gedacht habe, den Schreibzugriff zu erkennen ist kein Problem, aber das Lesen...

Du hast natürlich recht, es gibt andere Wege für die Datenübermittlung zwischen Prozessen. Mein Ansatz geht jetzt in die Richtung ein sich öffnendes Dialogfenster zu erkennen (in diesem Fall der Speicher-Dialog beim Download im Internetexplorer) und dann in die entsprechen Edit-Zeile einen Filenamen mit Index zu schreiben, der mit jedem Aufruf des Dialogs hochgezählt wird.

Von der praktikabelen Lösung des Problems abgesehen suche ich immer mal wieder nach möglichen Lösungen für Programmabschnitte und hoffe damit auch auf Dauer mein Wissen und Verständnis für
Innnereien von Windows zu vergrößern. In diesem Fall müsste ich wohl den Aufruf einer Windows-DLL abfangen.

Vielen Dank an alle und es macht Spaß bei diesem Forum mitzumachen.

Thomas


Delete - Fr 24.02.06 18:30

Das ist einfacher als du denkst, du musst dich nur in die Clipboard Kette einklinken:
Zitat:
The WM_DRAWCLIPBOARD message is sent to the first window in the clipboard viewer chain when the content of the clipboard changes. This enables a clipboard viewer window to display the new content of the clipboard.


Siehe auch dazu: Suche im MSDN SETCLIPBOARDVIEWER und http://www.michael-puff.de/dirindex.php?folder=Developer/Delphi/Programme/ -> ClipView.


Tendl - Mo 27.02.06 12:05

Hallo Luckie,

auch Dein Zitat bezieht sich auf eine Änderung des Clipboard-Inhalts, ein Event das sich relativ leicht auf verschiedene Weise auch mit verschiedene Komponenten bearbeiten lässt. Mein Problem war es einen Lesezugriff auf das Clipboard aus einer anderen Applikation heraus zu erkennen und daraufhin eine Aktion auszulösen.

Typisches Beispiel beim Speichern von Bitmaps aus dem Internet wird Dir als Name bei einer Seite stets picture.bmp vorgeschlagen. Das Programm im Hintergrund erkennt einen Lesezugrif = Copy des Clipboards ins Edit-Feld und verändert vorher oder nachher den Clipboard-Inhalt z.B auf picture-001.bmp. Diesen veränderten Namen füge ich dann beim nächsten Speichern wieder in das Edit-Feld ein. Wenn ich die Windows-Hilfe richtig verstanden habe ruft die Applikation beim Lesezugriff direkt eine Funktion in einer System-DLL auf.

Zitat:
if (!OpenClipboard(hwndMain))
return;

hglb = GetClipboardData(CF_TEXT);


Mir ist mittlerweile vollkommen klar, daß sich dieses Problem mit einem anderen Ansatz wesentlich eleganter lösen lässt, übrig bleibt nur noch Interesse, wie man es prinzipiell machen könnte.

Thomas


digi_c - Mo 27.02.06 21:25

Da hab ich dich aber auch leicht mißverstanden. Tja das klingt schon verdammt nach Hooks :roll: