Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capture multiple screens desktop image using Qt4

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 )

like image 749
simion314 Avatar asked Oct 19 '10 08:10

simion314


2 Answers

you can count screens with QDesktopWidget::screenCount() (Qt 4.6) and then travel through all screens and do QPixmap::grabWindow(...)

About "desktop composed from 2 screens". It all depends if 2 screen is virtual (all screens treated as one screen) or not.

@Frerich Raabe: it works on Windows 7 as I'm using similar code to perform screen grab.

like image 128
Kamil Klimek Avatar answered Sep 21 '22 12:09

Kamil Klimek


I recently noticed the same issue.

I eventually decided to drop Qt for taking screenshots. Another situation in whic Qt breaks is when using the Aero theme of Windows Vista or Windows 7. This theme apparently renders all data into a background buffer, so all screenshots taken by Qt are all black.

Instead of using Qt I can recommend using the ScreenShooter class as described at http://www.apriorit.com/our-experience/articles/9-sd-articles/193-multi-monitor-screenshot

like image 33
Frerich Raabe Avatar answered Sep 20 '22 12:09

Frerich Raabe