i am writing a screen capture application in Qt4 with c++. I have a problem when tuning on dual screens. I am unable to get an image with the second screen. I tried a c# application and that will grab all the desktops in one image and i could extract from there each screen desktop image. Here is the 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);
}
The Qt code is smaller,also i tested if the native windows handle to the desktop is different from the Qt desktop0>winId() but them are equal
QPixmap CaptureWinDesktop()
{
WId desktop=GetDesktopWindow();
WId desktop2=QApplication::desktop()->winId();
if(desktop!=desktop2)
{
qDebug("sunt fdiferite WId");
}
QPixmap entireDesktop= QPixmap::grabWindow(desktop);
return entireDesktop;
}
I am not sure if this is a bug in Qt or is a feature, using the same window handle it retries only the first desktop when in fact the desktop it is relay composed from the 2 screens . One idea is to use native windows calls and save the image in a temp file and load a QPixmap from there, but that is not simple to save a HBITMAP in a file in c++ without MFC. Conclusion: what do you think is that a bug in Qt? any idea how to work around it(no MFC )