Autor Beitrag
Tendl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Mi 22.02.06 14:08 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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:
msdn.microsoft.com/l...change/clipboard.asp

www.Torry.net scheint aber schon ein paar fertige Komponenten zu haben:
www.torry.net/vcl/sy...ther/PBClipBoard.zip
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 ist auch nix?
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 23.02.06 11:00 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 www.michael-puff.de/...er/Delphi/Programme/ -> ClipView.
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 27.02.06 21:25 
Da hab ich dich aber auch leicht mißverstanden. Tja das klingt schon verdammt nach Hooks :roll: