Capture multiple screens desktop image using Qt4

后端 未结 4 1301
小鲜肉
小鲜肉 2021-02-06 11:49

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# applica

相关标签:
4条回答
  • 2021-02-06 12:37

    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.

    0 讨论(0)
  • 2021-02-06 12:47

    With a virtual desktop, the QPixmap::grabWindow method seems to return a screenshot with the size of the primary screen. Passing in the dimensions of the full virtual desktop returns a screenshot of both monitors;

      QDesktopWidget *desktop = QApplication::desktop();
      QPixmap screenshot = QPixmap::grabWindow(desktop->winId(), 0, 0, desktop->width(), desktop->height());
    

    Yet to test this behaviour on a Unix / Mac box, but it works under Windows 7.

    0 讨论(0)
  • 2021-02-06 12:48

    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

    0 讨论(0)
  • 2021-02-06 12:49

    In a multi-monitor setup on Windows, the monitors are usually joined into a virtual desktop. I say "usually" because I'm not entirely sure what happens on all the Windows versions from XP SP0 (October 25, 2001) to Win8 SP0 (October 26, 2012). But, as a virtual desktop, that means that screen(x) will always return the same widget; from what I've seen this is the one and only QDesktopWidget itself. However, screenGeometry(x) will return different values for each enumerated monitor.

    You can grab the second screen by using the result of screenGeometry(x) as the parameters to QPixmap::grabWindow; ie:

    QDesktopWidget* desktop = QApplication::desktop();
    WId wid = desktop->winId();
    QRect geo = desktop->screenGeometry(indexOfTheMonitorYouWant);
    QPixmap cap = QPixmap::grabWindow(wid, geo.left(), geo.top(), geo.width(), geo.height());
    

    This is working for me right now, and I'm about to hand the build off to my QA team.

    0 讨论(0)
提交回复
热议问题