Qt - Programm zum Erstellen von Screenshots



  • Hallo,
    ich habe hier ein kleines Qt-Programm, mit dem ich Screenshots erstellen können will. Momentan kann ich mit

    QPixmap pic = QPixmap::grabWindow(QApplication::desktop()->winId());
    

    den kompletten Desktop abbilden, allerdings hat das schon sein Ende, wenn ich z.B. Screenshots in einer DirectX/OpenGL-Anwendung machen möchte (z.B. in einem Spiel). In diesem Fall wird mir auch nur der Desktop im Hintergrund "abfotografiert".
    Gibt es eine Möglichkeit
    a) auch in diesen Fällen Screenshots zu erstellen und
    b) die winId() von diversen Prozessen des Systems herauszubekommen, damit ich GENAU diese per Screenshot aufnehmen kann? Die Prozesse starte ich übrigens selbst per QProcess (ich hatte gehofft, dass ich damit an besagte winID() kommen würde, habe es allerdings noch nicht geschafft).

    Für Hilfe schon im Voraus vielen Danke :).



  • Ich habe noch eine Weile in der Qt-Dokumenation geblättert und bin hierauf gestoßen:
    QGLWidget::grabFrameBuffer
    Leider funktioniert auch das noch nicht wie gewünscht, ich erhalte stets nur schwarze Bilder mit einem Seitenverhältnis von 10:3.
    Hier noch mein zugehöriger Code:

    QGLWidget * gl = new QGLWidget(this);
    QPixmap pic = pic.fromImage(gl->grabFrameBuffer(true));
    

    Kennt sich denn niemand hier mit sowas aus? 😕



  • Stiefel2000 schrieb:

    Ich habe noch eine Weile in der Qt-Dokumenation geblättert und bin hierauf gestoßen:
    QGLWidget::grabFrameBuffer
    Leider funktioniert auch das noch nicht wie gewünscht, ich erhalte stets nur schwarze Bilder mit einem Seitenverhältnis von 10:3.
    Hier noch mein zugehöriger Code:

    QGLWidget * gl = new QGLWidget(this);
    QPixmap pic = pic.fromImage(gl->grabFrameBuffer(true));
    

    Kennt sich denn niemand hier mit sowas aus? 😕

    Ich denke das funktioniert auch nur für das GLWidget was du erstellst. Die meisten Spiele unter Windows nutzen DirectX, da hilft dir das OpenGL-Kram nicht weiter.

    Außerdem könnte es generell schwierig werden Screenshots von Spielen zu machen, da diese die Grafiken direkt auf die Grafikhardware rendern, ohne den Umweg über Windows/Fenster.
    Innerhalb der Games ist das kein Problem, da ziehst du dir einfach einen Screen vom Direct3D-Device.



  • Ok, danke soweit für die Information. Aber ich hoffe noch immer, dass ich irgendwie Screenshots erstellen kann.
    Die zweite Frage ist auch noch völlig ungeklärt - kann man die winID von fremden Prozessen herausbekommen, um praktisch nur das entsprechende Fenster per grabWindow() zu erfassen?



  • nun, mit QProcess::pid() bekommst du Q_PID . Unter Windows ist das ein typedef auf _PROCESS_INFORMATION* .

    Dieses Struct enthält den Prozesshandle. Jetzt musst du nur noch eine Möglichkeit kommen, von dem Handle eines Prozesses (bzw. dessen Thread) auf das zugehörige HWND zu kommen. Das hat aber mit Qt nichts zu tun und gehört eher zur WinAPI



  • WinAPI bringt leider nichts, das Programm soll portabel bleiben.


Anmelden zum Antworten