Estoy escribiendo una aplicación de captura de pantalla en Qt4 con C++. Tengo un problema al sintonizar pantallas duales. No puedo obtener una imagen con la segunda pantalla. Probé una aplicación C# y eso tomará todos los escritorios en una imagen y podría extraer de allí cada imagen de escritorio en pantalla. Este es el código C#Capturar imagen de escritorio de pantallas múltiples usando Qt4
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);
}
El código Qt es más pequeño, también he probado si las ventanas nativas manejan en el escritorio es diferente de la Qt desktop0> winId(), pero ellos son iguales
QPixmap CaptureWinDesktop()
{
WId desktop=GetDesktopWindow();
WId desktop2=QApplication::desktop()->winId();
if(desktop!=desktop2)
{
qDebug("sunt fdiferite WId");
}
QPixmap entireDesktop= QPixmap::grabWindow(desktop);
return entireDesktop;
}
No estoy seguro si esto es un error en Qt o si es una característica, usando el mismo identificador de ventana reintenta solo el primer escritorio cuando de hecho el escritorio está compuesto por retransmisión de las 2 pantallas. Una idea es usar llamadas nativas de Windows y guardar la imagen en un archivo temporal y cargar un QPixmap desde allí, pero no es sencillo guardar un HBITMAP en un archivo en C++ sin MFC. Conclusión: ¿qué crees que es un error en Qt? alguna idea de cómo evitarlo (sin MFC)
También encontré un ejemplo usando GDI http: //www.experts-exchange.com/Microsoft/Development/Q_26484815.html, mira en la parte inferior, los números están codificados, por lo que tienes que obtener las dimensiones y modificar el código – simion314