Rendertarget einer Fremdanwendung "einfangen"

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Rendertarget einer Fremdanwendung "einfangen"

Beitrag von MitjaStachowiak »

Hallo,
für die Ferien hab' ich mir einen ehrgeizigen Plan vorgenommen: Eine fremdes Fenster im eigenen - anzeigen. Natürlich gibt es eine setParent-Funktion, die so was macht, jedoch möchte ich mich jetzt endlich mal mit dem Grafik-Speicher beschäftigen. Im Prinzip möchte ich einen Screenshot der Anwendung machen und diesen in meinem Fenster anzeigen; einen Screenshot kann man ja "nachbearbeiten"; mit einem eingefangenen Fenster geht das nicht. Mein Problem: Screenshots sind langsam und eignen sich nicht für animierte Fenster.
Deswegen möchte ich mal fragen, ob schon jemand bei der neuen Windows-API durchgeblickt hat. Seit Windows Vista gibt es diese Möglichkeit, eine animierte Vorschau eines Fensters beim Überfahren des entsprechenden Taskleistenbuttons mit der Maus zu erhalten. Keine Ahnung, wie das System das macht, aber das will ich auch :mrgreen:

Anscheinend erhält jetzt jedes Fenster einen eigenen Grafik-Speicher, in den es seinen Inhalt rendern kann und dieser Speicher steht dann dem System zur Anzeige zur Verfügung... Ich weiß leider nicht, wonach ich im Internet suchen muss. Ich wäre froh, wenn jemand mir ein Paar gute Dokumentations-Quellen dazu schickte :D

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Rendertarget einer Fremdanwendung "einfangen"

Beitrag von mschnell »

Wozu das auf einem einzigen Rechner gut sein soll, ist mir nicht klar.

Ich habe von ein paar Jahren 'mal (mit Delphi) ) ein "Window-Remote-Show" gemacht: Auf einem Rechner wird ein Rahmen um ein Viereck auf dem Bildschirm gezogen, Auf einem anderen Rechner wird der Inhalt dieses Rahmens angezeigt. Ist einigermaßen flott. Die Übertragung geht per Netzwerk (TCP/IP oder UDP). Die Methode den Screen-Speicher flott auszulesen habe ich von VNC abgeguckt und von C nach Pascal übersetzt.

-Michael

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Rendertarget einer Fremdanwendung "einfangen"

Beitrag von MitjaStachowiak »

Hm, Screen-Speicher ist nicht ganz das, was ich suche. Aber vielleicht finde ich so Suchbegriffe, die zu dem führen, was ich brauche. Hast Du ein Paar Codeschnipsel für mich, oder einen Tipp, in welcher Unit von VNC das Steht? Das sparte mir 'ne Menge Sucherei ;-)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Rendertarget einer Fremdanwendung "einfangen"

Beitrag von mschnell »

Bin leider erst nächstes Jahr wieder im Büro. Dann poste ich was.

-Michael
Zuletzt geändert von mschnell am Mo 26. Dez 2011, 23:42, insgesamt 1-mal geändert.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Rendertarget einer Fremdanwendung "einfangen"

Beitrag von MAC »

Wie windows das mit der Vorschau macht kann ich nicht genau sagen, ich vermute aber das das ganze Bild gerendert wird und dann einfach einfach in die Vorschau gepresst wird. Da der Windows Desktop ja von der Grafikkarte Gezeichnet wird (oder liege ich hier falsch ? ) sollte das ja recht flott gehen.

Code: Alles auswählen

Signatur := nil;

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Rendertarget einer Fremdanwendung "einfangen"

Beitrag von MitjaStachowiak »

Bin leider erst nächstes Jahr wieder im Büro. Dann poste ich was.
Gut, dann mach' ich inzwischen ein Paar andere Sachen...

Wegen Windows-Desktop - es gibt da noch diese Funktion [Windows-Taste] + [Tab], die alle Fenster schräggestellt auflistet. Auf jeden fall habe ich gelesen, dass der neue Desktop zunehmend mit GPU-Unterstützung arbeitet (Deswegen geht ohne Grafiktreiber auch der Glass-Effekt nicht). Die Frage ist nur, wie kommt man an die Inhalte der Fenster ran.?

[Edit]
Also GetDC und BitBlt wäre ja der herkömliche Screenshot, aber hardwarebeschleunigte Inhalte sind damit schon mal schwarz...

Antworten