获取特定窗口的屏幕截图 - C++ / Qt

10
在Qt中,我如何截取特定窗口的屏幕截图(例如,假设我打开了记事本,我想截取标题为“未命名-记事本”的窗口的屏幕截图)? 在他们的屏幕截图示例代码中,展示了如何截取整个桌面的屏幕截图。
originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());

如果我知道窗口的标题,如何获取特定窗口的winId()在Qt中?

谢谢

5个回答

6

我相信这是平台特定的。在Windows上,winIds是HWNDs,因此您可以在您给出的示例中调用FindWindow(NULL, "Untitled - Notepad")


2

看看 QDesktopWidget 类。它继承自 QWidget,因此没有任何问题可以截屏:

QPixmap pm(QDesktopWidget::screenGeometry().size());
QDesktopWidget::screen().render(&pm); // pm now contains screenshot

1
对于版本4.8,我需要对您的片段进行一些小修改。主要是:创建一个类型为QDesktopWidget的对象来调用screenGeometry()screen(),并将screen().render()更改为screen()->render(),因为screen()返回一个QWidget* - Adri C.S.

1

请查看示例截图

简而言之:

QScreen *screen = QGuiApplication::primaryScreen();
if (screen)
    QPixmap originalPixmap = screen->grabWindow(0);

这个答案不是关于“截取特定窗口的屏幕截图”的。这是关于截取整个屏幕的屏幕截图。 - Alok

1

还要看一下WindowFromPointEnumChildWindows。后者可以让您提示用户消除歧义,如果您有多个具有相同标题的窗口。


-1

虽然这个问题已经有了答案,但为了完整起见,我会在Trevor Boyd Smith的帖子(请参见上文)中添加一个代码片段示例:

void MainWindow::on_myButton_GUI_Screeshot_clicked()
{
    QPixmap qPixMap = QPixmap::grabWidget(this);  // *this* is window pointer, the snippet     is in the mainwindow.cpp file

    QImage qImage = qPixMap.toImage();

    cv::Mat GUI_SCREENSHOT = cv::Mat(         qImage.height(),
                                              qImage.width(), CV_8UC4,
                                      (uchar*)qImage.bits(),
                                              qImage.bytesPerLine()  );

    cv::imshow("GUI_SCREENSHOT",GUI_SCREENSHOT);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接