Veränderung im Fenster registrieren

Dressman1981

Grünschnabel
Hallo, ich habe die folgende Frage:

Ich möchte ermitteln, ob sich ein beliebiges Fenster (z. Bsp. ein Internetfenster) zur Laufzeit verändert hat.

Dafür kann ich das Fenster auf dem Desktop lokalisieren und die Kindelemente durchgehen.

Nun bräuchte ich einen geeigneten Lösungsansatz, wie ich vorgehen könnte um auf eine Veränderung im Fenster zu reagieren. Mir sind auf Anhieb 2 Möglichkeiten eingefallen, die aber wahrscheinlich beide nicht so 100%-ig funktionieren:

1. Ich könnte das Fenster suchen, mit ::SendMessage(HWND_Fensterelement, WM_GETTEXT, sizeof(Text), (LPARAM)Text); den Text ermitteln, alle Zeichenketten in einem Array speichern und nach einer vorgegebenen Zeit das Fenster erneut suchen und überprüfen, ob sich die Werte gegenüber dem Array verändert haben.

2. Ich könnte einen Screenshot erstellen und mit einer geeigneten Methode (über die Größe der Screenshotdatei ?) überprüfen, ob sich etwas verändert hat.

Ich denke aber, diese beiden Varianten sind nicht das Non-Plus-Ultra um auf eine tatsächliche Veränderung im Fenster zu reagieren.

Wie kann ich vorgehen um auf eine Änderung im Fenster zu registrieren? :confused:
 
Ich würd die Messages für das Fenster abfangen. Da kannst du zwar auch net genau wissen ob es eine Veränderung gab, aber bei einem Click oder einem KeyDown/Up-Event kann man davon ausgehen der Benutzer hat was verändert
 
Hi FireFlow,

danke für deine Antwort.
Die Tastatur- bzw. Mausabfragen bringen mir in dem Fall leider nichts, da ich selbst einen Refresh zu dem Fenster sende.
Mir geht es wirklich darum, dass ich rausfinde ob sich tatsächlich etwas in dem Fenster getan hat...

Hat noch jemand einen anderen Lösungsansatz? :confused:
 
Hi Matthias,

mir würde es reichen, wenn ich feststellen könnte, dass sich etwas im Fenster verändert hat (auf das Beispiel einer Internetseite bezogen, beispielsweise, dass ein Forenbeitrag hinzugekommen ist, oder sich die Benutzeranzahl verändert hat etc.).

Hast du dazu einen Lösungsvorschlag? :confused:
 
Dann könntest du dir die Pixeldaten des Fensters besorgen, sie durch einen Hashingalgorithmus jagen und mit dem letzten Hashergebnis vergleichen. Ist der Hash identisch, so hat sich nichts verändert, ansonsten schon.
 
Oh das hört sich auf jeden Fall interessant an und kommt ja der einen Idee mit dem Screenshot sehr nahe.

Kennst du eine geeignete Funktion in MFC um an diese Pixeldaten des Fensters zu gelangen? :confused:
Damit wäre mir sehr geholfen.

Eine Behandlung mit einer Hashfunktion wäre dann doch eigentlich nicht mehr notwendig, oder?
 
Mit den MFC kenn ich mich leider nicht sonderlich gut aus. Du musst jedenfalls an den Device Context des jeweiligen Fensters kommen, dann kannst du jeden Pixel einzeln abfragen (evtl. über die Klasse CDC). Aus Performancegründen könnte es dabei ratsam sein, zuerst eine Offscreen-Kopie (via BitBlt) zu erstellen und dann mit dieser weiterzuarbeiten.

Der Einsatz einer Hashfunktion ist schon sinnvoll. Während ein üblicher Hash kaum mehr als ein paar Bytes belegt, müsste man ohne immer die gesamten Pixeldaten im Speicher halten – die Datenmenge würde hier eher in den Megabyte-Bereich vorstoßen.
 
Hi Matthias,

ok ich werde das dann folgendermaßen probieren:
1. Screenshot im Speicher vom gewünschten Fenster anfertigen
2. Mit GetPixel die RGB-Werte der einzelnen Pixel des Screenshots abfragen
3. Die Zahlenwerte die ich erhalte addieren oder mit einer geeigneten Hashfunktion behandeln (nicht jeden RGB-Wert einzeln im Speicher behalten)
4. Das Ergebnis nach dem Refresh mit dem Vorherigen vergleichen...

Nun stellt sich mir gerade eine Frage:
Was passiert, wenn der Benutzer die Größe des Fensters verändert? :confused:
Ich würde dann ja ein anderes Ergebnis erhalten, wobei nicht wirklich eine Veränderung des Datenbestandes statt gefunden hat, aber aufgrund der größeren Pixelanzahl dies der Routine so vorkommen würde...
 
Zurück