Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Bildschirmänderung registrieren (https://www.delphipraxis.net/15108-bildschirmaenderung-registrieren.html)

MCQ 21. Jan 2004 21:57


Bildschirmänderung registrieren
 
Gibt es denn eine Möglichkeit festzustellen, ob sich auf dem Bildschirm etwas geändert hat? Wenn Ja, wie?

dizzy 21. Jan 2004 22:26

Re: Bildschirmänderung registrieren
 
Das einzige halbwegs inteligente was mir dazu einfiele, wäre es in regelmäßigen (nicht zu kleinen) Zeitabständen einen Screenshot (gibt 1001 Tutorials dazu ;) ) zu machen, und mit dem vorhergehenden zu vergleichen. (z.B. die beiden Bilder XOR-en, und sobald ein Pixel des resultiernenden Bildes NICHT schwarz ist, hat sich was verändert.)

Ist latürnich recht CPU- und resourcenintensiv - aber etwas besseres mag mir net kommen... :gruebel:


gruss,
dizzy

MCQ 21. Jan 2004 22:49

Re: Bildschirmänderung registrieren
 
mmmhh Hab grad mal ne Function geschrieben, die alle 50 Pixel einen Pixel überprüft, ist nicht ganz so Resourcen-Raubend. Ich hatte aber er gedacht, das Windows eventuell ne Message sendet (so wie mit SendMessage) die mein Programm dann empfängt.

dizzy 22. Jan 2004 00:35

Re: Bildschirmänderung registrieren
 
Tjoooo, du könntest natürlich versuchen einen Hook auf sämtliche Maus-Events zu bekommen (keinen Plan wie das geht...), aber dann bekommst du eben "nur" veränderungen mit, die der Benutzer mit der Maus veranlasst hat. Eine laufende PowerPoint-Präsentation ist da dann eben nicht drin... Evtl. kann man noch die Tastatur mit einbeziehen (wobei die nicht unbedingt bei aktivität den Bildschriminhalt beeinflusst.)

Eine Message ala "WM_SOMETHING_ON_SCREEN_HAS_CHANGED" hab ich noch net gesehen :zwinker:

Evtl. lohnt sich ja Blick in's PSDK - wobei ich nicht glaube, dass das was du suchst überhaupt existiert :\

Alle 50px ist denn auch schon mal keine üble Idee, nur wenn jemand etwas in ein Textfeld schreibt, dass dummerweise nicht im Raster liegt...

Vielleicht kann man ja auch (abhängig von deiner Verwendung) einfach das Zeitintervall auf so 1-2 Sekunden oder länger setzten. Weil der Vergleich an sich ist ja nicht soooo aufwendig. Mit BitBlt lässt sich meines Wissens nach auch "ge-xor-t", und direkt vom Bildschirm kopieren (keine Garantie!), und die Auswertung des Ergebnisses kann man ja binär bewerkstelligen. Sobald ein Byte <> 0 auftaucht ist das Dingen geritzt -> der Bildschirminhalt ist verändert worden.

Via BitBlt sollte das ganze recht fix von Statten gehen. Habe sowas noch nie gemacht - daher kann ich nichtmal mit Pseudocode aufwarten - aber nach dem was ich alles so gelesen hab müsste das gehen.

Interessant wäre in diesem Zusammenhang auch die "Screenshot-Class" von Assbard. Wenn jemand spontan weiss, wo die ist... ;)


n8i,
dizzy

negaH 22. Jan 2004 00:44

Re: Bildschirmänderung registrieren
 
Es gibt das sogenannte GDI Hooking Interface, mit dem werden alle Ausgaben die per GDI erfolgen überwacht. ABER, zu diesem Interface gibt es sogut wie keine Dokumentationen. PC AnyWhere und Windows Terminal Server nutzten diese GDI Hooks.

Ansonsten bleibt dir wirklich nichts anderes übrig als zeitgesteuert den Desktop Bereich auszulesen und mit einer zwischengespeicherten Bitmap zu vergleichen.

Ein Weg gäbe es da vielleicht noch. Jede Grafikkarte mappt ihren Grafikspeicher an normale Speicheradressen, zB. $A0000 usw. Per DirectX oder über die Grafikkarten Treiber müsste es einen Weg geben diesen Speicherbereich direkt auszulesen. Normalerweise ist das eine Ring0 Operation. In deinem Falle würde man also eine Speicherkopieroperation mit inklusiver Vergleichsoperation codieren. Auch dafür gibt es schnelle MMX und SSE2 Assemblerbefehle. D.h. während des Kopieren des Bildschirmspeichers in den Buffer wird gleichzeitig überprüft ob eine Differenz von Buffer zum Grafikkarten Speicher vorliegt.

Gruß Hagen

dizzy 22. Jan 2004 00:52

Re: Bildschirmänderung registrieren
 
MMX, SSE2... jetzt wird's interessant :mrgreen: !
Das GDI-Hooking klingt so ähnlich wie dass, was das Programm "Fraps" macht. Das ist ein Framerate-Counter für DirectX-Games. Der hat so weit ich weiss über eine eigene DLL die die selben Funktionen exportiert wie die entsprechende original-DLL, aber diese größtenteils nur weiterleitet, und bei einem PageFlip einen Zähler hochzieht.
Ob das jetzt auch DIE verwendetet Methode ist weiss ich net genau, aber zumindest hat der Author dieses Verfahren in seiner readme beschrieben. Evtl. ist das mit dem GDI-Hooking ähnlich realisierbar.
Allerdings steht der Aufwand dafür in keiner Relation zu einem schnöden Abkopieren des Desktops :shock:


gruss,
dizzy

negaH 22. Jan 2004 01:10

Re: Bildschirmänderung registrieren
 
Zitat:

Allerdings steht der Aufwand dafür in keiner Relation zu einem schnöden Abkopieren des Desktops
Das ist korrekt, es sollte sich schon lohnen.

Gruß Hagen

MCQ 23. Jan 2004 17:08

Re: Bildschirmänderung registrieren
 
Ich hatte vor sowas wie pcAnywhere zu proggen. :coder:

:dp::duck::dp:

Assarbad 14. Feb 2004 18:08

Re: Bildschirmänderung registrieren
 
Wozu dann den Aufwand. Nimm UltraVNC das kommt gleich mit einem GDI-Hook (sog. DDI).

MCQ 14. Feb 2004 18:27

Re: Bildschirmänderung registrieren
 
Ja toll, dann kann ich auch pcAnywher oder MasterEye nehmen, ich wollte e selber proggen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz