Autor Beitrag
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.07.10 18:29 
Hallo,

ich habe mal wieder ein kleines problem.

ich baue ein kleines tool, dass die zwischenablage "überwacht" und bei änderung eine funktion aufruft, die bilddaten (falls vorhanden) in eine datei speichert. also wenn man z.b. in word ein bild kopiert. das habe ich mit window-messages ganz gut hinbekommen.
ich rufe meine funktion auf, sobald ich die WM_DRAWCLIPBOARD message erhalte.

jetzt habe ich aber das problem, dass manche programme (z.b. photoshop, snagit usw.) diese message nicht nur einmal senden, wenn man dort auf kopieren klickt, sondern gleich 2 oder 3 mal. bei photoshop sogar, wenn ich erst auf kopieren klicke und danach auf "schließen" gehe.

das ist natürlich eine sehr ungünstige sache, da ich so ein bild gleich in 3 dateien auf der festplatte abgespeichert bekomme.

wieso senden einige programme diese message gleich öfters und wie kann ich verhindern, das diese message bei mir auch so oft ankommt bzw. mein tool drauf anspringt?
gibts da irgendwelche sauberen lösungen?

btw: ich verwende folgenden code für die abfrage der messages: www.developer.com/ne...rd-Activity-in-C.htm

danke schonmal
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 28.07.10 11:00 
Hmm, Du müsstest es warscheinlich so machen, dass Du Dir das letzte Image, dass vom Clipboard empfangen wurde, im Speicher "merkst".

Wenn nun die Message gesendet wird, kanst Du also rausfinden, ob Du das Bild schon einmal erhalten hast, oder es neu ist.

Allerdings kannst Du nicht mit Equals vergleichen, ob die 2 Images gleich sind. Und auch GetHashCode() liefert immer andere Werte. Also müsstest Du die Bilder byteweise vergleichen.
Anders geht es wohl nicht.


Und mit Photoshop verstehe ich nicht... hat PS eine eigene Zwischenablage?

MFG, Marko
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mi 28.07.10 12:55 
Beeinflussen kannst du nicht, wie oft die Message ausgelöst wird. Das ist Sache von dem, der das Clipboard befüllt. Du bekommst vom Clipboard ja ein IDataObject wieder, wenn ich das richtig weiß. Nutz einfach die GetHash()-Methode und speicher dir den Hash des letzten Objektes. Wenn der Hash des neuen Objektes mit dem des letzten übereinstimmt, dann weißt du, dass du dieses schon hattest.
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 29.07.10 11:30 
@Trashkid2000: nein hat es glaube ich nicht. aber irgendwie wird beim schließen von photoshop nochmal eine WM_DRAWCLIPBOARD gesendet, aber der inhalt der ZA ändert sich trotzdem nicht. sehr strange.

@norman2306: also falls du die GetHashCode-methode meinst, dann ist es leider wie trashkid2000 sagte: die methode liefert ständig andere werte (bei gleichem inhalt in der ZA).

ausblenden C#-Quelltext
1:
2:
            IDataObject cl = Clipboard.GetDataObject();
            MessageBox.Show(cl.GetHashCode().ToString());


ich denke ich werde mal versuchen aus den bilddaten einen md5 hash zu erzeugen. damit sollte ich doch sowas realisieren können!?
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 29.07.10 13:51 
Ich würde sagen, du generierst dir einfach eine eigene kleine Hash-Funktion... folgendes Beispiel sollte z.B. einen genügend eindeutigen Hash liefern und gleichzeitig genügend Performance haben:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        string GetHash(System.Drawing.Bitmap bitmap)
        {
            int max = bitmap.Width > bitmap.Height ?
            bitmap.Height : bitmap.Width;

            long hash = 0;
            for(int p = 0; p < max; p++)
            {
                hash += bitmap.GetPixel(p, p).ToArgb();
            }


            return hash.ToString("x8") + bitmap.HorizontalResolution.ToString("x4") + bitmap.VerticalResolution.ToString("x4");
        }