screenshot



  • Hey,

    ich mach gerad mit meiner Applikation einen screenshot vom Display, allerdings werden nicht alle Objekte angezeigt.. Insbesondere die, die mit Alpha-Blending versehen sind wie zum Beispiel die Yahoo Widgets... Weiß einer, woran das liegt und wie ich diese objekte auch auf dem screenshot erhalte?

    gruß...



  • wie machst du des screenshot ?



  • Grahpics screen = Graphics.FromImage(...);
    screen.CopyFromScreen(...param...);

    und spaeter speicher ich den ueber ein Image ab...



  • Alle Applikationen, die direkt in den Backbuffer schreiben, wie z.B. Windows Media Player beim Abspielen von Videos kannst du mit der einfachen CopyFromScreen-Methode nicht erfassen. Such mal am besten nach "Screenshot Backbuffer"... (es gibt dafür Lösungen, allerdings sind sie komplexer und evtl. auch nur mit C bzw. C++ lösbar).



  • das waer nicht das problem, wenn die sachen nur in C oder C++ loesbar sind... hat da jemand ein bsp? andere schreiben ja auch da rein, also muss man den doch auch irgendwie auslesen koennen...tightvnc zum bsp greift nicht auf den backbuffer zu!!!



  • hm, so wie ich das sehe, wird das Problematisch...

    die üblichen Methoden greifen auf den Arbeitsspeicher zu, um sich dort das vom CPU berechnete Bild zu holen. Einige Anwendungen sparen sich aber diesen Umweg und gehen direkt auf die Grafikkarte. Und da muss man es erst mal wieder rausbringen

    Auf die Schnelle hab ich aber keine Lösungsmöglichkeit gefunden, sowas selbst zu implementieren. Außer diversen Tipps, die Hardwarebeschleunigung der betroffenen Anwendung zu deaktivieren oder sich Software herunterzuladen, die das macht -.-



  • Wuerde es mich denn weiter bringen, wenn ich dsa Handle auf das Fenster besitzen wuerde? Also ueber GetForegroundWindow() kann ich auf das Handle zugreifen, nun muesste ich noch die moeglichkeit haben, die Ausgabe des Fensters auf mich umzulenken. Gibts da eine Moeglichkeit oder evtl einen anderen Ansatz?

    Eine andere Methode ist die "Printscreen" bzw. (Alt-)Druck-Taste Methode, bei der ich entweder das aktive Fenster oder den gesamten Desktop in die Zwischenablage kopieren kann. Allerdings gefaellt mir hierbei die Performance nicht, dass ich das gesamte Bild zerschneiden muesste oder ich staendig den Focus des Fensters aendern muesste... Irgendwie nervt das doch!



  • klappt den der Screenshot über die Druck-Taste so wie gewünscht?



  • Ja! Der funktioniert und liefert auch die overlayed fenster!



  • dann liegt es an was anderem, dass sie nicht erscheinen. Besagtes Problem tritt vor allem z.B. beim Windows Media Player auf. Während der CPU nur eine schwarze Fläche berechnen muss, kommt das Bild des Videos von der Grafikkarte und wird daher beim Screenshot nicht erfasst
    (Es sei denn, neuere Betriebssysteme haben da Fortschritte gemacht)

    Entweder, der Fehler liegt in deinem Code oder es scheint an was anderem zu hapern. So oder so wär ein wenig Code nicht schlecht

    -edit-

    schon versucht? http://www.geekpedia.com/tutorial181_Capturing-screenshots-using-Csharp.html



  • ja hab ich, und da kommt nichts raus 😞

    RECT size = new RECT();
    GetClientRect((IntPtr)handle, out size);
    Bitmap test = new Bitmap(size.Right, size.Bottom);          
    IntPtr hdcScreen = CreateDC("Display", null, null, (IntPtr)handle);
    
    if (System.IO.File.Exists("C:\\test.bmp") == false)
    {
        int cr;
        int x;
        int y;
        for (x = 0; x < size.Right; x++)
            for (y = 0; y < size.Bottom; y++)
            {
                cr = GetPixel(hdcScreen , x , y);
                Color color = Color.FromArgb((cr & 0x000000FF), (cr & 0x0000FF00) >> 8, (cr & 0x00FF0000) >> 16);
                test.SetPixel(x, y, color);
            }
        test.Save(@"c:\\test.bmp");
        Console.WriteLine("Done");
    
    DeleteDC(hdcScreen);
    

    Das "handle" ist das getForegroundWindow-Handle...



  • @escapete:
    Du hast da ein Problem mit Overlays, und das scheinst du nicht so ganz zu verstehen.
    Das Bild eines Overlays ist eben *nicht* im Fenster drinnen. Im Fenster drinnen ist nur die Key-Color, und die Grafikkarte blendet dann mit Hilfe ihrer Overlay-Hardware statt der Key-Color das Videobild ein. Das passiert während die Bilddaten zum Monitor geschickt werden.
    Ein Overlay muss z.B. schonmal nicht im selben Farbformat vorliegen wie der Desktop. Angenommen der Desktop wäre 16 Bit, dann kann das Overlay trotzdem 24 Bit haben.

    Die "fertige" Version, also inklusive dem Video, liegt aber nirgends vor, und kann deswegen auch nicht so einfach "abgegriffen" werden.

    Vielleicht gibt es irgendwelche "Tricks" mittels derer man den Grafikkarten-Treiber bitten kann, einen Screenshot zu machen, der alle Overlays beinhaltet.

    Über irgendwelche Window-Handles/GDI-Funktionen wird es aber wohl nicht gehen. Diese werden immer nur die Overlay-Key-Color (oft ein fast schwarzes Lila) "anzeigen"/zurückgeben.



  • Also normalerweise kann doch eine Grafikkarte nur ein Overlay darstellen, richtig? Das bedeutet wenn das Video laeuft und ich eine andere Anwendung capturen moechte, sollte das Funktionieren, richtig?
    Ich hab mal ein Screenshot gemacht, von der Anwendung die ich bsp. capturen moechte:

    http://www.bildercache.de/bild/20090826-074257-103.png

    Dabei gehts nicht um das Video, sondern um die Anwendung die auf dem VLC liegt...

    Ich denke, an die Daten muesste ich doch irgendwie kommen koennen, oder?



  • Moment, versteh ich das richtig, dass du die Yahoo-Widgets dadurch capturen willst, indem du das darunterliegende Fenster aufnimmst?



  • Nein! Ich versuche das Yahoo Widget zu capturen indem ich das Yahoo Widget capturen moechte... Das Bild war nur eine Wiederlegung bzw. des vorherigen Eintrags von hustbaer bzgl. des Videos!

    Also ich will dieses Yahoo Widget capturen. Und anscheinend ist das ja kein Overlay, also muss ich das doch irgendwie capturen koennen, oder?


Anmelden zum Antworten