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 mitQPixmap 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 duQ_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.