Autor Beitrag
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Fr 26.09.08 17:29 
Hallo,

ich würde gerne ein (Hintergrund-)Programm schreiben, das mich (durch ein Akkustisches Signal) verständigt, wenn ein anderes Programm (also das im Vordergrund) seine Anzeige verändert. Demnach habe ich mir dann hier die beiden Themen:

Delphi-Forum.de » Multimedia / Grafik » Screenshot eines AKTIVEN Fenster?

und

Delphi-Forum.de » Multimedia / Grafik » Images miteinander vergleichen???

angeschaut und programmiert.
Das Problem ist nur, dass das Programm dann zur Laufzeit ja eigentlich bei der Anweisung (wirklich nacheinander):
ausblenden Delphi-Quelltext
1:
2:
3:
ScreenShotActiveWindow(ImageDerVoraussetzung.Picture.Bitmap);

ScreenShotActiveWindow(ImageHoffeltlichVeraendert.Picture.Bitmap);

bei der Anweisung:
ausblenden Delphi-Quelltext
1:
CompareImages(ImageDerVoraussetzung,ImageHoffeltlichVeraendert);					

dann doch 0% sagen müsste.
Das sagt er aber nicht!
Sondern dann sagt er mir: Unterschiede:63,6653442382813%

Warum denn?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Nachtrag: Dazu faellt mir selbst dann nur ein, dass der Computer sagt, dass das Bild ja zu einer anderen Zeit gemacht wurde, aber dass der Unterschied dann schon so groß ist...

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Beiträge verlinkt
kkausp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Fr 26.09.08 19:34 
Speicher doch einfach mal die Bilder und schau Sie Dir an (bzw. hänge sie an den Beitrag).
ffgorcky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 29.09.08 16:31 
Das ist ja eigentlich recht egal, welches Bild es ist.
Ich habe das Ganze ja schon einfach nur mit dem "Notepad" (ohne jegliche Zeichen drin) probiert.
Der scheint sich wirklich nur über die Zeit zu muckieren...
...also die eine Millisekunde.

Kann mir denn da keiner helfen?
Ich dachte, dass es vielleicht über die Berechnung einer "Quersumme" oder so möglich wäre.
...aber wie bekommt man die denn raus?
kkausp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Mo 29.09.08 16:40 
Ich wollte eigentlich sicherstellen, das Du eigentlich wirklich zwei "gleiche Bilder" miteinander vergleichst und nicht im capture das Problem ist. bzw. die Unterschiede verstehen.
ffgorcky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 29.09.08 16:53 
Nein, ich habe ja extra einen Timer von 5 Sekunden nach dem Aktivieren des "gleich 2 Screenshots"-Buttons runterzählen lassen, damit mir genügend Zeit bleibt, auf die Anwendung "Notepad" umzuschalten.
Ich dachte ja sonst auch schon, dass das Programm sonst den einen bei gedrücktem Knopf (also Button) und den anderen dann erst bei wieder losgelassenem macht.
ffgorcky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Do 09.10.08 18:54 
Gibt es dafür denn nicht einen (speicherzeitunabhängigen!) Hash-Wert oder so etwas in der Richtung?
Oder kann mir irgendeiner sagen, wie ich sonst durch möglichst wenig CPU-Zeit-Verbrauch (weil das ja sonst die Zeit für die eigentliche Anwendung aufbraucht) feststellen kann, ob es (also das Bild) sich verändert hat?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.10.08 21:28 
Wenn zurückgegeben wird, dass das Bild anders ist, dann macht es ja keinen Unterschied auf welche Weise du das feststellst. Speicher doch einfach die beiden Bilder wie dir bereits geraten wurde und vergleiche sie selbst per Anschauen und lade die dann selbst in die Vergleichsroutine. Nur so kannst du das wirklich testen.

Es macht doch absolut keinen Sinn unbedingt mit den beiden gerade gemachten Screenshots zu arbeiten anstatt die Screenshotmethode und die Vergleichsmethode unabhängig voneinander zu testen (bzw. mit exakt denselben einmal auf diese Weise gemachten Screenshots Schritt für Schritt zu schauen was passiert).
Sonst kannst du noch Jahre weiter raten wo das Problem liegt...
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 10.10.08 05:59 
Hallo,

ich glaube, dass eine Veränderung beider Bilder schon dann gegeben ist, wenn bereits ein Pixel anders geworden ist, oder irre ich da? Wenn ich z.B. eine Anwendung offen habe und sich nur ganz gering etwas ändert, wirst Du bei CompareImages niemals 0 % rausbekommen, sondern immer einen deutlich größeren Wert. Problematisch sind dann aber u.U. blinkende Eingabeaufforderungen.

Wenn Deine Anwendung keine blinkenden oder sich selbst bewegenden Bildelemente beinhaltet, und Du jegliche Veränderung erfassen willst, dann solltest Du CompareImages so umändern, dass kein Schwellenwert benutzt und kein Prozentwert berechnet wird (ist ohnehin zeitaufwändige Gleitkommaberechnung).
Ich würde stattdessen die Pixel, die unterschiedlich sind, direkt zählen. Nur wenn diese 0 sind, dann ist das Bild exakt gleich.

Wenn Dein Bild sich bewegende Teile hat, dann musst Du selbst einen geeigneten Schwellenwert finden, z.B. bei einem blinkenden Textcursor würde ich einen Pixel-Schwellenwert (in Pixeln!) von sagen wir mal 100 oder so nehmen...

-------------

Meines Wissens nach ist es zumindest bei Windows XP und Vista so, dass eine Anwendung in der Taskleiste blinkt, wenn sie sich verändert hat. Aber leider nur dann, wenn sie nicht im Vordergrund ist.

_________________
Es gibt keine Probleme - nur Lösungen!
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 10.10.08 10:17 
und von wegen zeit: in der funktion compareimages wird die zeit nicht betrachtet sondern lediglich die einzelnen pixel

einfach mal angucken!
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 10.10.08 15:12 
Wie? Kapier ich jetzt net. Ich habs mir doch angeguckt und weiß auch was Compareimages tut.

Mein Beitrag bezieht sich genau auf die Routine. Ich habe nicht gesagt, dass da eine Zeit betrachtet wird. Die ist ja wirklich gut, diese Routine....

_________________
Es gibt keine Probleme - nur Lösungen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 10.10.08 15:25 
Er meinte sicherlich nicht deinen Beitrag sondern:
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es dafür denn nicht einen (speicherzeitunabhängigen!) Hash-Wert oder so etwas in der Richtung?
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
und von wegen zeit: in der funktion compareimages wird die zeit nicht betrachtet sondern lediglich die einzelnen pixel
;-)