Erfassen von mehreren Bildschirmen, desktop-Bild mit Qt4
Schreibe ich ein screen-capture-Anwendung, die in Qt4 mit c++. Ich habe ein problem beim tuning auf zwei Bildschirme. Ich bin nicht in der Lage zu bekommen ein Bild mit dem zweiten Bild. Ich habe versucht, eine c# - Anwendung, und das wird schnappen Sie alle desktops in einem Bild konnte ich extrahieren von dort aus jeder Bildschirm-desktop-Bild.
Hier ist der c# - code
using System;
using System.Drawing;
using System.Runtime.InteropServices;
public class TestGrab
{
[STAThread]
static void Main(string[] args)
{
IntPtr hDC = WindowsNative.GetDC(WindowsNative.GetDesktopWindow());
IntPtr hBitmap = WindowsNative.GetCurrentObject(hDC,
WindowsNative.OBJ_BITMAP);
System.Drawing.Bitmap imageDesktop = System.Drawing.Image.FromHbitmap(
hBitmap);
imageDesktop.Save(@"c:\zzzzdesktop.png");
}
}
public class WindowsNative
{
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr ptr);
public const int OBJ_BITMAP = 7;
[DllImport("gdi32.dll")]
public static extern IntPtr GetCurrentObject(IntPtr hdc, uint
uiObjectType);
}
Den Qt-code ist kleiner,auch die, die ich getestet habe, wenn die native windows-handle zum desktop unterscheidet sich von der Qt-desktop0>winId (), aber Sie sind gleich
QPixmap CaptureWinDesktop()
{
WId desktop=GetDesktopWindow();
WId desktop2=QApplication::desktop()->winId();
if(desktop!=desktop2)
{
qDebug("sunt fdiferite WId");
}
QPixmap entireDesktop= QPixmap::grabWindow(desktop);
return entireDesktop;
}
Ich bin mir nicht sicher ob das ein bug in Qt ist, oder ein feature, mit dem gleichen Fenster-handle es wiederholt nur den ersten desktop, wenn in der Tat die desktop-es ist die Staffel aus der 2 Bildschirme . Eine Idee ist, die systemeigene windows-Anrufe und speichern Sie das Bild in einem temp-Datei und laden Sie ein QPixmap von dort, aber das ist nicht einfach so speichern Sie ein HBITMAP in eine Datei die in c++ ohne MFC.
Fazit: was denken Sie, ist das ein bug in Qt? irgendeine Idee, wie das zu umgehen(kein MFC )
- Auch ich fand ein Beispiel mit GDI experts-exchange.com/Microsoft/Development/Q_26484815.html ,schauen nach unten, die zahlen sind hart codiert, so dass Sie haben, um die Dimensionen und den code ändern
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe vor kurzem bemerkt das gleiche Problem.
Ich schließlich beschlossen, um die drop-Qt für die Aufnahme von Schnappschüssen. Eine weitere situation, in whic Qt breaks ist bei Verwendung des Aero-Designs von Windows Vista oder Windows 7. Dieses Thema anscheinend, dass alle Daten in einem hintergrund-Puffer, so dass alle screenshots, die von Qt sind alle schwarz.
Anstelle der Verwendung von Qt kann ich nur empfehlen, mit dem ScreenShooter Klasse wie beschrieben auf http://www.apriorit.com/our-experience/articles/9-sd-articles/193-multi-monitor-screenshot
können Sie zählen Bildschirme mit
QDesktopWidget::screenCount()
(Qt 4.6) und dann Reisen Sie durch alle Bildschirme und tunQPixmap::grabWindow(...)
Über "desktop-bestehend aus 2 screens". Es hängt alles davon ab, wenn 2 Bildschirm virtuell (alle Bildschirme behandelt, als ein Bildschirm ist) oder nicht.
@Frerich Raabe: es funktioniert auf Windows 7, ich benutze ähnlichen code zum ausführen-Bildschirm zu greifen.
Einen virtuellen desktop, der
QPixmap::grabWindow
Methode scheint zurück ein screenshot mit der Größe des primären Bildschirms. Vorbei in die Dimensionen der vollständigen virtuellen desktop gibt einen screenshot von beiden Monitoren;Noch testen, dieses Verhalten auf einem Unix /Mac box, aber es funktioniert unter Windows 7.
In einer multi-monitor-setup unter Windows die Monitore sind in der Regel trat in eine virtuelle desktop. Ich sage "normalerweise", weil ich bin mir nicht ganz sicher, was passiert, auf allen Windows-Versionen von XP SP0 (Oktober 25, 2001), um Win8 SP0 (Oktober 26, 2012). Aber, wie ein virtueller desktop, das bedeutet, dass
screen(x)
werden immer wieder die gleichen widget; von dem, was ich gesehen habe ist dies die einzige QDesktopWidget selbst. AllerdingsscreenGeometry(x)
zurückkehren wird, unterschiedliche Werte für die einzelnen aufgezählt monitor.Können Sie schnappen Sie sich den zweiten Bildschirm mit dem Ergebnis der
screenGeometry(x)
wie die Parameter QPixmap::grabWindow; ie:Dies ist arbeiten für mich jetzt, und ich bin zu der hand, die bauen den Weg zu meiner QA-team.